Skip to content

Commit ce13e06

Browse files
committed
Added pooled user commands graphql endpoint
1 parent 15eb933 commit ce13e06

File tree

13 files changed

+229
-75
lines changed

13 files changed

+229
-75
lines changed

node/common/src/service/rpc/mod.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ use node::rpc::{
1212
RpcDiscoveryBoostrapStatsResponse, RpcDiscoveryRoutingTableResponse, RpcGetBlockResponse,
1313
RpcHealthCheckResponse, RpcHeartbeatGetResponse, RpcLedgerAccountsResponse,
1414
RpcLedgerSlimAccountsResponse, RpcMessageProgressResponse, RpcPeersGetResponse,
15-
RpcReadinessCheckResponse, RpcRequest, RpcStateGetError, RpcStatusGetResponse,
16-
RpcTransactionInjectResponse, RpcTransactionPoolResponse, RpcTransactionStatusGetResponse,
17-
RpcTransitionFrontierUserCommandsResponse,
15+
RpcPooledUserCommandsResponse, RpcReadinessCheckResponse, RpcRequest, RpcStateGetError,
16+
RpcStatusGetResponse, RpcTransactionInjectResponse, RpcTransactionPoolResponse,
17+
RpcTransactionStatusGetResponse, RpcTransitionFrontierUserCommandsResponse,
1818
};
1919
use serde::{Deserialize, Serialize};
2020

@@ -309,6 +309,7 @@ impl node::rpc_effectful::RpcService for NodeService {
309309
);
310310
rpc_service_impl!(respond_transaction_status, RpcTransactionStatusGetResponse);
311311
rpc_service_impl!(respond_block_get, RpcGetBlockResponse);
312+
rpc_service_impl!(respond_pooled_user_commands, RpcPooledUserCommandsResponse);
312313
}
313314

314315
#[cfg(test)]

node/native/src/graphql/block.rs

Lines changed: 53 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use crate::graphql::zkapp::{GraphQLFailureReason, GraphQLFeePayer, GraphQLZkappCommand};
22
use juniper::{GraphQLEnum, GraphQLObject};
33
use mina_p2p_messages::v2::{
4-
MinaBaseSignedCommandPayloadBodyStableV2, MinaBaseStakeDelegationStableV2,
5-
TransactionSnarkWorkTStableV2,
4+
MinaBaseSignedCommandPayloadBodyStableV2, MinaBaseSignedCommandStableV2,
5+
MinaBaseStakeDelegationStableV2, TransactionSnarkWorkTStableV2,
66
};
77
use openmina_core::block::AppliedBlock;
88

