use crate::{
    scalar::{Address, AssetId, Bytes32, ContractId, MessageId, Nonce},
    type_id, TypeId, FUEL_TYPES_NAMESPACE,
};
use serde::{Deserialize, Serialize};
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct Transfer {
    pub contract_id: ContractId,
    pub to: ContractId,
    pub amount: u64,
    pub asset_id: AssetId,
    pub pc: u64,
    pub is: u64,
}
impl TypeId for Transfer {
    fn type_id() -> usize {
        type_id(FUEL_TYPES_NAMESPACE, "Transfer") as usize
    }
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct Log {
    pub contract_id: ContractId,
    pub ra: u64,
    pub rb: u64,
}
impl TypeId for Log {
    fn type_id() -> usize {
        type_id(FUEL_TYPES_NAMESPACE, "Log") as usize
    }
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct LogData {
    pub contract_id: ContractId,
    pub data: Vec<u8>,
    pub rb: u64,
    pub len: u64,
    pub ptr: u64,
}
impl TypeId for LogData {
    fn type_id() -> usize {
        type_id(FUEL_TYPES_NAMESPACE, "LogData") as usize
    }
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct ScriptResult {
    pub result: u64,
    pub gas_used: u64,
}
impl TypeId for ScriptResult {
    fn type_id() -> usize {
        type_id(FUEL_TYPES_NAMESPACE, "ScriptResult") as usize
    }
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct TransferOut {
    pub contract_id: ContractId,
    pub to: Address,
    pub amount: u64,
    pub asset_id: AssetId,
    pub pc: u64,
    pub is: u64,
}
impl TypeId for TransferOut {
    fn type_id() -> usize {
        type_id(FUEL_TYPES_NAMESPACE, "TransferOut") as usize
    }
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct MessageOut {
    pub message_id: MessageId,
    pub sender: Address,
    pub recipient: Address,
    pub amount: u64,
    pub nonce: Nonce,
    pub len: u64,
    pub digest: Bytes32,
    pub data: Vec<u8>,
}
impl TypeId for MessageOut {
    fn type_id() -> usize {
        type_id(FUEL_TYPES_NAMESPACE, "MessageOut") as usize
    }
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct Return {
    pub contract_id: ContractId,
    pub val: u64,
    pub pc: u64,
    pub is: u64,
}
impl TypeId for Return {
    fn type_id() -> usize {
        type_id(FUEL_TYPES_NAMESPACE, "Return") as usize
    }
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct Call {
    pub contract_id: ContractId,
    pub to: ContractId,
    pub amount: u64,
    pub asset_id: AssetId,
    pub gas: u64,
    pub fn_name: String,
}
impl TypeId for Call {
    fn type_id() -> usize {
        type_id(FUEL_TYPES_NAMESPACE, "Call") as usize
    }
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct Panic {
    pub contract_id: ContractId,
    pub reason: u32,
}
impl TypeId for Panic {
    fn type_id() -> usize {
        type_id(FUEL_TYPES_NAMESPACE, "Panic") as usize
    }
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct Revert {
    pub contract_id: ContractId,
    pub error_val: u64,
}
impl TypeId for Revert {
    fn type_id() -> usize {
        type_id(FUEL_TYPES_NAMESPACE, "Revert") as usize
    }
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct Mint {
    pub sub_id: AssetId,
    pub contract_id: ContractId,
    pub val: u64,
    pub pc: u64,
    pub is: u64,
}
impl TypeId for Mint {
    fn type_id() -> usize {
        type_id(FUEL_TYPES_NAMESPACE, "Mint") as usize
    }
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct Burn {
    pub sub_id: AssetId,
    pub contract_id: ContractId,
    pub val: u64,
    pub pc: u64,
    pub is: u64,
}
impl TypeId for Burn {
    fn type_id() -> usize {
        type_id(FUEL_TYPES_NAMESPACE, "Burn") as usize
    }
}