1#![cfg(feature = "std")]
2
3use fuel_core_chain_config::CoinConfig;
4use fuel_core_client::client::schema::coins::Coin as ClientCoin;
5use fuel_tx::{AssetId, UtxoId};
6
7use crate::bech32::Bech32Address;
8
9#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
10pub enum CoinStatus {
11 #[default]
12 Unspent,
13 Spent,
14}
15
16#[derive(Debug, Clone, PartialEq, Eq, Hash)]
17pub struct Coin {
18 pub amount: u64,
19 pub block_created: u32,
20 pub asset_id: AssetId,
21 pub utxo_id: UtxoId,
22 pub maturity: u32,
23 pub owner: Bech32Address,
24 pub status: CoinStatus,
25}
26
27impl From<ClientCoin> for Coin {
28 fn from(coin: ClientCoin) -> Self {
29 Self {
30 amount: coin.amount.0,
31 block_created: coin.block_created.0,
32 asset_id: coin.asset_id.0 .0,
33 utxo_id: coin.utxo_id.0 .0,
34 maturity: coin.maturity.0,
35 owner: coin.owner.0 .0.into(),
36 status: CoinStatus::Unspent,
37 }
38 }
39}
40
41impl From<Coin> for CoinConfig {
42 fn from(coin: Coin) -> CoinConfig {
43 Self {
44 tx_id: Some(*coin.utxo_id.tx_id()),
45 output_index: Some(coin.utxo_id.output_index()),
46 tx_pointer_block_height: Some(coin.block_created.into()),
47 tx_pointer_tx_idx: None,
48 maturity: Some(coin.maturity.into()),
49 owner: coin.owner.into(),
50 amount: coin.amount,
51 asset_id: coin.asset_id,
52 }
53 }
54}