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