# hotmint-api
[](https://crates.io/crates/hotmint-api)
[](https://docs.rs/hotmint-api)
JSON-RPC API server for the [Hotmint](https://github.com/rust-util-collections/hotmint) BFT consensus framework.
Provides a TCP-based, newline-delimited JSON-RPC server for querying node status and submitting transactions to the mempool.
## RPC Methods
| `status` | Query node status (view, height, mempool size) | `StatusInfo` |
| `submit_tx` | Submit a hex-encoded transaction | `TxResult { accepted: bool }` |
## Usage
### Start the Server
```rust
use std::sync::Arc;
use tokio::sync::watch;
use hotmint_mempool::Mempool;
use hotmint_api::rpc::{RpcServer, RpcState};
let mempool = Arc::new(Mempool::default());
let (status_tx, status_rx) = watch::channel((0u64, 0u64, 0u64, 4usize));
use std::sync::{Arc as StdArc, RwLock};
use hotmint_consensus::store::MemoryBlockStore;
use hotmint_consensus::engine::SharedBlockStore;
let store: SharedBlockStore =
StdArc::new(RwLock::new(Box::new(MemoryBlockStore::new())));
let (_peer_tx, peer_info_rx) = watch::channel(vec![]);
let rpc_state = RpcState {
validator_id: 0,
mempool: mempool.clone(),
status_rx,
store,
peer_info_rx,
};
let server = RpcServer::bind("127.0.0.1:26657", rpc_state).await.unwrap();
println!("RPC listening on {}", server.local_addr());
tokio::spawn(async move { server.run().await });
```
### Update Status from Application
```rust
use hotmint_consensus::application::Application;
struct MyApp {
status_tx: watch::Sender<(u64, u64, u64, usize)>,
}
impl Application for MyApp {
fn on_commit(&self, block: &hotmint_types::Block, ctx: &hotmint_types::context::BlockContext) -> ruc::Result<()> {
let _ = self.status_tx.send((
block.view.as_u64(),
block.height.as_u64(),
ctx.epoch.as_u64(),
ctx.validator_set.validator_count(),
));
Ok(())
}
}
```
### Client Examples
```bash
# query status
# submit transaction (hex-encoded, bare string in params)
echo '{"method":"submit_tx","params":"deadbeef","id":2}' | nc 127.0.0.1 26657
# => {"result":{"accepted":true},...}
```
## Types
```rust
pub struct RpcRequest { pub method: String, pub params: Value, pub id: u64 }
pub struct RpcResponse { pub result: Option<Value>, pub error: Option<RpcError>, pub id: u64 }
pub struct RpcError { pub code: i32, pub message: String }
pub struct StatusInfo { pub validator_id: u64, pub current_view: u64, pub last_committed_height: u64, pub mempool_size: usize }
pub struct TxResult { pub accepted: bool }
```
## License
GPL-3.0-only