snowbridge_outbound_queue_primitives/v2/
delivery_receipt.rsuse crate::Log;
use alloy_core::{primitives::B256, sol, sol_types::SolEvent};
use codec::Decode;
use frame_support::pallet_prelude::{Encode, TypeInfo};
use sp_core::{RuntimeDebug, H160, H256};
use sp_std::prelude::*;
sol! {
event InboundMessageDispatched(uint64 indexed nonce, bytes32 topic, bool success, bytes32 reward_address);
}
#[derive(Clone, RuntimeDebug)]
pub struct DeliveryReceipt<AccountId>
where
AccountId: From<[u8; 32]> + Clone,
{
pub gateway: H160,
pub nonce: u64,
pub topic: H256,
pub success: bool,
pub reward_address: AccountId,
}
#[derive(Copy, Clone, Encode, Decode, Eq, PartialEq, Debug, TypeInfo)]
pub enum DeliveryReceiptDecodeError {
DecodeLogFailed,
DecodeAccountFailed,
}
impl<AccountId> TryFrom<&Log> for DeliveryReceipt<AccountId>
where
AccountId: From<[u8; 32]> + Clone,
{
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(topics, &log.data, true)
.map_err(|_| DeliveryReceiptDecodeError::DecodeLogFailed)?;
let account: AccountId = AccountId::from(event.reward_address.0);
Ok(Self {
gateway: log.address,
nonce: event.nonce,
topic: H256::from_slice(event.topic.as_ref()),
success: event.success,
reward_address: account,
})
}
}