@@ -203,48 +203,7 @@ impl TryFrom<mina_p2p_messages::v2::StagedLedgerDiffDiffDiffStableV2> for GraphQ
203203
for command in commands {
204204
match command.data {
205205
MinaBaseUserCommandStableV2::SignedCommand(user_command) => {
206-
let is_delegation = matches!(
207-
user_command.payload.body,
208-
MinaBaseSignedCommandPayloadBodyStableV2::StakeDelegation(_)
209-
);
210-
let hash = user_command.hash()?.to_string();
211-
212-
let fee = user_command.payload.common.fee.to_string();
213-
let memo = user_command.payload.common.memo.to_base58check();
214-
let nonce = user_command.payload.common.nonce.as_u32() as i32;
215-
let valid_until = user_command.payload.common.valid_until.as_u32().to_string();
216-
217-
let (to, amount, kind) = match user_command.payload.body {
218-
MinaBaseSignedCommandPayloadBodyStableV2::Payment(payment) => (
219-
payment.receiver_pk.to_string(),
220-
Some(payment.amount.to_string()),
221-
GraphQLUserCommandsKind::PAYMENT,
222-
),
223-
MinaBaseSignedCommandPayloadBodyStableV2::StakeDelegation(
224-
MinaBaseStakeDelegationStableV2::SetDelegate { new_delegate },
225-
) => (
226-
new_delegate.to_string(),
227-
None,
228-
GraphQLUserCommandsKind::STAKE_DELEGATION,
229-
),
230-
};
231-
232-
user_commands.push(GraphQLUserCommands {
233-
hash,
234-
from: user_command.signer.to_string(),
235-
to,
236-
is_delegation,
237-
amount,
238-
failure_reason: Default::default(),
239-
fee,
240-
fee_token: Default::default(),
241-
id: Default::default(),
242-
kind,
243-
memo,
244-
nonce,
245-
token: Default::default(),
246-
valid_until,
247-
});
206+
user_commands.push(GraphQLUserCommands::try_from(user_command)?);
248207
}
249208
MinaBaseUserCommandStableV2::ZkappCommand(zkapp) => {
250209
let failure_reason =
@@ -377,3 +336,53 @@ impl From<&TransactionSnarkWorkTStableV2> for GraphQLSnarkJob {
377336
}
378337
}
379338
}
339+
340+
impl TryFrom<MinaBaseSignedCommandStableV2> for GraphQLUserCommands {
341+
type Error = ConversionError;
342+
343+
fn try_from(user_command: MinaBaseSignedCommandStableV2) -> Result<Self, Self::Error> {
344+
let is_delegation = matches!(
345+
user_command.payload.body,
346+
MinaBaseSignedCommandPayloadBodyStableV2::StakeDelegation(_)
347+
);
348+
let hash = user_command.hash()?.to_string();
349+
let id = user_command.to_base64()?;
350+
351+
let fee = user_command.payload.common.fee.to_string();
352+
let memo = user_command.payload.common.memo.to_base58check();
353+
let nonce = user_command.payload.common.nonce.as_u32() as i32;
354+
let valid_until = user_command.payload.common.valid_until.as_u32().to_string();
355+
356+
let (to, amount, kind) = match user_command.payload.body {
357+
MinaBaseSignedCommandPayloadBodyStableV2::Payment(payment) => (
358+
payment.receiver_pk.to_string(),
359+
Some(payment.amount.to_string()),
360+
GraphQLUserCommandsKind::PAYMENT,
361+
),
362+
MinaBaseSignedCommandPayloadBodyStableV2::StakeDelegation(
363+
MinaBaseStakeDelegationStableV2::SetDelegate { new_delegate },
364+
) => (
365+
new_delegate.to_string(),
366+
None,
367+
GraphQLUserCommandsKind::STAKE_DELEGATION,
368+
),
369+
};
370+
371+
Ok(GraphQLUserCommands {
372+
hash,
373+
from: user_command.signer.to_string(),
374+
to,
375+
is_delegation,
376+
amount,
377+
failure_reason: Default::default(),
378+
fee,
379+
fee_token: Default::default(),
380+
id,
381+
kind,
382+
memo,
383+
nonce,
384+
token: Default::default(),
385+
valid_until,
386+
})
387+
}
388+
}

node/native/src/graphql/mod.rs

Lines changed: 65 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,24 @@
1-
use block::GraphQLBlock;
2-
use juniper::{graphql_value, FieldError};
3-
use juniper::{EmptySubscription, GraphQLEnum, RootNode};
1+
use block::{GraphQLBlock, GraphQLUserCommands};
2+
use juniper::{graphql_value, EmptySubscription, FieldError, GraphQLEnum, RootNode};
43
use ledger::Account;
5-
use mina_p2p_messages::v2::MinaBaseSignedCommandStableV2;
6-
use mina_p2p_messages::v2::MinaBaseUserCommandStableV2;
7-
use mina_p2p_messages::v2::MinaBaseZkappCommandTStableV1WireStableV1;
8-
use mina_p2p_messages::v2::TokenIdKeyHash;
9-
use node::rpc::RpcTransactionInjectResponse;
10-
use node::rpc::{GetBlockQuery, RpcGetBlockResponse, RpcTransactionStatusGetResponse};
4+
use mina_p2p_messages::v2::{
5+
MinaBaseSignedCommandStableV2, MinaBaseUserCommandStableV2,
6+
MinaBaseZkappCommandTStableV1WireStableV1, TokenIdKeyHash, TransactionHash,
7+
};
118
use node::{
129
account::AccountPublicKey,
13-
rpc::{AccountQuery, RpcRequest, RpcSyncStatsGetResponse, SyncStatsQuery},
10+
rpc::{
11+
AccountQuery, GetBlockQuery, PooledUserCommandsQuery, RpcGetBlockResponse,
12+
RpcPooledUserCommandsResponse, RpcRequest, RpcSyncStatsGetResponse,
13+
RpcTransactionInjectResponse,
14+
RpcTransactionStatusGetResponse, SyncStatsQuery,
15+
},
1416
stats::sync::SyncKind,
1517
};
1618
use o1_utils::field_helpers::FieldHelpersError;
17-
use openmina_core::block::AppliedBlock;
18-
use openmina_core::consensus::ConsensusConstants;
19-
use openmina_core::constants::constraint_constants;
19+
use openmina_core::{
20+
block::AppliedBlock, consensus::ConsensusConstants, constants::constraint_constants,
21+
};
2022
use openmina_node_common::rpc::RpcSender;
2123
use std::str::FromStr;
2224
use transaction::GraphQLTransactionStatus;
@@ -319,6 +321,55 @@ impl Query {
319321
Some(Some(block)) => Ok(GraphQLBlock::try_from(block)?),
320322
}
321323
}
324+
325+
async fn pooled_user_commands(
326+
&self,
327+
public_key: Option<String>,
328+
hashes: Option<Vec<String>>,
329+
ids: Option<Vec<String>>,
330+
context: &Context,
331+
) -> juniper::FieldResult<Vec<GraphQLUserCommands>> {
332+
let public_key = match public_key {
333+
Some(public_key) => Some(AccountPublicKey::from_str(&public_key)?),
334+
None => None,
335+
};
336+
337+
let hashes = match hashes {
338+
Some(hashes) => Some(
339+
hashes
340+
.into_iter()
341+
.map(|tx| TransactionHash::from_str(tx.as_str()))
342+
.collect::<Result<Vec<_>, _>>()?,
343+
),
344+
None => None,
345+
};
346+
347+
let ids = match ids {
348+
Some(ids) => Some(
349+
ids.into_iter()
350+
.map(|id| MinaBaseSignedCommandStableV2::from_base64(id.as_str()))
351+
.collect::<Result<Vec<_>, _>>()?,
352+
),
353+
None => None,
354+
};
355+
356+
let query = PooledUserCommandsQuery {
357+
public_key,
358+
hashes,
359+
ids,
360+
};
361+
362+
let res: RpcPooledUserCommandsResponse = context
363+
.0
364+
.oneshot_request(RpcRequest::PooledUserCommands(query))
365+
.await
366+
.ok_or(Error::StateMachineEmptyResponse)?;
367+
368+
Ok(res
369+
.into_iter()
370+
.map(GraphQLUserCommands::try_from)
371+
.collect::<Result<Vec<_>, _>>()?)
372+
}
322373
}
323374

