raiden-primitives 0.1.0

Raiden Network implementation in Rust
Documentation
#![warn(clippy::missing_docs_in_private_items)]

use sha2::{
	Digest,
	Sha256,
};
use web3::signing::keccak256;

use crate::{
	constants::LOCKSROOT_OF_NO_LOCKS,
	types::{
		BalanceHash,
		LockedAmount,
		Locksroot,
		TokenAmount,
	},
};

/// Return the hash of the secret in bytes.
pub fn hash_secret(secret: &[u8]) -> [u8; 32] {
	let mut hasher = Sha256::new();
	hasher.update(secret);
	hasher.finalize().into()
}

/// Return the hash of the balance data.
pub fn hash_balance_data(
	transferred_amount: TokenAmount,
	locked_amount: LockedAmount,
	locksroot: Locksroot,
) -> Result<BalanceHash, String> {
	if locksroot.is_zero() {
		return Err("Can't hash empty locksroot".to_string())
	}

	if locksroot.0.len() != 32 {
		return Err("Locksroot has wrong length".to_string())
	}

	if transferred_amount == TokenAmount::zero() &&
		locked_amount == TokenAmount::zero() &&
		locksroot == *LOCKSROOT_OF_NO_LOCKS
	{
		return Ok(BalanceHash::zero())
	}

	let mut transferred_amount_in_bytes: [u8; 32] = [0; 32];
	transferred_amount.to_big_endian(&mut transferred_amount_in_bytes);

	let mut locked_amount_in_bytes: [u8; 32] = [0; 32];
	locked_amount.to_big_endian(&mut locked_amount_in_bytes);

	let hash = keccak256(
		&[&transferred_amount_in_bytes[..], &locked_amount_in_bytes[..], &locksroot.0[..]].concat(),
	);
	Ok(BalanceHash::from_slice(&hash))
}