1use crate::{
11 builder::FullClientTransactionPool,
12 graph::{base_pool::Transaction, ExtrinsicFor, ExtrinsicHash},
13 ChainApi, FullChainApi, ReadyIteratorFor,
14};
15use async_trait::async_trait;
16use soil_client::transaction_pool::{
17 ChainEvent, ImportNotificationStream, LocalTransactionFor, LocalTransactionPool,
18 MaintainedTransactionPool, PoolStatus, ReadyTransactions, TransactionFor, TransactionPool,
19 TransactionSource, TransactionStatusStreamFor, TxHash, TxInvalidityReportMap,
20};
21use std::{collections::HashMap, pin::Pin, sync::Arc};
22use subsoil::runtime::traits::Block as BlockT;
23
24pub struct TransactionPoolWrapper<Block, Client>(
28 pub Box<dyn FullClientTransactionPool<Block, Client>>,
29)
30where
31 Block: BlockT,
32 Client: subsoil::api::ProvideRuntimeApi<Block>
33 + soil_client::client_api::BlockBackend<Block>
34 + soil_client::client_api::blockchain::HeaderBackend<Block>
35 + subsoil::runtime::traits::BlockIdTo<Block>
36 + soil_client::blockchain::HeaderMetadata<Block, Error = soil_client::blockchain::Error>
37 + 'static,
38 Client::Api: subsoil::txpool::runtime_api::TaggedTransactionQueue<Block>;
39
40#[async_trait]
41impl<Block, Client> TransactionPool for TransactionPoolWrapper<Block, Client>
42where
43 Block: BlockT,
44 Client: subsoil::api::ProvideRuntimeApi<Block>
45 + soil_client::client_api::BlockBackend<Block>
46 + soil_client::client_api::blockchain::HeaderBackend<Block>
47 + subsoil::runtime::traits::BlockIdTo<Block>
48 + soil_client::blockchain::HeaderMetadata<Block, Error = soil_client::blockchain::Error>
49 + 'static,
50 Client::Api: subsoil::txpool::runtime_api::TaggedTransactionQueue<Block>,
51{
52 type Block = Block;
53 type Hash = ExtrinsicHash<FullChainApi<Client, Block>>;
54 type InPoolTransaction = Transaction<
55 ExtrinsicHash<FullChainApi<Client, Block>>,
56 ExtrinsicFor<FullChainApi<Client, Block>>,
57 >;
58 type Error = <FullChainApi<Client, Block> as ChainApi>::Error;
59
60 async fn submit_at(
61 &self,
62 at: <Self::Block as BlockT>::Hash,
63 source: TransactionSource,
64 xts: Vec<TransactionFor<Self>>,
65 ) -> Result<Vec<Result<TxHash<Self>, Self::Error>>, Self::Error> {
66 self.0.submit_at(at, source, xts).await
67 }
68
69 async fn submit_one(
70 &self,
71 at: <Self::Block as BlockT>::Hash,
72 source: TransactionSource,
73 xt: TransactionFor<Self>,
74 ) -> Result<TxHash<Self>, Self::Error> {
75 self.0.submit_one(at, source, xt).await
76 }
77
78 async fn submit_and_watch(
79 &self,
80 at: <Self::Block as BlockT>::Hash,
81 source: TransactionSource,
82 xt: TransactionFor<Self>,
83 ) -> Result<Pin<Box<TransactionStatusStreamFor<Self>>>, Self::Error> {
84 self.0.submit_and_watch(at, source, xt).await
85 }
86
87 async fn ready_at(
88 &self,
89 at: <Self::Block as BlockT>::Hash,
90 ) -> ReadyIteratorFor<FullChainApi<Client, Block>> {
91 self.0.ready_at(at).await
92 }
93
94 fn ready(&self) -> Box<dyn ReadyTransactions<Item = Arc<Self::InPoolTransaction>> + Send> {
95 self.0.ready()
96 }
97
98 async fn report_invalid(
99 &self,
100 at: Option<<Self::Block as BlockT>::Hash>,
101 invalid_tx_errors: TxInvalidityReportMap<TxHash<Self>>,
102 ) -> Vec<Arc<Self::InPoolTransaction>> {
103 self.0.report_invalid(at, invalid_tx_errors).await
104 }
105
106 fn futures(&self) -> Vec<Self::InPoolTransaction> {
107 self.0.futures()
108 }
109
110 fn status(&self) -> PoolStatus {
111 self.0.status()
112 }
113
114 fn import_notification_stream(&self) -> ImportNotificationStream<TxHash<Self>> {
115 self.0.import_notification_stream()
116 }
117
118 fn on_broadcasted(&self, propagations: HashMap<TxHash<Self>, Vec<String>>) {
119 self.0.on_broadcasted(propagations)
120 }
121
122 fn hash_of(&self, xt: &TransactionFor<Self>) -> TxHash<Self> {
123 self.0.hash_of(xt)
124 }
125
126 fn ready_transaction(&self, hash: &TxHash<Self>) -> Option<Arc<Self::InPoolTransaction>> {
127 self.0.ready_transaction(hash)
128 }
129
130 async fn ready_at_with_timeout(
131 &self,
132 at: <Self::Block as BlockT>::Hash,
133 timeout: std::time::Duration,
134 ) -> ReadyIteratorFor<FullChainApi<Client, Block>> {
135 self.0.ready_at_with_timeout(at, timeout).await
136 }
137}
138
139#[async_trait]
140impl<Block, Client> MaintainedTransactionPool for TransactionPoolWrapper<Block, Client>
141where
142 Block: BlockT,
143 Client: subsoil::api::ProvideRuntimeApi<Block>
144 + soil_client::client_api::BlockBackend<Block>
145 + soil_client::client_api::blockchain::HeaderBackend<Block>
146 + subsoil::runtime::traits::BlockIdTo<Block>
147 + soil_client::blockchain::HeaderMetadata<Block, Error = soil_client::blockchain::Error>
148 + 'static,
149 Client::Api: subsoil::txpool::runtime_api::TaggedTransactionQueue<Block>,
150{
151 async fn maintain(&self, event: ChainEvent<Self::Block>) {
152 self.0.maintain(event).await;
153 }
154}
155
156impl<Block, Client> LocalTransactionPool for TransactionPoolWrapper<Block, Client>
157where
158 Block: BlockT,
159 Client: subsoil::api::ProvideRuntimeApi<Block>
160 + soil_client::client_api::BlockBackend<Block>
161 + soil_client::client_api::blockchain::HeaderBackend<Block>
162 + subsoil::runtime::traits::BlockIdTo<Block>
163 + soil_client::blockchain::HeaderMetadata<Block, Error = soil_client::blockchain::Error>
164 + 'static,
165 Client::Api: subsoil::txpool::runtime_api::TaggedTransactionQueue<Block>,
166{
167 type Block = Block;
168 type Hash = ExtrinsicHash<FullChainApi<Client, Block>>;
169 type Error = <FullChainApi<Client, Block> as ChainApi>::Error;
170
171 fn submit_local(
172 &self,
173 at: <Self::Block as BlockT>::Hash,
174 xt: LocalTransactionFor<Self>,
175 ) -> Result<Self::Hash, Self::Error> {
176 self.0.submit_local(at, xt)
177 }
178}