|
|
@ -1,16 +1,19 @@ |
|
|
|
use std::sync::Arc; |
|
|
|
use std::sync::Arc; |
|
|
|
use tdn::types::{ |
|
|
|
use tdn::types::{ |
|
|
|
group::GroupId, |
|
|
|
group::GroupId, |
|
|
|
|
|
|
|
message::SendMessage, |
|
|
|
primitive::HandleResult, |
|
|
|
primitive::HandleResult, |
|
|
|
rpc::{json, RpcError, RpcHandler, RpcParam}, |
|
|
|
rpc::{json, rpc_response, RpcError, RpcHandler, RpcParam}, |
|
|
|
}; |
|
|
|
}; |
|
|
|
use tdn_did::{generate_btc_account, generate_eth_account}; |
|
|
|
use tdn_did::{generate_btc_account, generate_eth_account}; |
|
|
|
|
|
|
|
use tdn_storage::local::DStorage; |
|
|
|
|
|
|
|
use tokio::sync::mpsc::{error::SendError, Sender}; |
|
|
|
use web3::signing::Key; |
|
|
|
use web3::signing::Key; |
|
|
|
|
|
|
|
|
|
|
|
use crate::{rpc::RpcState, storage::wallet_db}; |
|
|
|
use crate::{rpc::RpcState, storage::wallet_db}; |
|
|
|
|
|
|
|
|
|
|
|
use super::{ |
|
|
|
use super::{ |
|
|
|
models::{Address, ChainToken}, |
|
|
|
models::{Address, ChainToken, Network}, |
|
|
|
ETH_NODE, |
|
|
|
ETH_NODE, |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
@ -23,6 +26,48 @@ fn wallet_list(devices: Vec<Address>) -> RpcParam { |
|
|
|
json!(results) |
|
|
|
json!(results) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async fn loop_token( |
|
|
|
|
|
|
|
sender: Sender<SendMessage>, |
|
|
|
|
|
|
|
_db: DStorage, |
|
|
|
|
|
|
|
gid: GroupId, |
|
|
|
|
|
|
|
network: Network, |
|
|
|
|
|
|
|
address: String, |
|
|
|
|
|
|
|
) -> std::result::Result<(), SendError<SendMessage>> { |
|
|
|
|
|
|
|
// loop get balance of all tokens.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
match network { |
|
|
|
|
|
|
|
Network::EthMain => { |
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
Network::EthTestRopsten => {} |
|
|
|
|
|
|
|
Network::EthTestRinkeby => {} |
|
|
|
|
|
|
|
Network::EthTestKovan => {} |
|
|
|
|
|
|
|
Network::EthLocal => {} |
|
|
|
|
|
|
|
Network::BtcMain => {} |
|
|
|
|
|
|
|
Network::BtcLocal => {} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let transport = web3::transports::Http::new(ETH_NODE).unwrap(); |
|
|
|
|
|
|
|
let web3 = web3::Web3::new(transport); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let balance = web3 |
|
|
|
|
|
|
|
.eth() |
|
|
|
|
|
|
|
.balance(address.parse().unwrap(), None) |
|
|
|
|
|
|
|
.await |
|
|
|
|
|
|
|
.unwrap(); |
|
|
|
|
|
|
|
println!("Balance of {:?}: {}", address, balance); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let res = rpc_response( |
|
|
|
|
|
|
|
0, |
|
|
|
|
|
|
|
"wallet-balance", |
|
|
|
|
|
|
|
json!([address, network.to_i64(), balance]), |
|
|
|
|
|
|
|
gid, |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
sender.send(SendMessage::Rpc(0, res, true)).await?; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ok(()) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
pub(crate) fn new_rpc_handler(handler: &mut RpcHandler<RpcState>) { |
|
|
|
pub(crate) fn new_rpc_handler(handler: &mut RpcHandler<RpcState>) { |
|
|
|
handler.add_method("wallet-echo", |_, params, _| async move { |
|
|
|
handler.add_method("wallet-echo", |_, params, _| async move { |
|
|
|
Ok(HandleResult::rpc(json!(params))) |
|
|
|
Ok(HandleResult::rpc(json!(params))) |
|
|
@ -78,28 +123,19 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler<RpcState>) { |
|
|
|
|
|
|
|
|
|
|
|
handler.add_method( |
|
|
|
handler.add_method( |
|
|
|
"wallet-balance", |
|
|
|
"wallet-balance", |
|
|
|
|_gid: GroupId, params: Vec<RpcParam>, _state: Arc<RpcState>| async move { |
|
|
|
|gid: GroupId, params: Vec<RpcParam>, state: Arc<RpcState>| async move { |
|
|
|
let ctoken = ChainToken::from_i64(params[0].as_i64().ok_or(RpcError::ParseError)?); |
|
|
|
let network = Network::from_i64(params[0].as_i64().ok_or(RpcError::ParseError)?); |
|
|
|
let address = params[0].as_str().ok_or(RpcError::ParseError)?; |
|
|
|
let address = params[1].as_str().ok_or(RpcError::ParseError)?.to_owned(); |
|
|
|
|
|
|
|
println!("start wallet balances"); |
|
|
|
match ctoken { |
|
|
|
|
|
|
|
ChainToken::ETH => { |
|
|
|
let group_lock = state.group.read().await; |
|
|
|
let transport = web3::transports::Http::new(ETH_NODE).unwrap(); |
|
|
|
let db = wallet_db(group_lock.base(), &gid)?; |
|
|
|
let web3 = web3::Web3::new(transport); |
|
|
|
let sender = group_lock.sender(); |
|
|
|
|
|
|
|
drop(group_lock); |
|
|
|
let balance = web3 |
|
|
|
|
|
|
|
.eth() |
|
|
|
tokio::spawn(loop_token(sender, db, gid, network, address)); |
|
|
|
.balance(address.parse().unwrap(), None) |
|
|
|
|
|
|
|
.await |
|
|
|
|
|
|
|
.unwrap(); |
|
|
|
|
|
|
|
println!("Balance of {:?}: {}", address, balance); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
ChainToken::ERC20 => {} |
|
|
|
|
|
|
|
ChainToken::ERC721 => {} |
|
|
|
|
|
|
|
_ => {} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ok(HandleResult::rpc(json!(params))) |
|
|
|
Ok(HandleResult::new()) |
|
|
|
}, |
|
|
|
}, |
|
|
|
); |
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|