1use crate::{
4 api::Namespace,
5 helpers::{self, CallFuture},
6 types::{Bytes, H256},
7 Transport,
8};
9
10#[derive(Debug, Clone)]
12pub struct Web3<T> {
13 transport: T,
14}
15
16impl<T: Transport> Namespace<T> for Web3<T> {
17 fn new(transport: T) -> Self
18 where
19 Self: Sized,
20 {
21 Web3 { transport }
22 }
23
24 fn transport(&self) -> &T {
25 &self.transport
26 }
27}
28
29impl<T: Transport> Web3<T> {
30 pub fn client_version(&self) -> CallFuture<String, T::Out> {
32 CallFuture::new(self.transport.execute("web3_clientVersion", vec![]))
33 }
34
35 pub fn sha3(&self, bytes: Bytes) -> CallFuture<H256, T::Out> {
37 let bytes = helpers::serialize(&bytes);
38 CallFuture::new(self.transport.execute("web3_sha3", vec![bytes]))
39 }
40}
41
42#[cfg(test)]
43mod tests {
44 use super::Web3;
45 use crate::{api::Namespace, rpc::Value, types::H256};
46 use hex_literal::hex;
47
48 rpc_test! (
49 Web3:client_version => "web3_clientVersion";
50 Value::String("Test123".into()) => "Test123"
51 );
52
53 rpc_test! (
54 Web3:sha3, hex!("01020304")
55 =>
56 "web3_sha3", vec![r#""0x01020304""#];
57 Value::String("0x0000000000000000000000000000000000000000000000000000000000000123".into()) => H256::from_low_u64_be(0x123)
58 );
59}