mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-08 12:28:01 +00:00
Fix transaction submission for hex (#259)
* Fix transaction submission for hex * Fix grumbles.
This commit is contained in:
Generated
+1
@@ -2279,6 +2279,7 @@ dependencies = [
|
||||
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"substrate-client 0.1.0",
|
||||
"substrate-codec 0.1.0",
|
||||
"substrate-executor 0.1.0",
|
||||
"substrate-extrinsic-pool 0.1.0",
|
||||
"substrate-primitives 0.1.0",
|
||||
|
||||
@@ -61,6 +61,8 @@ macro_rules! map {
|
||||
)
|
||||
}
|
||||
|
||||
use rstd::prelude::*;
|
||||
use rstd::ops::Deref;
|
||||
|
||||
#[cfg(feature = "std")]
|
||||
pub mod bytes;
|
||||
@@ -87,3 +89,17 @@ pub type AuthorityId = [u8; 32];
|
||||
|
||||
/// A 512-bit value interpreted as a signature.
|
||||
pub type Signature = hash::H512;
|
||||
|
||||
/// Hex-serialised shim for `Vec<u8>`.
|
||||
#[derive(PartialEq, Eq, Clone)]
|
||||
#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug, Hash, PartialOrd, Ord))]
|
||||
pub struct Bytes(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec<u8>);
|
||||
|
||||
impl From<Vec<u8>> for Bytes {
|
||||
fn from(s: Vec<u8>) -> Self { Bytes(s) }
|
||||
}
|
||||
|
||||
impl Deref for Bytes {
|
||||
type Target = [u8];
|
||||
fn deref(&self) -> &[u8] { &self.0[..] }
|
||||
}
|
||||
@@ -10,6 +10,7 @@ jsonrpc-macros = { git="https://github.com/paritytech/jsonrpc.git" }
|
||||
jsonrpc-pubsub = { git="https://github.com/paritytech/jsonrpc.git" }
|
||||
log = "0.3"
|
||||
parking_lot = "0.4"
|
||||
substrate-codec = { path = "../codec" }
|
||||
substrate-client = { path = "../client" }
|
||||
substrate-executor = { path = "../executor" }
|
||||
substrate-extrinsic-pool = { path = "../extrinsic-pool" }
|
||||
|
||||
@@ -24,6 +24,11 @@ error_chain! {
|
||||
Pool(txpool::Error, txpool::ErrorKind) #[doc = "Pool error"];
|
||||
}
|
||||
errors {
|
||||
/// Incorrect transaction format.
|
||||
BadFormat {
|
||||
description("bad format"),
|
||||
display("Invalid transaction format"),
|
||||
}
|
||||
/// Not implemented yet
|
||||
Unimplemented {
|
||||
description("not yet implemented"),
|
||||
|
||||
@@ -20,7 +20,9 @@ use std::sync::Arc;
|
||||
|
||||
use client::{self, Client};
|
||||
use extrinsic_pool::api::{Error, ExtrinsicPool};
|
||||
use codec::Slicable;
|
||||
|
||||
use primitives::Bytes;
|
||||
use runtime_primitives::{generic, traits::Block as BlockT};
|
||||
use state_machine;
|
||||
|
||||
@@ -35,8 +37,11 @@ build_rpc_trait! {
|
||||
/// Substrate authoring RPC API
|
||||
pub trait AuthorApi<Hash, Extrinsic> {
|
||||
/// Submit extrinsic for inclusion in block.
|
||||
#[rpc(name = "author_submitRichExtrinsic")]
|
||||
fn submit_rich_extrinsic(&self, Extrinsic) -> Result<Hash>;
|
||||
/// Submit hex-encoded extrinsic for inclusion in block.
|
||||
#[rpc(name = "author_submitExtrinsic")]
|
||||
fn submit_extrinsic(&self, Extrinsic) -> Result<Hash>;
|
||||
fn submit_extrinsic(&self, Bytes) -> Result<Hash>;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -55,7 +60,6 @@ impl<B, E, Block: BlockT, P> Author<B, E, Block, P> {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
impl<B, E, Block, P, Ex, Hash> AuthorApi<Hash, Ex> for Author<B, E, Block, P> where
|
||||
B: client::backend::Backend<Block> + Send + Sync + 'static,
|
||||
E: client::CallExecutor<Block> + Send + Sync + 'static,
|
||||
@@ -63,8 +67,13 @@ impl<B, E, Block, P, Ex, Hash> AuthorApi<Hash, Ex> for Author<B, E, Block, P> wh
|
||||
client::error::Error: From<<<B as client::backend::Backend<Block>>::State as state_machine::backend::Backend>::Error>,
|
||||
P: ExtrinsicPool<Ex, generic::BlockId<Block>, Hash>,
|
||||
P::Error: 'static,
|
||||
Ex: Slicable,
|
||||
{
|
||||
fn submit_extrinsic(&self, xt: Ex) -> Result<Hash> {
|
||||
fn submit_extrinsic(&self, xt: Bytes) -> Result<Hash> {
|
||||
self.submit_rich_extrinsic(Ex::decode(&mut &xt[..]).ok_or(error::Error::from(error::ErrorKind::BadFormat))?)
|
||||
}
|
||||
|
||||
fn submit_rich_extrinsic(&self, xt: Ex) -> Result<Hash> {
|
||||
let best_block_hash = self.client.info().unwrap().chain.best_hash;
|
||||
self.pool
|
||||
.submit(generic::BlockId::hash(best_block_hash), vec![xt])
|
||||
|
||||
@@ -65,10 +65,26 @@ fn submit_transaction_should_not_cause_error() {
|
||||
};
|
||||
|
||||
assert_matches!(
|
||||
AuthorApi::submit_extrinsic(&p, 5),
|
||||
AuthorApi::submit_extrinsic(&p, u64::encode(&5).into()),
|
||||
Ok(1)
|
||||
);
|
||||
assert!(
|
||||
AuthorApi::submit_extrinsic(&p, 5).is_err()
|
||||
AuthorApi::submit_extrinsic(&p, u64::encode(&5).into()).is_err()
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn submit_rich_transaction_should_not_cause_error() {
|
||||
let p = Author {
|
||||
client: Arc::new(test_client::new()),
|
||||
pool: Arc::new(DummyTxPool::default()),
|
||||
};
|
||||
|
||||
assert_matches!(
|
||||
AuthorApi::submit_rich_extrinsic(&p, 5),
|
||||
Ok(1)
|
||||
);
|
||||
assert!(
|
||||
AuthorApi::submit_rich_extrinsic(&p, 5).is_err()
|
||||
);
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
extern crate jsonrpc_core as rpc;
|
||||
extern crate jsonrpc_pubsub;
|
||||
extern crate parking_lot;
|
||||
extern crate substrate_codec as codec;
|
||||
extern crate substrate_client as client;
|
||||
extern crate substrate_extrinsic_pool as extrinsic_pool;
|
||||
extern crate substrate_primitives as primitives;
|
||||
|
||||
Reference in New Issue
Block a user