Skip to main content

defuse_core/payload/
sep53.rs

1use defuse_crypto::ed25519::{Ed25519PublicKey, Ed25519Signature};
2use defuse_sep53::Sep53;
3use near_sdk::{CryptoHash, serde::de::DeserializeOwned, serde_json};
4use serde::{Deserialize, Serialize};
5
6use crate::payload::{DefusePayload, ExtractDefusePayload, Payload, SignedPayload};
7
8#[cfg_attr(feature = "abi", derive(::schemars::JsonSchema))]
9#[derive(Debug, Clone, Serialize, Deserialize)]
10pub struct SignedSep53Payload {
11    pub payload: String,
12
13    pub public_key: Ed25519PublicKey,
14
15    pub signature: Ed25519Signature,
16}
17
18impl Payload for SignedSep53Payload {
19    #[inline]
20    fn hash(&self) -> CryptoHash {
21        Sep53::prehash(&self.payload)
22    }
23}
24
25impl SignedPayload for SignedSep53Payload {
26    type PublicKey = Ed25519PublicKey;
27
28    #[inline]
29    fn verify(&self) -> Option<Self::PublicKey> {
30        Sep53::verify(
31            &self.public_key.try_into().ok()?,
32            &self.payload,
33            &self.signature.into(),
34        )
35        .then_some(&self.public_key)
36        .copied()
37    }
38}
39
40impl<T> ExtractDefusePayload<T> for SignedSep53Payload
41where
42    T: DeserializeOwned,
43{
44    type Error = serde_json::Error;
45
46    #[inline]
47    fn extract_defuse_payload(self) -> Result<DefusePayload<T>, Self::Error> {
48        serde_json::from_str(&self.payload)
49    }
50}