diff --git a/ethstore/tests/api.rs b/ethstore/tests/api.rs
index a26da4132..dd9ec3311 100644
--- a/ethstore/tests/api.rs
+++ b/ethstore/tests/api.rs
@@ -19,7 +19,7 @@ extern crate ethstore;
mod util;
-use ethstore::{SecretStore, EthStore, SimpleSecretStore};
+use ethstore::{EthStore, SimpleSecretStore};
use ethstore::ethkey::{Random, Generator, Secret, KeyPair, verify_address};
use ethstore::dir::DiskDirectory;
use util::TransientDir;
diff --git a/rpc/src/v1/helpers/dispatch.rs b/rpc/src/v1/helpers/dispatch.rs
index 3ac310be6..1a70f7e10 100644
--- a/rpc/src/v1/helpers/dispatch.rs
+++ b/rpc/src/v1/helpers/dispatch.rs
@@ -15,6 +15,7 @@
// along with Parity. If not, see .
use std::fmt::Debug;
+use std::ops::Deref;
use rlp;
use util::{Address, H256, U256, Uint, Bytes};
use util::bytes::ToPretty;
@@ -53,6 +54,17 @@ pub enum WithToken {
Yes(T, AccountToken),
}
+impl Deref for WithToken {
+ type Target = T;
+
+ fn deref(&self) -> &Self::Target {
+ match *self {
+ WithToken::No(ref v) => v,
+ WithToken::Yes(ref v, _) => v,
+ }
+ }
+}
+
impl WithToken {
pub fn map(self, f: F) -> WithToken where
S: Debug,
@@ -67,7 +79,7 @@ impl WithToken {
pub fn into_value(self) -> T {
match self {
WithToken::No(v) => v,
- WithToken::Yes(v, ..) => v,
+ WithToken::Yes(v, _) => v,
}
}
}
diff --git a/rpc/src/v1/impls/signer.rs b/rpc/src/v1/impls/signer.rs
index bdb34dab7..97d3de809 100644
--- a/rpc/src/v1/impls/signer.rs
+++ b/rpc/src/v1/impls/signer.rs
@@ -28,7 +28,7 @@ use jsonrpc_core::Error;
use v1::traits::Signer;
use v1::types::{TransactionModification, ConfirmationRequest, ConfirmationResponse, ConfirmationResponseWithToken, U256, Bytes};
use v1::helpers::{errors, SignerService, SigningQueue, ConfirmationPayload};
-use v1::helpers::dispatch::{self, dispatch_transaction};
+use v1::helpers::dispatch::{self, dispatch_transaction, WithToken};
/// Transactions confirmation (personal) rpc implementation.
pub struct SignerClient where C: MiningBlockChainClient, M: MinerService {
@@ -61,8 +61,8 @@ impl SignerClient where C: MiningBlockChainClient,
Ok(())
}
- fn confirm_internal(&self, id: U256, modification: TransactionModification, f: F) -> Result where
- F: FnOnce(&C, &M, &AccountProvider, ConfirmationPayload) -> Result,
+ fn confirm_internal(&self, id: U256, modification: TransactionModification, f: F) -> Result, Error> where
+ F: FnOnce(&C, &M, &AccountProvider, ConfirmationPayload) -> Result, Error>,
{
try!(self.active());
@@ -84,7 +84,7 @@ impl SignerClient where C: MiningBlockChainClient,
let result = f(&*client, &*miner, &*accounts, payload);
// Execute
if let Ok(ref response) = result {
- signer.request_confirmed(id, Ok(response.clone()));
+ signer.request_confirmed(id, Ok((*response).clone()));
}
result
}).unwrap_or_else(|| Err(errors::invalid_params("Unknown RequestID", id)))
@@ -109,12 +109,19 @@ impl Signer for SignerClient where C: MiningBlockC
fn confirm_request(&self, id: U256, modification: TransactionModification, pass: String) -> Result {
self.confirm_internal(id, modification, move |client, miner, accounts, payload| {
dispatch::execute(client, miner, accounts, payload, dispatch::SignWith::Password(pass))
- .map(|v| v.into_value())
- })
+ }).map(|v| v.into_value())
}
fn confirm_request_with_token(&self, id: U256, modification: TransactionModification, token: String) -> Result {
- unimplemented!()
+ self.confirm_internal(id, modification, move |client, miner, accounts, payload| {
+ dispatch::execute(client, miner, accounts, payload, dispatch::SignWith::Token(token))
+ }).and_then(|v| match v {
+ WithToken::No(_) => Err(errors::internal("Unexpected response without token.", "")),
+ WithToken::Yes(response, token) => Ok(ConfirmationResponseWithToken {
+ result: response,
+ token: token,
+ }),
+ })
}
fn confirm_request_raw(&self, id: U256, bytes: Bytes) -> Result {
diff --git a/rpc/src/v1/tests/mocked/signer.rs b/rpc/src/v1/tests/mocked/signer.rs
index c4df02606..eb7fa6c48 100644
--- a/rpc/src/v1/tests/mocked/signer.rs
+++ b/rpc/src/v1/tests/mocked/signer.rs
@@ -247,10 +247,11 @@ fn should_confirm_transaction_with_token() {
}"#;
let response = r#"{"jsonrpc":"2.0","result":{"result":""#.to_owned() +
format!("0x{:?}", t.hash()).as_ref() +
- r#""token":""},"id":1}"#;
+ r#"","token":""#;
// then
- assert_eq!(tester.io.handle_request_sync(&request), Some(response.to_owned()));
+ let result = tester.io.handle_request_sync(&request).unwrap();
+ assert!(result.starts_with(&response), "Should return correct result. Expected: {:?}, Got: {:?}", response, result);
assert_eq!(tester.signer.requests().len(), 0);
assert_eq!(tester.miner.imported_transactions.lock().len(), 1);
}