ic_web3/api/
web3.rs

1//! `Web3` namespace
2
3use crate::{
4    api::Namespace,
5    helpers::{self, CallFuture},
6    types::{Bytes, H256},
7    Transport,
8};
9
10/// `Web3` namespace
11#[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    /// Returns client version
31    pub fn client_version(&self) -> CallFuture<String, T::Out> {
32        CallFuture::new(self.transport.execute("web3_clientVersion", vec![]))
33    }
34
35    /// Returns sha3 of the given data
36    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}