128 lines
3.6 KiB
Rust
Raw Normal View History

2024-12-05 13:05:58 +02:00
use accounts::account_core::Account;
use anyhow::Result;
2025-02-05 12:24:09 +02:00
use common::{SequencerClientError, SequencerRpcError};
2025-02-14 10:58:54 +02:00
use json::{SendTxRequest, SendTxResponse, SequencerRpcRequest, SequencerRpcResponse};
2024-12-05 13:05:58 +02:00
use k256::elliptic_curve::group::GroupEncoding;
use reqwest::Client;
2025-02-09 11:46:08 -05:00
use rpc_primitives::requests::{
GetBlockDataRequest, GetBlockDataResponse, GetGenesisIdRequest, GetGenesisIdResponse,
RegisterAccountRequest, RegisterAccountResponse,
};
2024-12-05 13:05:58 +02:00
use serde_json::Value;
use storage::transaction::Transaction;
2024-12-03 09:32:35 +02:00
use crate::config::NodeConfig;
pub mod json;
2024-12-05 13:05:58 +02:00
#[derive(Clone)]
2024-12-03 09:32:35 +02:00
pub struct SequencerClient {
pub client: reqwest::Client,
pub config: NodeConfig,
}
2024-12-05 13:05:58 +02:00
impl SequencerClient {
pub fn new(config: NodeConfig) -> Result<Self> {
Ok(Self {
client: Client::builder()
//Add more fiedls if needed
.timeout(std::time::Duration::from_secs(60))
.build()?,
config,
})
}
pub async fn call_method_with_payload(
&self,
method: &str,
payload: Value,
) -> Result<Value, SequencerClientError> {
let request = SequencerRpcRequest::from_payload_version_2_0(method.to_string(), payload);
let call_builder = self.client.post(&self.config.sequencer_addr);
let call_res = call_builder.json(&request).send().await?;
let response_vall = call_res.json::<Value>().await?;
if let Ok(response) = serde_json::from_value::<SequencerRpcResponse>(response_vall.clone())
{
Ok(response.result)
} else {
let err_resp = serde_json::from_value::<SequencerRpcError>(response_vall)?;
2024-12-05 13:05:58 +02:00
Err(err_resp.into())
}
2024-12-05 13:05:58 +02:00
}
pub async fn get_block(
&self,
block_id: u64,
) -> Result<GetBlockDataResponse, SequencerClientError> {
let block_req = GetBlockDataRequest { block_id };
let req = serde_json::to_value(block_req)?;
let resp = self.call_method_with_payload("get_block", req).await?;
let resp_deser = serde_json::from_value(resp)?;
Ok(resp_deser)
}
pub async fn send_tx(
&self,
transaction: Transaction,
2025-01-24 09:10:42 +02:00
tx_roots: [[u8; 32]; 3],
2024-12-05 13:05:58 +02:00
) -> Result<SendTxResponse, SequencerClientError> {
2025-01-24 09:10:42 +02:00
let tx_req = SendTxRequest {
transaction,
tx_roots,
};
2024-12-05 13:05:58 +02:00
let req = serde_json::to_value(tx_req)?;
let resp = self.call_method_with_payload("send_tx", req).await?;
let resp_deser = serde_json::from_value(resp)?;
Ok(resp_deser)
}
pub async fn register_account(
&self,
account: &Account,
) -> Result<RegisterAccountResponse, SequencerClientError> {
let acc_req = RegisterAccountRequest {
nullifier_public_key: account.key_holder.nullifer_public_key.to_bytes().to_vec(),
viewing_public_key: account.key_holder.viewing_public_key.to_bytes().to_vec(),
address: account.address,
};
let req = serde_json::to_value(acc_req)?;
let resp = self
.call_method_with_payload("register_account", req)
.await?;
let resp_deser = serde_json::from_value(resp)?;
Ok(resp_deser)
}
pub async fn get_genesis_id(&self) -> Result<GetGenesisIdResponse, SequencerClientError> {
let genesis_req = GetGenesisIdRequest {};
let req = serde_json::to_value(genesis_req).unwrap();
2024-12-05 13:05:58 +02:00
2024-12-30 09:10:04 +02:00
let resp = self
.call_method_with_payload("get_genesis", req)
.await
.unwrap();
2024-12-05 13:05:58 +02:00
let resp_deser = serde_json::from_value(resp).unwrap();
2024-12-05 13:05:58 +02:00
Ok(resp_deser)
}
}