1use std::{sync::{Arc, Mutex}, collections::HashMap};
20use serde::{Serialize, Serializer};
21use serde::ser::SerializeStruct;
22use ethereum_types::{H160, H256, H512, U64, U256};
23use crate::types::Bytes;
24
25#[derive(Debug, Default, Clone, PartialEq, Serialize)]
27#[serde(rename_all = "camelCase")]
28pub struct Transaction {
29 pub hash: H256,
31 pub nonce: U256,
33 pub block_hash: Option<H256>,
35 pub block_number: Option<U256>,
37 pub transaction_index: Option<U256>,
39 pub from: H160,
41 pub to: Option<H160>,
43 pub value: U256,
45 pub gas_price: U256,
47 pub gas: U256,
49 pub input: Bytes,
51 pub creates: Option<H160>,
53 pub raw: Bytes,
55 pub public_key: Option<H512>,
57 pub chain_id: Option<U64>,
59 pub standard_v: U256,
61 pub v: U256,
63 pub r: U256,
65 pub s: U256,
67}
68
69#[derive(Debug)]
71pub enum LocalTransactionStatus {
72 Pending,
74 Future,
76 Mined(Transaction),
78 Culled(Transaction),
80 Dropped(Transaction),
82 Replaced(Transaction, U256, H256),
84 Rejected(Transaction, String),
86 Invalid(Transaction),
88 Canceled(Transaction),
90}
91
92impl Serialize for LocalTransactionStatus {
93 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
94 where S: Serializer
95 {
96 use self::LocalTransactionStatus::*;
97
98 let elems = match *self {
99 Pending | Future => 1,
100 Mined(..) | Culled(..) | Dropped(..) | Invalid(..) | Canceled(..) => 2,
101 Rejected(..) => 3,
102 Replaced(..) => 4,
103 };
104
105 let status = "status";
106 let transaction = "transaction";
107
108 let mut struc = serializer.serialize_struct("LocalTransactionStatus", elems)?;
109 match *self {
110 Pending => struc.serialize_field(status, "pending")?,
111 Future => struc.serialize_field(status, "future")?,
112 Mined(ref tx) => {
113 struc.serialize_field(status, "mined")?;
114 struc.serialize_field(transaction, tx)?;
115 },
116 Culled(ref tx) => {
117 struc.serialize_field(status, "culled")?;
118 struc.serialize_field(transaction, tx)?;
119 },
120 Dropped(ref tx) => {
121 struc.serialize_field(status, "dropped")?;
122 struc.serialize_field(transaction, tx)?;
123 },
124 Canceled(ref tx) => {
125 struc.serialize_field(status, "canceled")?;
126 struc.serialize_field(transaction, tx)?;
127 },
128 Invalid(ref tx) => {
129 struc.serialize_field(status, "invalid")?;
130 struc.serialize_field(transaction, tx)?;
131 },
132 Rejected(ref tx, ref reason) => {
133 struc.serialize_field(status, "rejected")?;
134 struc.serialize_field(transaction, tx)?;
135 struc.serialize_field("error", reason)?;
136 },
137 Replaced(ref tx, ref gas_price, ref hash) => {
138 struc.serialize_field(status, "replaced")?;
139 struc.serialize_field(transaction, tx)?;
140 struc.serialize_field("hash", hash)?;
141 struc.serialize_field("gasPrice", gas_price)?;
142 },
143 }
144
145 struc.end()
146 }
147}
148
149#[derive(Debug, Default, Clone, PartialEq, Serialize)]
151pub struct RichRawTransaction {
152 pub raw: Bytes,
154 #[serde(rename = "tx")]
156 pub transaction: Transaction
157}
158
159pub struct PendingTransaction {
160 pub transaction: Transaction,
161 pub at_block: u64
162}
163
164impl PendingTransaction {
165 pub fn new(transaction: Transaction, at_block: u64) -> Self {
166 Self { transaction, at_block }
167 }
168}
169
170pub type PendingTransactions = Option<Arc<Mutex<HashMap<H256, PendingTransaction>>>>;