separated transaction_request to its own submodule, added basic tests for it
This commit is contained in:
		
							parent
							
								
									fd39975cf0
								
							
						
					
					
						commit
						190630cc6b
					
				| @ -27,6 +27,7 @@ use ethcore::block::{IsBlock}; | |||||||
| use ethcore::views::*; | use ethcore::views::*; | ||||||
| use ethcore::ethereum::Ethash; | use ethcore::ethereum::Ethash; | ||||||
| use ethcore::ethereum::denominations::shannon; | use ethcore::ethereum::denominations::shannon; | ||||||
|  | use ethcore::transaction::Transaction as EthTransaction; | ||||||
| use v1::traits::{Eth, EthFilter}; | use v1::traits::{Eth, EthFilter}; | ||||||
| use v1::types::{Block, BlockTransactions, BlockNumber, Bytes, SyncStatus, SyncInfo, Transaction, TransactionRequest, OptionalValue, Index, Filter, Log}; | use v1::types::{Block, BlockTransactions, BlockNumber, Bytes, SyncStatus, SyncInfo, Transaction, TransactionRequest, OptionalValue, Index, Filter, Log}; | ||||||
| use v1::helpers::{PollFilter, PollManager}; | use v1::helpers::{PollFilter, PollManager}; | ||||||
| @ -274,7 +275,7 @@ impl<C, S, A> Eth for EthClient<C, S, A> where C: BlockChainClient + 'static, S: | |||||||
| 				match accounts.account_secret(&transaction_request.from) { | 				match accounts.account_secret(&transaction_request.from) { | ||||||
| 					Ok(secret) => { | 					Ok(secret) => { | ||||||
| 						let sync = take_weak!(self.sync); | 						let sync = take_weak!(self.sync); | ||||||
| 						let (transaction, _) = transaction_request.to_eth(); | 						let transaction: EthTransaction = transaction_request.into(); | ||||||
| 						let signed_transaction = transaction.sign(&secret); | 						let signed_transaction = transaction.sign(&secret); | ||||||
| 						let hash = signed_transaction.hash(); | 						let hash = signed_transaction.hash(); | ||||||
| 						sync.insert_transaction(signed_transaction); | 						sync.insert_transaction(signed_transaction); | ||||||
|  | |||||||
| @ -23,6 +23,7 @@ mod log; | |||||||
| mod optionals; | mod optionals; | ||||||
| mod sync; | mod sync; | ||||||
| mod transaction; | mod transaction; | ||||||
|  | mod transaction_request; | ||||||
| 
 | 
 | ||||||
| pub use self::block::{Block, BlockTransactions}; | pub use self::block::{Block, BlockTransactions}; | ||||||
| pub use self::block_number::BlockNumber; | pub use self::block_number::BlockNumber; | ||||||
| @ -33,5 +34,5 @@ pub use self::log::Log; | |||||||
| pub use self::optionals::OptionalValue; | pub use self::optionals::OptionalValue; | ||||||
| pub use self::sync::{SyncStatus, SyncInfo}; | pub use self::sync::{SyncStatus, SyncInfo}; | ||||||
| pub use self::transaction::Transaction; | pub use self::transaction::Transaction; | ||||||
| pub use self::transaction::TransactionRequest; | pub use self::transaction_request::TransactionRequest; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -17,8 +17,7 @@ | |||||||
| use util::numbers::*; | use util::numbers::*; | ||||||
| use ethcore::transaction::{LocalizedTransaction, Action}; | use ethcore::transaction::{LocalizedTransaction, Action}; | ||||||
| use v1::types::{Bytes, OptionalValue}; | use v1::types::{Bytes, OptionalValue}; | ||||||
| use serde::{Deserializer, Error}; | use serde::Error; | ||||||
| use ethcore; |  | ||||||
| 
 | 
 | ||||||
| #[derive(Debug, Default, Serialize)] | #[derive(Debug, Default, Serialize)] | ||||||
| pub struct Transaction { | pub struct Transaction { | ||||||
| @ -39,35 +38,6 @@ pub struct Transaction { | |||||||
| 	pub input: Bytes | 	pub input: Bytes | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[derive(Debug, Default, Serialize, Deserialize)] |  | ||||||
| pub struct TransactionRequest { |  | ||||||
| 	pub from: Address, |  | ||||||
| 	pub to: Option<Address>, |  | ||||||
| 	#[serde(rename="gasPrice")] |  | ||||||
| 	pub gas_price: Option<U256>, |  | ||||||
| 	pub gas: Option<U256>, |  | ||||||
| 	pub value: Option<U256>, |  | ||||||
| 	pub data: Bytes, |  | ||||||
| 	pub nonce: Option<U256>, |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| impl TransactionRequest { |  | ||||||
| 	/// maps transaction request to the transaction that can be signed and inserted
 |  | ||||||
| 	pub fn to_eth(self) -> (ethcore::transaction::Transaction, Address) { |  | ||||||
| 		(ethcore::transaction::Transaction { |  | ||||||
| 			nonce: self.nonce.unwrap_or(U256::zero()), |  | ||||||
| 			action: match self.to { |  | ||||||
| 				None => ethcore::transaction::Action::Create, |  | ||||||
| 				Some(addr) => ethcore::transaction::Action::Call(addr) |  | ||||||
| 			}, |  | ||||||
| 			gas: self.gas.unwrap_or(U256::zero()), |  | ||||||
| 			gas_price: self.gas_price.unwrap_or(U256::zero()), |  | ||||||
| 			value: self.value.unwrap_or(U256::zero()), |  | ||||||
| 			data: self.data.to_vec() |  | ||||||
| 		}, self.from) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| impl From<LocalizedTransaction> for Transaction { | impl From<LocalizedTransaction> for Transaction { | ||||||
| 	fn from(t: LocalizedTransaction) -> Transaction { | 	fn from(t: LocalizedTransaction) -> Transaction { | ||||||
| 		Transaction { | 		Transaction { | ||||||
|  | |||||||
							
								
								
									
										101
									
								
								rpc/src/v1/types/transaction_request.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								rpc/src/v1/types/transaction_request.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,101 @@ | |||||||
|  | // Copyright 2015, 2016 Ethcore (UK) Ltd.
 | ||||||
|  | // This file is part of Parity.
 | ||||||
|  | 
 | ||||||
|  | // Parity 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.
 | ||||||
|  | 
 | ||||||
|  | // Parity 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 Parity.  If not, see <http://www.gnu.org/licenses/>.
 | ||||||
|  | 
 | ||||||
|  | use util::hash::Address; | ||||||
|  | use util::numbers::{Uint, U256}; | ||||||
|  | use ethcore::transaction::{Action, Transaction}; | ||||||
|  | use v1::types::Bytes; | ||||||
|  | 
 | ||||||
|  | #[derive(Debug, Default, Deserialize)] | ||||||
|  | pub struct TransactionRequest { | ||||||
|  | 	pub from: Address, | ||||||
|  | 	pub to: Option<Address>, | ||||||
|  | 	#[serde(rename="gasPrice")] | ||||||
|  | 	pub gas_price: Option<U256>, | ||||||
|  | 	pub gas: Option<U256>, | ||||||
|  | 	pub value: Option<U256>, | ||||||
|  | 	pub data: Bytes, | ||||||
|  | 	pub nonce: Option<U256>, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl Into<Transaction> for TransactionRequest { | ||||||
|  | 	fn into(self) -> Transaction { | ||||||
|  | 		Transaction { | ||||||
|  | 			nonce: self.nonce.unwrap_or(U256::zero()), | ||||||
|  | 			action: match self.to { | ||||||
|  | 				None => Action::Create, | ||||||
|  | 				Some(addr) => Action::Call(addr) | ||||||
|  | 			}, | ||||||
|  | 			gas: self.gas.unwrap_or(U256::zero()), | ||||||
|  | 			gas_price: self.gas_price.unwrap_or(U256::zero()), | ||||||
|  | 			value: self.value.unwrap_or(U256::zero()), | ||||||
|  | 			data: self.data.to_vec() | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #[cfg(test)] | ||||||
|  | mod tests { | ||||||
|  | 	use util::numbers::{Uint, U256}; | ||||||
|  | 	use util::hash::Address; | ||||||
|  | 	use ethcore::transaction::{Transaction, Action}; | ||||||
|  | 	use v1::types::Bytes; | ||||||
|  | 	use super::*; | ||||||
|  | 
 | ||||||
|  | 	#[test] | ||||||
|  | 	fn transaction_request_into_transaction() { | ||||||
|  | 		let tr = TransactionRequest { | ||||||
|  | 			from: Address::default(), | ||||||
|  | 			to: Some(Address::from(10)), | ||||||
|  | 			gas_price: Some(U256::from(20)), | ||||||
|  | 			gas: Some(U256::from(10_000)), | ||||||
|  | 			value: Some(U256::from(1)), | ||||||
|  | 			data: Bytes::new(vec![10, 20]), | ||||||
|  | 			nonce: Some(U256::from(12)), | ||||||
|  | 		}; | ||||||
|  | 
 | ||||||
|  | 		assert_eq!(Transaction { | ||||||
|  | 			nonce: U256::from(12), | ||||||
|  | 			action: Action::Call(Address::from(10)), | ||||||
|  | 			gas: U256::from(10_000), | ||||||
|  | 			gas_price: U256::from(20), | ||||||
|  | 			value: U256::from(1), | ||||||
|  | 			data: vec![10, 20], | ||||||
|  | 		}, tr.into()); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	#[test] | ||||||
|  | 	fn empty_transaction_request_into_transaction() { | ||||||
|  | 		let tr = TransactionRequest { | ||||||
|  | 			from: Address::default(), | ||||||
|  | 			to: None, | ||||||
|  | 			gas_price: None, | ||||||
|  | 			gas: None, | ||||||
|  | 			value: None, | ||||||
|  | 			data: Bytes::new(vec![]), | ||||||
|  | 			nonce: None, | ||||||
|  | 		}; | ||||||
|  | 
 | ||||||
|  | 		assert_eq!(Transaction { | ||||||
|  | 			nonce: U256::zero(), | ||||||
|  | 			action: Action::Create, | ||||||
|  | 			gas: U256::zero(), | ||||||
|  | 			gas_price: U256::zero(), | ||||||
|  | 			value: U256::zero(), | ||||||
|  | 			data: vec![], | ||||||
|  | 		}, tr.into()); | ||||||
|  | 	} | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user