324375
async fn inject_tx<R>(
@@ -371,6 +422,7 @@ where
371422
}
372423
}
373424
}
425+
374426
#[derive(Clone, Debug)]
375427
struct Mutation;
376428

node/src/action_kind.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,7 @@ pub enum ActionKind {
494494
RpcP2pConnectionOutgoingPending,
495495
RpcP2pConnectionOutgoingSuccess,
496496
RpcPeersGet,
497+
RpcPooledUserCommands,
497498
RpcReadinessCheck,
498499
RpcScanStateSummaryGetInit,
499500
RpcScanStateSummaryGetPending,
@@ -533,6 +534,7 @@ pub enum ActionKind {
533534
RpcEffectfulP2pConnectionOutgoingError,
534535
RpcEffectfulP2pConnectionOutgoingSuccess,
535536
RpcEffectfulPeersGet,
537+
RpcEffectfulPooledUserCommands,
536538
RpcEffectfulReadinessCheck,
537539
RpcEffectfulScanStateSummaryGetSuccess,
538540
RpcEffectfulSnarkPoolAvailableJobsGet,
@@ -718,7 +720,7 @@ pub enum ActionKind {
718720
}
719721

720722
impl ActionKind {
721-
pub const COUNT: u16 = 608;
723+
pub const COUNT: u16 = 610;
722724
}
723725

724726
impl std::fmt::Display for ActionKind {
@@ -1088,6 +1090,7 @@ impl ActionKindGet for RpcAction {
10881090
Self::ConsensusConstantsGet { .. } => ActionKind::RpcConsensusConstantsGet,
10891091
Self::TransactionStatusGet { .. } => ActionKind::RpcTransactionStatusGet,
10901092
Self::BlockGet { .. } => ActionKind::RpcBlockGet,
1093+
Self::PooledUserCommands { .. } => ActionKind::RpcPooledUserCommands,
10911094
Self::Finish { .. } => ActionKind::RpcFinish,
10921095
}
10931096
}
@@ -1154,6 +1157,7 @@ impl ActionKindGet for RpcEffectfulAction {
11541157
Self::ConsensusConstantsGet { .. } => ActionKind::RpcEffectfulConsensusConstantsGet,
11551158
Self::TransactionStatusGet { .. } => ActionKind::RpcEffectfulTransactionStatusGet,
11561159
Self::BlockGet { .. } => ActionKind::RpcEffectfulBlockGet,
1160+
Self::PooledUserCommands { .. } => ActionKind::RpcEffectfulPooledUserCommands,
11571161
}
11581162
}
11591163
}

