use scale_info::TypeInfo;
use sp_weights::Weight;
#[cfg(any(test, feature = "mock", feature = "runtime-benchmarks"))]
use sp_std::marker::PhantomData;
pub type SignatureVerificationResult = Result<(), SignatureVerificationError>;
#[derive(Debug, Clone, Copy, TypeInfo)]
pub enum SignatureVerificationError {
SignerInformationNotPresent,
SignatureInvalid,
}
pub trait VerifySignature {
type SignerId;
type Payload;
type Signature;
fn verify(
signer: &Self::SignerId,
payload: &Self::Payload,
signature: &Self::Signature,
) -> SignatureVerificationResult;
fn weight(payload_byte_length: usize) -> Weight;
}
#[cfg(feature = "runtime-benchmarks")]
pub struct AlwaysVerify<A, P, S>(PhantomData<(A, P, S)>);
#[cfg(feature = "runtime-benchmarks")]
impl<Account, Payload, Signature: Default> VerifySignature for AlwaysVerify<Account, Payload, Signature> {
type SignerId = Account;
type Payload = Payload;
type Signature = Signature;
fn verify(
_delegate: &Self::SignerId,
_payload: &Self::Payload,
_signature: &Self::Signature,
) -> SignatureVerificationResult {
SignatureVerificationResult::Ok(())
}
fn weight(_: usize) -> Weight {
Weight::zero()
}
}
#[cfg(any(test, feature = "mock", feature = "runtime-benchmarks"))]
pub struct EqualVerify<A, B>(PhantomData<(A, B)>);
#[cfg(any(test, feature = "mock", feature = "runtime-benchmarks"))]
impl<Account, Payload> VerifySignature for EqualVerify<Account, Payload>
where
Account: PartialEq,
Payload: PartialEq,
{
type SignerId = Account;
type Payload = Payload;
type Signature = (Account, Payload);
fn verify(
delegate: &Self::SignerId,
payload: &Self::Payload,
signature: &Self::Signature,
) -> SignatureVerificationResult {
if (delegate, payload) == (&signature.0, &signature.1) {
SignatureVerificationResult::Ok(())
} else {
SignatureVerificationResult::Err(SignatureVerificationError::SignatureInvalid)
}
}
fn weight(_: usize) -> Weight {
Weight::zero()
}
}