use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
#[non_exhaustive]
pub enum Chain {
Ethereum,
Tron,
}
#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash, Serialize, Deserialize)]
#[non_exhaustive]
pub enum FeeMode {
#[serde(rename = "EIP1559")]
Eip1559,
#[serde(rename = "LEGACY")]
Legacy,
#[serde(rename = "TRON")]
Tron,
}
impl FeeMode {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::Eip1559 => "EIP1559",
Self::Legacy => "LEGACY",
Self::Tron => "TRON",
}
}
}
#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash, Serialize, Deserialize)]
#[non_exhaustive]
pub enum TxType {
#[serde(rename = "TRANSFER_NATIVE")]
TransferNative,
#[serde(rename = "TRANSFER_TOKEN")]
TransferToken,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct TronBlockHeader {
pub h: String,
pub n: u64,
pub t: u64,
#[serde(skip_serializing_if = "Option::is_none")]
pub p: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub r: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub w: Option<String>,
pub v: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct FeeParams {
pub mode: FeeMode,
#[serde(skip_serializing_if = "Option::is_none")]
pub gas_limit: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub base_fee_per_gas: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_priority_fee_per_gas: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_fee_per_gas: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub gas_price: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub el: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub rp: Option<TronBlockHeader>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct PreparedTransaction {
pub chain: Chain,
pub chain_id: Option<i64>,
pub from: String,
pub to: String,
pub value_wei: String,
pub data: Option<String>,
pub tx_type: TxType,
pub token_contract: Option<String>,
pub nonce: Option<String>,
pub fee: FeeParams,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct CompilationResult {
pub chain: Chain,
pub unsigned_tx: String,
pub tx_hash: String,
pub metadata: CompilationMetadata,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct CompilationMetadata {
pub tx_type: TxType,
pub fee_mode: FeeMode,
#[serde(skip_serializing_if = "Option::is_none")]
pub evm_tx_type: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tron_contract_type: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expiration: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct TransactionReview {
pub chain: Chain,
pub tx_type: TxType,
pub from: String,
pub recipient: String,
pub amount: String,
pub token_contract: Option<String>,
pub nonce: Option<String>,
pub chain_id: Option<i64>,
pub fee: FeeReview,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct FeeReview {
pub mode: FeeMode,
pub estimated_max_cost: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub gas_limit: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub gas_price: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_fee_per_gas: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_priority_fee_per_gas: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub base_fee_per_gas: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tron_fee_limit: Option<String>,
}
#[derive(Debug, Clone, Copy, Default)]
#[non_exhaustive]
pub struct CompileOptions {
pub now: Option<u64>,
}
impl CompileOptions {
#[must_use]
pub const fn new() -> Self {
Self { now: None }
}
#[must_use]
pub const fn with_now(mut self, now_ms: u64) -> Self {
self.now = Some(now_ms);
self
}
}