use crate::Log;
use alloy_core::{primitives::B256, sol, sol_types::SolEvent};
use codec::Decode;
use frame_support::pallet_prelude::{Encode, TypeInfo};
use sp_core::{H160, H256};
use sp_std::prelude::*;
sol! {
event InboundMessageDispatched(uint64 indexed nonce, bytes32 topic, bool success, bytes32 reward_address);
}
#[derive(Clone, Debug)]
pub struct DeliveryReceipt {
pub gateway: H160,
pub nonce: u64,
pub topic: H256,
pub success: bool,
pub reward_address: [u8; 32],
}
#[derive(Copy, Clone, Encode, Decode, Eq, PartialEq, Debug, TypeInfo)]
pub enum DeliveryReceiptDecodeError {
DecodeLogFailed,
DecodeAccountFailed,
}
impl TryFrom<&Log> for DeliveryReceipt {
type Error = DeliveryReceiptDecodeError;
fn try_from(log: &Log) -> Result<Self, Self::Error> {
let topics: Vec<B256> = log.topics.iter().map(|x| B256::from_slice(x.as_ref())).collect();
let event = InboundMessageDispatched::decode_raw_log_validate(topics, &log.data)
.map_err(|_| DeliveryReceiptDecodeError::DecodeLogFailed)?;
Ok(Self {
gateway: log.address,
nonce: event.nonce,
topic: H256::from_slice(event.topic.as_ref()),
success: event.success,
reward_address: event.reward_address.0,
})
}
}