Add endpoint for providing a PoW solution

This commit is contained in:
sword-smith 2025-08-21 09:10:40 +02:00
parent 1d8aa52902
commit 5c81a94487
3 changed files with 43 additions and 0 deletions

View File

@ -1,5 +1,6 @@
use anyhow::Context;
use axum::routing::get;
use axum::routing::post;
use axum::routing::Router;
use neptune_explorer::alert_email;
use neptune_explorer::html::page::block::block_page;
@ -12,6 +13,7 @@ use neptune_explorer::neptune_rpc;
use neptune_explorer::rpc::block_digest::block_digest;
use neptune_explorer::rpc::block_info::block_info;
use neptune_explorer::rpc::pow_puzzle::pow_puzzle;
use neptune_explorer::rpc::provide_pow_solution::provide_pow_solution;
use neptune_explorer::rpc::utxo_digest::utxo_digest;
use tower_http::services::ServeDir;
use tracing::info;
@ -55,6 +57,7 @@ pub fn setup_routes(app_state: AppState) -> Router {
.route("/rpc/block_digest/*selector", get(block_digest))
.route("/rpc/utxo_digest/:index", get(utxo_digest))
.route("/rpc/pow_puzzle/*address", get(pow_puzzle))
.route("/rpc/provide_pow_solution", post(provide_pow_solution))
// -- Dynamic HTML pages --
.route("/", get(root))
.route("/block/*selector", get(block_page))

View File

@ -1,4 +1,5 @@
pub mod block_digest;
pub mod block_info;
pub mod pow_puzzle;
pub mod provide_pow_solution;
pub mod utxo_digest;

View File

@ -0,0 +1,39 @@
use crate::http_util::rpc_err;
use crate::http_util::rpc_method_err;
use crate::model::app_state::AppState;
use axum::extract::State;
use axum::response::Json;
use axum::response::Response;
use neptune_cash::models::blockchain::block::block_header::BlockPow;
use neptune_cash::prelude::twenty_first::tip5::Digest;
use serde::Deserialize;
use serde::Serialize;
use std::sync::Arc;
use tarpc::context;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PowSolution {
pow: BlockPow,
proposal_id: Digest,
}
#[axum::debug_handler]
pub async fn provide_pow_solution(
State(state): State<Arc<AppState>>,
Json(payload): Json<PowSolution>,
) -> Result<Json<bool>, Response> {
let s = state.load();
let result = s
.rpc_client
.provide_pow_solution(
context::current(),
s.token(),
payload.pow,
payload.proposal_id,
)
.await
.map_err(rpc_err)?
.map_err(rpc_method_err)?;
Ok(Json(result))
}