use frc42_dispatch::method_hash;
use fvm_actor_utils::receiver::{ReceiverHook, ReceiverHookError, ReceiverType, RecipientData};
use fvm_ipld_encoding::tuple::*;
use fvm_ipld_encoding::RawBytes;
use fvm_shared::{address::Address, ActorID};
use crate::types::TokenID;
pub const FRC53_TOKEN_TYPE: ReceiverType = method_hash!("FRC53") as u32;
pub trait FRC53ReceiverHook<T: RecipientData> {
fn new_frc53(
address: Address,
frc53_params: FRC53TokenReceived,
result_data: T,
) -> std::result::Result<ReceiverHook<T>, ReceiverHookError>;
}
impl<T: RecipientData> FRC53ReceiverHook<T> for ReceiverHook<T> {
fn new_frc53(
address: Address,
frc53_params: FRC53TokenReceived,
result_data: T,
) -> std::result::Result<ReceiverHook<T>, ReceiverHookError> {
Ok(ReceiverHook::new(
address,
RawBytes::serialize(frc53_params)?,
FRC53_TOKEN_TYPE,
result_data,
))
}
}
#[derive(Serialize_tuple, Deserialize_tuple, PartialEq, Eq, Clone, Debug)]
pub struct FRC53TokenReceived {
pub to: ActorID,
pub operator: ActorID,
pub token_ids: Vec<TokenID>,
pub operator_data: RawBytes,
pub token_data: RawBytes,
}