node/src/event_source/event.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ impl std::fmt::Display for Event {
7373
RpcRequest::ConsensusConstantsGet => write!(f, "ConsensusConstantsGet"),
7474
RpcRequest::TransactionStatusGet(..) => write!(f, "TransactionStatusGet"),
7575
RpcRequest::GetBlock(..) => write!(f, "GetBlock"),
76+
RpcRequest::PooledUserCommands(..) => write!(f, "PooledUserCommands"),
7677
}
7778
}
7879
Self::ExternalSnarkWorker(event) => {

node/src/event_source/event_source_effects.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,9 @@ pub fn event_source_effects<S: Service>(store: &mut Store<S>, action: EventSourc
391391
RpcRequest::GetBlock(query) => {
392392
store.dispatch(RpcAction::BlockGet { rpc_id, query });
393393
}
394+
RpcRequest::PooledUserCommands(query) => {
395+
store.dispatch(RpcAction::PooledUserCommands { rpc_id, query });
396+
}
394397
},
395398
Event::ExternalSnarkWorker(e) => match e {
396399
ExternalSnarkWorkerEvent::Started => {

node/src/rpc/mod.rs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@ use ledger::transaction_pool::{diff, ValidCommandWithHash};
1010
use ledger::Account;
1111
use mina_p2p_messages::bigint::BigInt;
1212
use mina_p2p_messages::v2::{
13-
MinaBaseSignedCommandPayloadBodyStableV2, MinaBaseTransactionStatusStableV2,
14-
MinaBaseUserCommandStableV2, MinaTransactionTransactionStableV2,
15-
SnarkWorkerWorkerRpcsVersionedGetWorkV2TResponse, StateHash, TransactionHash,
13+
MinaBaseSignedCommandPayloadBodyStableV2, MinaBaseSignedCommandStableV2,
14+
MinaBaseTransactionStatusStableV2, MinaBaseUserCommandStableV2,
15+
MinaTransactionTransactionStableV2, SnarkWorkerWorkerRpcsVersionedGetWorkV2TResponse,
16+
StateHash, TransactionHash,
1617
};
1718
use openmina_core::block::AppliedBlock;
1819
use openmina_core::consensus::ConsensusConstants;
@@ -87,6 +88,7 @@ pub enum RpcRequest {
8788
ConsensusConstantsGet,
8889
TransactionStatusGet(MinaBaseUserCommandStableV2),
8990
GetBlock(GetBlockQuery),
91+
PooledUserCommands(PooledUserCommandsQuery),
9092
}
9193

9294
pub type MaxLength = u32;
@@ -367,6 +369,7 @@ pub type RpcTransitionFrontierUserCommandsResponse = Vec<MinaBaseUserCommandStab
367369
pub type RpcBestChainResponse = Vec<AppliedBlock>;
368370
pub type RpcConsensusConstantsGetResponse = ConsensusConstants;
369371
pub type RpcTransactionStatusGetResponse = TransactionStatus;
372+
pub type RpcPooledUserCommandsResponse = Vec<MinaBaseSignedCommandStableV2>;
370373

371374
#[derive(Serialize, Deserialize, Debug, Clone, strum_macros::Display)]
372375
#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
@@ -640,6 +643,13 @@ pub enum GetBlockQuery {
640643

641644
pub type RpcGetBlockResponse = Option<AppliedBlock>;
642645

646+
#[derive(Serialize, Deserialize, Debug, Clone)]
647+
pub struct PooledUserCommandsQuery {
648+
pub public_key: Option<AccountPublicKey>,
649+
pub hashes: Option<Vec<TransactionHash>>,
650+
pub ids: Option<Vec<MinaBaseSignedCommandStableV2>>,
651+
}
652+
643653
pub mod discovery {
644654
use p2p::{
645655
libp2p_identity::DecodingError, ConnectionType, P2pNetworkKadBucket, P2pNetworkKadDist,

node/src/rpc/rpc_actions.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use crate::p2p::connection::outgoing::{P2pConnectionOutgoingError, P2pConnection
1515
use crate::p2p::connection::P2pConnectionResponse;
1616

1717
use super::{
18-
ActionStatsQuery, GetBlockQuery, RpcId, RpcScanStateSummaryGetQuery,
18+
ActionStatsQuery, GetBlockQuery, PooledUserCommandsQuery, RpcId, RpcScanStateSummaryGetQuery,
1919
RpcScanStateSummaryScanStateJob, SyncStatsQuery,
2020
};
2121

@@ -211,6 +211,11 @@ pub enum RpcAction {
211211
query: GetBlockQuery,
212212
},
213213

214+
PooledUserCommands {
215+
rpc_id: RpcId,
216+
query: PooledUserCommandsQuery,
217+
},
218+
214219
Finish {
215220
rpc_id: RpcId,
216221
},
@@ -306,6 +311,7 @@ impl redux::EnablingCondition<crate::State> for RpcAction {
306311
RpcAction::ConsensusConstantsGet { .. } => true,
307312
RpcAction::BestChain { .. } => state.transition_frontier.best_tip().is_some(),
308313
RpcAction::TransactionStatusGet { .. } => true,
314+
RpcAction::PooledUserCommands { .. } => true,
309315
RpcAction::LedgerAccountsGetInit { .. } => {
310316
state.transition_frontier.best_tip().is_some()
311317
}

0 commit comments

Comments
 (0)