use serde::{Deserialize, Serialize};
use crate::types::{Address, Amount, BlockHash, HexData, TransactionHash};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
#[cfg_attr(
all(
target_arch = "wasm32",
target_os = "unknown",
feature = "ts-bindings-tx"
),
derive(tsify::Tsify)
)]
#[cfg_attr(
all(
target_arch = "wasm32",
target_os = "unknown",
feature = "ts-bindings-tx"
),
tsify(into_wasm_abi, from_wasm_abi)
)]
#[serde(rename_all = "camelCase")]
pub struct TransactionRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub to: Option<Address>,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<HexData>,
#[serde(skip_serializing_if = "Option::is_none")]
pub value: Option<Amount>,
#[serde(skip_serializing_if = "Option::is_none")]
pub gas_limit: Option<Amount>,
}
impl TransactionRequest {
#[inline]
#[must_use]
pub const fn new(
to: Option<Address>,
data: Option<HexData>,
value: Option<Amount>,
gas_limit: Option<Amount>,
) -> Self {
Self {
to,
data,
value,
gas_limit,
}
}
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TransactionBroadcast {
pub transaction_hash: TransactionHash,
}
impl TransactionBroadcast {
#[inline]
#[must_use]
pub const fn new(transaction_hash: TransactionHash) -> Self {
Self { transaction_hash }
}
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum TransactionStatus {
Success,
Reverted,
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TransactionReceipt {
pub transaction_hash: TransactionHash,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<TransactionStatus>,
#[serde(skip_serializing_if = "Option::is_none")]
pub block_number: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub block_hash: Option<BlockHash>,
#[serde(skip_serializing_if = "Option::is_none")]
pub gas_used: Option<Amount>,
#[serde(skip_serializing_if = "Option::is_none")]
pub from: Option<Address>,
#[serde(skip_serializing_if = "Option::is_none")]
pub to: Option<Address>,
}
impl TransactionReceipt {
#[inline]
#[must_use]
pub const fn new(transaction_hash: TransactionHash) -> Self {
Self {
transaction_hash,
status: None,
block_number: None,
block_hash: None,
gas_used: None,
from: None,
to: None,
}
}
#[inline]
#[must_use]
pub const fn from_parts(
transaction_hash: TransactionHash,
status: Option<TransactionStatus>,
block_number: Option<u64>,
block_hash: Option<BlockHash>,
gas_used: Option<Amount>,
from: Option<Address>,
to: Option<Address>,
) -> Self {
Self {
transaction_hash,
status,
block_number,
block_hash,
gas_used,
from,
to,
}
}
#[must_use]
pub const fn with_status(mut self, status: TransactionStatus) -> Self {
self.status = Some(status);
self
}
#[must_use]
pub const fn with_block_number(mut self, block_number: u64) -> Self {
self.block_number = Some(block_number);
self
}
#[must_use]
pub const fn with_block_hash(mut self, block_hash: BlockHash) -> Self {
self.block_hash = Some(block_hash);
self
}
#[must_use]
pub const fn with_gas_used(mut self, gas_used: Amount) -> Self {
self.gas_used = Some(gas_used);
self
}
#[must_use]
pub const fn with_from(mut self, from: Address) -> Self {
self.from = Some(from);
self
}
#[must_use]
pub const fn with_to(mut self, to: Address) -> Self {
self.to = Some(to);
self
}
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct BlockInfo {
pub number: u64,
#[serde(skip_serializing_if = "Option::is_none")]
pub hash: Option<BlockHash>,
}
impl BlockInfo {
#[inline]
#[must_use]
pub const fn new(number: u64, hash: Option<BlockHash>) -> Self {
Self { number, hash }
}
}