defuse_core/payload/
sep53.rs1use 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}