Skip to main content

soil_txpool/
transaction_pool_wrapper.rs

1// This file is part of Soil.
2
3// Copyright (C) Soil contributors.
4// Copyright (C) Parity Technologies (UK) Ltd.
5// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0
6
7//! Transaction pool wrapper. Provides a type for wrapping object providing actual implementation of
8//! transaction pool.
9
10use 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
24/// The wrapper for actual object providing implementation of TransactionPool.
25///
26/// This wraps actual implementation of the TransactionPool, e.g. fork-aware or single-state.
27pub 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}