ckb_jsonrpc_types/cell.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
use crate::{CellOutput, JsonBytes};
use ckb_types::{
core::cell::{CellMeta, CellStatus},
prelude::Unpack,
H256,
};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
/// The JSON view of a cell with its status information.
///
/// ## Examples
///
/// ```
/// # serde_json::from_str::<ckb_jsonrpc_types::CellWithStatus>(r#"
/// {
/// "cell": {
/// "data": {
/// "content": "0x7f454c460201010000000000000000000200f3000100000078000100000000004000000000000000980000000000000005000000400038000100400003000200010000000500000000000000000000000000010000000000000001000000000082000000000000008200000000000000001000000000000001459308d00573000000002e7368737472746162002e74657874000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b000000010000000600000000000000780001000000000078000000000000000a0000000000000000000000000000000200000000000000000000000000000001000000030000000000000000000000000000000000000082000000000000001100000000000000000000000000000001000000000000000000000000000000",
/// "hash": "0x28e83a1277d48add8e72fadaa9248559e1b632bab2bd60b27955ebc4c03800a5"
/// },
/// "output": {
/// "capacity": "0x802665800",
/// "lock": {
/// "args": "0x",
/// "code_hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
/// "hash_type": "data"
/// },
/// "type": null
/// }
/// },
/// "status": "live"
/// }
/// # "#).unwrap();
/// ```
///
/// ```
/// # serde_json::from_str::<ckb_jsonrpc_types::CellWithStatus>(r#"
/// {
/// "cell": null,
/// "status": "unknown"
/// }
/// # "#).unwrap();
/// ```
#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)]
pub struct CellWithStatus {
/// The cell information.
///
/// For performance issues, CKB only keeps the information for live cells.
pub cell: Option<CellInfo>,
/// Status of the cell.
///
/// Allowed values: "live", "dead", "unknown".
///
/// * `live` - The transaction creating this cell is in the chain, and there are no
/// transactions found in the chain that uses this cell as an input.
/// * `dead` - (**Deprecated**: the dead status will be removed since 0.36.0, please do not
/// rely on the logic that differentiates dead and unknown cells.) The transaction creating
/// this cell is in the chain, and a transaction is found in the chain which uses this cell as
/// an input.
/// * `unknown` - CKB does not know the status of the cell. Either the transaction creating
/// this cell is not in the chain yet, or it is no longer live.
pub status: String,
}
/// The JSON view of a cell combining the fields in cell output and cell data.
///
/// ## Examples
///
/// ```
/// # serde_json::from_str::<ckb_jsonrpc_types::CellInfo>(r#"
/// {
/// "data": {
/// "content": "0x7f454c460201010000000000000000000200f3000100000078000100000000004000000000000000980000000000000005000000400038000100400003000200010000000500000000000000000000000000010000000000000001000000000082000000000000008200000000000000001000000000000001459308d00573000000002e7368737472746162002e74657874000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b000000010000000600000000000000780001000000000078000000000000000a0000000000000000000000000000000200000000000000000000000000000001000000030000000000000000000000000000000000000082000000000000001100000000000000000000000000000001000000000000000000000000000000",
/// "hash": "0x28e83a1277d48add8e72fadaa9248559e1b632bab2bd60b27955ebc4c03800a5"
/// },
/// "output": {
/// "capacity": "0x802665800",
/// "lock": {
/// "args": "0x",
/// "code_hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
/// "hash_type": "data"
/// },
/// "type": null
/// }
/// }
/// # "#).unwrap();
/// ```
#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)]
pub struct CellInfo {
/// Cell fields appears in the transaction `outputs` array.
pub output: CellOutput,
/// Cell data.
///
/// This is `null` when the data is not requested, which does not mean the cell data is empty.
pub data: Option<CellData>,
}
/// The cell data content and hash.
///
/// ## Examples
///
/// ```
/// # serde_json::from_str::<ckb_jsonrpc_types::CellData>(r#"
/// {
/// "content": "0x7f454c460201010000000000000000000200f3000100000078000100000000004000000000000000980000000000000005000000400038000100400003000200010000000500000000000000000000000000010000000000000001000000000082000000000000008200000000000000001000000000000001459308d00573000000002e7368737472746162002e74657874000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b000000010000000600000000000000780001000000000078000000000000000a0000000000000000000000000000000200000000000000000000000000000001000000030000000000000000000000000000000000000082000000000000001100000000000000000000000000000001000000000000000000000000000000",
/// "hash": "0x28e83a1277d48add8e72fadaa9248559e1b632bab2bd60b27955ebc4c03800a5"
/// }
/// # "#).unwrap();
/// ```
#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)]
pub struct CellData {
/// Cell content.
pub content: JsonBytes,
/// Cell content hash.
pub hash: H256,
}
impl From<CellMeta> for CellInfo {
fn from(cell_meta: CellMeta) -> Self {
let data = cell_meta.mem_cell_data;
let data_hash = cell_meta.mem_cell_data_hash;
let output = cell_meta.cell_output.into();
CellInfo {
output,
data: data.and_then(move |data| {
data_hash.map(|hash| CellData {
content: JsonBytes::from_bytes(data),
hash: hash.unpack(),
})
}),
}
}
}
impl From<CellStatus> for CellWithStatus {
fn from(status: CellStatus) -> Self {
let (cell, status) = match status {
CellStatus::Live(cell_meta) => (Some(cell_meta), "live"),
CellStatus::Dead => (None, "dead"),
CellStatus::Unknown => (None, "unknown"),
};
Self {
cell: cell.map(Into::into),
status: status.to_string(),
}
}
}