sui_indexer_alt_jsonrpc/api/
write.rsuse fastcrypto::encoding::Base64;
use jsonrpsee::{core::RpcResult, http_client::HttpClient, proc_macros::rpc};
use sui_json_rpc_types::{
DryRunTransactionBlockResponse, SuiTransactionBlockResponse, SuiTransactionBlockResponseOptions,
};
use sui_open_rpc::Module;
use sui_open_rpc_macros::open_rpc;
use sui_types::quorum_driver_types::ExecuteTransactionRequestType;
use crate::{
config::NodeConfig,
error::{client_error_to_error_object, invalid_params},
};
use super::rpc_module::RpcModule;
#[open_rpc(namespace = "sui", tag = "Write API")]
#[rpc(server, client, namespace = "sui")]
pub trait WriteApi {
#[method(name = "executeTransactionBlock")]
async fn execute_transaction_block(
&self,
tx_bytes: Base64,
signatures: Vec<Base64>,
options: Option<SuiTransactionBlockResponseOptions>,
request_type: Option<ExecuteTransactionRequestType>,
) -> RpcResult<SuiTransactionBlockResponse>;
#[method(name = "dryRunTransactionBlock")]
async fn dry_run_transaction_block(
&self,
tx_bytes: Base64,
) -> RpcResult<DryRunTransactionBlockResponse>;
}
pub(crate) struct Write(pub HttpClient);
#[derive(Debug, thiserror::Error)]
pub enum Error {
#[error("WaitForLocalExecution mode is deprecated")]
DeprecatedWaitForLocalExecution,
}
impl Write {
pub fn new(fullnode_rpc_url: url::Url, config: NodeConfig) -> anyhow::Result<Self> {
let client = config.client(fullnode_rpc_url)?;
Ok(Self(client))
}
}
#[async_trait::async_trait]
impl WriteApiServer for Write {
async fn execute_transaction_block(
&self,
tx_bytes: Base64,
signatures: Vec<Base64>,
options: Option<SuiTransactionBlockResponseOptions>,
request_type: Option<ExecuteTransactionRequestType>,
) -> RpcResult<SuiTransactionBlockResponse> {
if let Some(ExecuteTransactionRequestType::WaitForLocalExecution) = request_type {
return Err(invalid_params(Error::DeprecatedWaitForLocalExecution).into());
}
self.0
.execute_transaction_block(tx_bytes, signatures, options, request_type)
.await
.map_err(client_error_to_error_object)
}
async fn dry_run_transaction_block(
&self,
tx_bytes: Base64,
) -> RpcResult<DryRunTransactionBlockResponse> {
self.0
.dry_run_transaction_block(tx_bytes)
.await
.map_err(client_error_to_error_object)
}
}
impl RpcModule for Write {
fn schema(&self) -> Module {
WriteApiOpenRpc::module_doc()
}
fn into_impl(self) -> jsonrpsee::RpcModule<Self> {
self.into_rpc()
}
}