use crate::types::{Address, Bytes, CallRequest, H256, U256};
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub struct SignedData {
pub message: Vec<u8>,
#[serde(rename = "messageHash")]
pub message_hash: H256,
pub v: u8,
pub r: H256,
pub s: H256,
pub signature: Bytes,
}
#[derive(Clone, Debug, PartialEq)]
pub struct TransactionParameters {
pub nonce: Option<U256>,
pub to: Option<Address>,
pub gas: U256,
pub gas_price: Option<U256>,
pub value: U256,
pub data: Bytes,
pub chain_id: Option<u64>,
}
const TRANSACTION_DEFAULT_GAS: U256 = U256([100_000, 0, 0, 0]);
impl Default for TransactionParameters {
fn default() -> Self {
TransactionParameters {
nonce: None,
to: None,
gas: TRANSACTION_DEFAULT_GAS,
gas_price: None,
value: U256::zero(),
data: Bytes::default(),
chain_id: None,
}
}
}
impl From<CallRequest> for TransactionParameters {
fn from(call: CallRequest) -> Self {
let to = if call.to != Address::zero() {
Some(call.to)
} else {
None
};
TransactionParameters {
nonce: None,
to,
gas: call.gas.unwrap_or(TRANSACTION_DEFAULT_GAS),
gas_price: call.gas_price,
value: call.value.unwrap_or_default(),
data: call.data.unwrap_or_default(),
chain_id: None,
}
}
}
impl Into<CallRequest> for TransactionParameters {
fn into(self) -> CallRequest {
CallRequest {
from: None,
to: self.to.unwrap_or_default(),
gas: Some(self.gas),
gas_price: self.gas_price,
value: Some(self.value),
data: Some(self.data),
}
}
}
#[derive(Clone, Debug, PartialEq)]
pub struct SignedTransaction {
pub message_hash: H256,
pub v: u64,
pub r: H256,
pub s: H256,
pub raw_transaction: Bytes,
pub transaction_hash: H256,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn verify_transaction_default_gas() {
assert_eq!(TRANSACTION_DEFAULT_GAS, U256::from(100_000));
}
}