#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[cfg(feature = "serde")]
mod serde_pubkeys_33 {
use serde::de::{Error, SeqAccess, Visitor};
use serde::ser::SerializeSeq;
use serde::{Deserializer, Serializer};
use std::fmt;
pub fn serialize<S>(pubkeys: &Vec<[u8; 33]>, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut seq = serializer.serialize_seq(Some(pubkeys.len()))?;
for pubkey in pubkeys {
seq.serialize_element(&pubkey.as_slice())?;
}
seq.end()
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<Vec<[u8; 33]>, D::Error>
where
D: Deserializer<'de>,
{
struct PubkeysVisitor;
impl<'de> Visitor<'de> for PubkeysVisitor {
type Value = Vec<[u8; 33]>;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("a sequence of 33-byte public keys")
}
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
where
A: SeqAccess<'de>,
{
let mut pubkeys = Vec::with_capacity(seq.size_hint().unwrap_or(0));
while let Some(pubkey) = seq.next_element::<Vec<u8>>()? {
if pubkey.len() != 33 {
return Err(A::Error::custom("public key must be exactly 33 bytes"));
}
let mut out = [0u8; 33];
out.copy_from_slice(&pubkey);
pubkeys.push(out);
}
Ok(pubkeys)
}
}
deserializer.deserialize_seq(PubkeysVisitor)
}
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", serde(rename_all = "lowercase"))]
pub enum HashType {
Data,
Type,
Data1,
}
impl HashType {
pub fn to_byte(&self) -> u8 {
match self {
HashType::Data => 0,
HashType::Type => 1,
HashType::Data1 => 2,
}
}
pub fn from_byte(b: u8) -> Option<Self> {
match b {
0 => Some(HashType::Data),
1 => Some(HashType::Type),
2 => Some(HashType::Data1),
_ => None,
}
}
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ScriptLike {
pub code_hash: [u8; 32],
pub hash_type: HashType,
pub args: Vec<u8>,
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct RegistrySpec {
pub code_hash: [u8; 32],
pub hash_type: HashType,
pub type_id_value: [u8; 32],
pub required: bool,
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Debug, Clone)]
pub struct CellDepLike {
pub type_script: Option<ScriptLike>,
pub data: Vec<u8>,
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Debug, Clone)]
pub struct TxOutputLike {
pub lock_args: Vec<u8>,
pub type_args: Option<Vec<u8>>,
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Debug, Clone)]
pub struct UnsignedTxLike {
pub cell_deps: Vec<CellDepLike>,
pub outputs: Vec<TxOutputLike>,
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Debug, Clone)]
pub struct FirewallConfig {
pub registries: Vec<RegistrySpec>,
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Debug, Clone)]
pub struct RegistryEntry {
pub identifier: Vec<u8>,
pub expires_at: u64,
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Debug, Clone)]
pub struct GovernanceHeader {
pub signer_count: u8,
pub threshold: u8,
#[cfg_attr(feature = "serde", serde(with = "serde_pubkeys_33"))]
pub pubkeys: Vec<[u8; 33]>,
pub validator_count: u16,
pub validator_merkle_root: [u8; 32],
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Debug, Clone)]
pub struct RegistryPayload {
pub version: u8,
pub entries: Vec<RegistryEntry>,
pub governance_header: Option<GovernanceHeader>,
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct OutPointLike {
pub tx_hash: [u8; 32],
pub index: u32,
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Debug, Clone)]
pub struct TransactionCellDep {
pub out_point: OutPointLike,
pub dep_type: DepType,
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))]
pub enum DepType {
Code,
DepGroup,
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Debug, Clone)]
pub struct FirewallSpendDepsConfig {
pub firewall_lock_out_point: OutPointLike,
pub inner_lock_out_point: OutPointLike,
pub registry_out_points: Vec<OutPointLike>,
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Debug, Clone)]
pub struct FirewallLockConfig {
pub firewall_code_hash: [u8; 32],
pub firewall_hash_type: HashType,
pub flags: u8,
pub registries: Vec<RegistrySpec>,
pub inner_code_hash: [u8; 32],
pub inner_hash_type: HashType,
pub inner_args: Vec<u8>,
}