mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-08 15:58:02 +00:00
5f18aaadcd
* rpc/tx: Add transaction structures for serialization Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * rpc/tx: Add public facing `TransactionEvent` To circumvent the fact that serde does not allow mixing `#[serde(tag = "event")]` with `#[serde(tag = "event", content = "block")]` the public facing subscription structure is serialized and deserialized to an intermmediate representation. Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * rpc/tx: Add trait for the `transaction` API Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * rpc/tx: Convert RPC errors to transaction events Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * rpc/tx: Implement `transaction` RPC methods Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * tx-pool: Propagate tx index to events Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * tx-pool: Adjust testing to reflect tx index in events Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * rpc/tx: Convert tx-pool events for the new RPC spec Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * rpc/tx: Convert tx-pool `FinalityTimeout` event to `Dropped` Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * service: Enable the `transaction` API Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * rpc/tx: Add tests for tx event encoding and decoding Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * tx: Add indentation for subscriptions Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * rpc/tx: Fix documentation Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * rpc/tx: Serialize usize to hex Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * tx-pool: Rename closure parameters Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * service: Separate RPC spec versions Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * rpc/tx: Use `H256` for testing block's hash Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * rpc/tx: Serialize numbers as string Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * tx-pool: Backward compatibility with RPC v1 Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * Update client/rpc-spec-v2/src/transaction/transaction.rs Co-authored-by: Niklas Adolfsson <niklasadolfsson1@gmail.com> * rpc/tx: Remove comment about serde clone Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * rpc/tx: Use RPC custom error code for invalid tx format Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * Update client/rpc-spec-v2/src/transaction/event.rs Co-authored-by: James Wilson <james@jsdw.me> * rpc/tx: Adjust internal structures for serialization/deserialization Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> Co-authored-by: Niklas Adolfsson <niklasadolfsson1@gmail.com> Co-authored-by: James Wilson <james@jsdw.me>
101 lines
3.8 KiB
Rust
101 lines
3.8 KiB
Rust
// This file is part of Substrate.
|
|
|
|
// Copyright (C) 2022 Parity Technologies (UK) Ltd.
|
|
// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0
|
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
//! Transaction RPC errors.
|
|
//!
|
|
//! Errors are interpreted as transaction events for subscriptions.
|
|
|
|
use crate::transaction::event::{TransactionError, TransactionEvent};
|
|
use sc_transaction_pool_api::error::Error as PoolError;
|
|
use sp_runtime::transaction_validity::InvalidTransaction;
|
|
|
|
/// Transaction RPC errors.
|
|
#[derive(Debug, thiserror::Error)]
|
|
pub enum Error {
|
|
/// Transaction pool error.
|
|
#[error("Transaction pool error: {}", .0)]
|
|
Pool(#[from] PoolError),
|
|
/// Verification error.
|
|
#[error("Extrinsic verification error: {}", .0)]
|
|
Verification(Box<dyn std::error::Error + Send + Sync>),
|
|
}
|
|
|
|
impl<Hash> From<Error> for TransactionEvent<Hash> {
|
|
fn from(e: Error) -> Self {
|
|
match e {
|
|
Error::Verification(e) => TransactionEvent::Invalid(TransactionError {
|
|
error: format!("Verification error: {}", e),
|
|
}),
|
|
Error::Pool(PoolError::InvalidTransaction(InvalidTransaction::Custom(e))) =>
|
|
TransactionEvent::Invalid(TransactionError {
|
|
error: format!("Invalid transaction with custom error: {}", e),
|
|
}),
|
|
Error::Pool(PoolError::InvalidTransaction(e)) => {
|
|
let msg: &str = e.into();
|
|
TransactionEvent::Invalid(TransactionError {
|
|
error: format!("Invalid transaction: {}", msg),
|
|
})
|
|
},
|
|
Error::Pool(PoolError::UnknownTransaction(e)) => {
|
|
let msg: &str = e.into();
|
|
TransactionEvent::Invalid(TransactionError {
|
|
error: format!("Unknown transaction validity: {}", msg),
|
|
})
|
|
},
|
|
Error::Pool(PoolError::TemporarilyBanned) =>
|
|
TransactionEvent::Invalid(TransactionError {
|
|
error: "Transaction is temporarily banned".into(),
|
|
}),
|
|
Error::Pool(PoolError::AlreadyImported(_)) =>
|
|
TransactionEvent::Invalid(TransactionError {
|
|
error: "Transaction is already imported".into(),
|
|
}),
|
|
Error::Pool(PoolError::TooLowPriority { old, new }) =>
|
|
TransactionEvent::Invalid(TransactionError {
|
|
error: format!(
|
|
"The priority of the transactin is too low (pool {} > current {})",
|
|
old, new
|
|
),
|
|
}),
|
|
Error::Pool(PoolError::CycleDetected) => TransactionEvent::Invalid(TransactionError {
|
|
error: "The transaction contains a cyclic dependency".into(),
|
|
}),
|
|
Error::Pool(PoolError::ImmediatelyDropped) =>
|
|
TransactionEvent::Invalid(TransactionError {
|
|
error: "The transaction could not enter the pool because of the limit".into(),
|
|
}),
|
|
Error::Pool(PoolError::Unactionable) => TransactionEvent::Invalid(TransactionError {
|
|
error: "Transaction cannot be propagated and the local node does not author blocks"
|
|
.into(),
|
|
}),
|
|
Error::Pool(PoolError::NoTagsProvided) => TransactionEvent::Invalid(TransactionError {
|
|
error: "Transaction does not provide any tags, so the pool cannot identify it"
|
|
.into(),
|
|
}),
|
|
Error::Pool(PoolError::InvalidBlockId(_)) =>
|
|
TransactionEvent::Invalid(TransactionError {
|
|
error: "The provided block ID is not valid".into(),
|
|
}),
|
|
Error::Pool(PoolError::RejectedFutureTransaction) =>
|
|
TransactionEvent::Invalid(TransactionError {
|
|
error: "The pool is not accepting future transactions".into(),
|
|
}),
|
|
}
|
|
}
|
|
}
|