use core::fmt::Debug;
use codec::{Decode, DecodeWithMemTracking, Encode};
use scale_info::TypeInfo;
use frame_system::offchain::{AppCrypto, SignedPayload, SigningTypes};
use sp_application_crypto::app_crypto;
use sp_core::offchain::KeyTypeId;
use sp_runtime::{MultiSignature, MultiSigner, RuntimeDebug};
pub use ed25519::AffidavitCryptoEd25519;
pub use sr25519::AffidavitCryptoSr25519;
pub const AFDT_KEY_TYPE: KeyTypeId = KeyTypeId(*b"afdt");
pub mod sr25519 {
use super::*;
mod app_sr25519 {
use super::*;
use sp_application_crypto::sr25519;
app_crypto!(sr25519, AFDT_KEY_TYPE);
}
sp_application_crypto::with_pair! {
pub type AffidavitPair = app_sr25519::Pair;
}
pub type AffidavitSignature = app_sr25519::Signature;
pub type AffidavitPublic = app_sr25519::Public;
pub struct AffidavitCryptoSr25519;
impl AppCrypto<MultiSigner, MultiSignature> for AffidavitCryptoSr25519 {
type RuntimeAppPublic = AffidavitPublic;
type GenericSignature = sp_application_crypto::sr25519::Signature;
type GenericPublic = sp_application_crypto::sr25519::Public;
}
}
pub mod ed25519 {
use super::*;
mod app_ed25519 {
use super::*;
use sp_application_crypto::ed25519;
app_crypto!(ed25519, AFDT_KEY_TYPE);
}
sp_application_crypto::with_pair! {
pub type AffidavitPair = app_ed25519::Pair;
}
pub type AffidavitSignature = app_ed25519::Signature;
pub type AffidavitPublic = app_ed25519::Public;
pub struct AffidavitCryptoEd25519;
impl AppCrypto<MultiSigner, MultiSignature> for AffidavitCryptoEd25519 {
type RuntimeAppPublic = AffidavitPublic;
type GenericSignature = sp_application_crypto::ed25519::Signature;
type GenericPublic = sp_application_crypto::ed25519::Public;
}
}
#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo, DecodeWithMemTracking)]
pub struct AffidavitPayload<Public, AccountId>
where
Public: Debug + TypeInfo,
AccountId: Debug + TypeInfo,
{
pub public: Public,
pub rotate: AccountId,
}
impl<T: SigningTypes<Public = Public>, Public, AccountId> SignedPayload<T>
for AffidavitPayload<Public, AccountId>
where
Public: Encode + Debug + TypeInfo + Clone,
AccountId: Encode + Debug + TypeInfo + Clone,
{
fn public(&self) -> <T as SigningTypes>::Public {
self.public.clone()
}
}
#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo, DecodeWithMemTracking)]
pub struct ValidatePayload<Public>
where
Public: Debug + TypeInfo,
{
pub public: Public,
}
impl<T: SigningTypes<Public = Public>, Public> SignedPayload<T> for ValidatePayload<Public>
where
Public: Encode + Debug + TypeInfo + Clone,
{
fn public(&self) -> <T as SigningTypes>::Public {
self.public.clone()
}
}
#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo, DecodeWithMemTracking)]
pub struct ElectionPayload<Public>
where
Public: Debug + TypeInfo,
{
pub public: Public,
}
impl<T: SigningTypes<Public = Public>, Public> SignedPayload<T> for ElectionPayload<Public>
where
Public: Encode + Debug + TypeInfo + Clone,
{
fn public(&self) -> <T as SigningTypes>::Public {
self.public.clone()
}
}