use mohan::{
ser,
hash::H256,
dalek::scalar::Scalar
};
use mohan::fast_merkle_root;
use std::iter::FromIterator;
use serde::{ Serialize, Deserialize };
#[derive(Copy, Clone, PartialEq, Eq, Default, PartialOrd, Ord, Hash, Debug, Serialize, Deserialize)]
pub struct AssetId(H256);
impl AssetId {
pub fn from_inner(inner: H256) -> AssetId {
AssetId(inner)
}
pub fn into_inner(self) -> H256 {
self.0
}
pub fn into_scalar(self) -> Scalar {
self.0.into_scalar()
}
pub fn generate_asset_entropy(
prevout_hash: H256,
pubkey_hash: H256,
) -> H256 {
fast_merkle_root(vec![prevout_hash, pubkey_hash])
}
pub fn from_entropy(entropy: H256) -> AssetId {
AssetId(fast_merkle_root(vec![entropy, H256::zero()]))
}
pub fn reissuance_token_from_entropy(entropy: H256, confidential: bool) -> AssetId {
let second = match confidential {
false => H256::from_vec(&vec![1]),
true => H256::from_vec(&vec![2]),
};
AssetId(fast_merkle_root(vec![entropy, second]))
}
}
impl ser::Writeable for AssetId {
fn write<W: ser::Writer>(&self, writer: &mut W) -> Result<(), ser::Error> {
self.0.write(writer)?;
Ok(())
}
}
impl ser::Readable for AssetId {
fn read(reader: &mut dyn ser::Reader) -> Result<AssetId, ser::Error> {
let id = H256::read(reader)?;
Ok(AssetId(id))
}
}
impl ::std::fmt::Display for AssetId {
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
::std::fmt::Display::fmt(&self.0, f)
}
}