raiden-primitives 0.1.0

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

use web3::{
	ethabi::{
		encode,
		Token,
	},
	types::U256,
};

use crate::types::{
	Address,
	BalanceHash,
	BlockExpiration,
	Bytes,
	CanonicalIdentifier,
	ChainID,
	MessageHash,
	MessageTypeId,
	Nonce,
	OneToNAddress,
	Signature,
	TokenAmount,
	TokenNetworkAddress,
};

/// Return packed balance proof data in bytes.
pub fn pack_balance_proof(
	nonce: Nonce,
	balance_hash: BalanceHash,
	additional_hash: MessageHash,
	canonical_identifier: CanonicalIdentifier,
	msg_type: MessageTypeId,
) -> Bytes {
	let mut b = vec![];

	b.extend(canonical_identifier.token_network_address.as_bytes());
	b.extend(encode(&[Token::Uint(canonical_identifier.chain_identifier.into())]));
	b.extend(encode(&[Token::Uint(U256::from(msg_type as u8))]));
	b.extend(encode(&[Token::Uint(canonical_identifier.channel_identifier)]));
	b.extend(balance_hash.as_bytes());
	b.extend(encode(&[Token::Uint(nonce)]));
	b.extend(additional_hash.as_bytes());

	Bytes(b)
}

/// Return packed balance proof data in bytes with partner's signature.
pub fn pack_balance_proof_message(
	nonce: Nonce,
	balance_hash: BalanceHash,
	additional_hash: MessageHash,
	canonical_identifier: CanonicalIdentifier,
	msg_type: MessageTypeId,
	partner_signature: Signature,
) -> Bytes {
	let mut b =
		pack_balance_proof(nonce, balance_hash, additional_hash, canonical_identifier, msg_type);

	b.0.extend(&partner_signature.0);

	b
}

/// Return packed withdraw data in bytes.
pub fn pack_withdraw(
	canonical_identifier: CanonicalIdentifier,
	participant: Address,
	total_withdraw: TokenAmount,
	expiration_block: BlockExpiration,
) -> Bytes {
	let mut b = vec![];

	b.extend(canonical_identifier.token_network_address.as_bytes());
	b.extend(encode(&[Token::Uint(canonical_identifier.chain_identifier.into())]));
	b.extend(encode(&[Token::Uint(U256::from(MessageTypeId::Withdraw as u8))]));
	b.extend(encode(&[Token::Uint(canonical_identifier.channel_identifier)]));
	b.extend(participant.as_bytes());
	b.extend(encode(&[Token::Uint(total_withdraw)]));
	b.extend(encode(&[Token::Uint(expiration_block.into())]));

	Bytes(b)
}

/// Return packed reward proof data in bytes.
pub fn pack_reward_proof(
	monitoring_service_contract_address: Address,
	chain_id: ChainID,
	token_network_address: TokenNetworkAddress,
	non_closing_participant: Address,
	non_closing_signature: Signature,
	reward_amount: TokenAmount,
) -> Bytes {
	let mut b = vec![];

	b.extend(monitoring_service_contract_address.as_bytes());
	b.extend(encode(&[Token::Uint(chain_id.into())]));
	b.extend(encode(&[Token::Uint(U256::from(MessageTypeId::MSReward as u8))]));
	b.extend(token_network_address.as_bytes());
	b.extend(non_closing_participant.as_bytes());
	b.extend(non_closing_signature.0);
	b.extend(encode(&[Token::Uint(reward_amount)]));

	Bytes(b)
}

/// Return packed OneToN IOU data in bytes.
pub fn pack_one_to_n_iou(
	one_to_n_address: OneToNAddress,
	sender: Address,
	receiver: Address,
	amount: TokenAmount,
	expiration_block: BlockExpiration,
	chain_id: ChainID,
) -> Bytes {
	let mut b = one_to_n_address.as_bytes().to_vec();
	b.extend(encode(&[Token::Uint(chain_id.into())]));
	b.extend(encode(&[Token::Uint(U256::from(MessageTypeId::IOU as u8))]));
	b.extend(sender.as_bytes());
	b.extend(receiver.as_bytes());
	b.extend(encode(&[Token::Uint(amount)]));
	b.extend(encode(&[Token::Uint(expiration_block.into())]));

	Bytes(b)
}