defuse_core/payload/
raw.rs

1use defuse_crypto::{Curve, Ed25519, Payload, SignedPayload, VerifiableCurve, serde::AsCurve};
2use defuse_digest::{Digest, Sha256};
3use near_sdk::{near, serde::de::DeserializeOwned, serde_json};
4use serde_with::serde_as;
5
6use super::ExtractDefusePayload;
7
8#[near(serializers = [borsh, json])]
9#[derive(Debug, Clone)]
10pub struct SignedRawEd25519Payload {
11    pub payload: String,
12
13    #[serde_as(as = "AsCurve<Ed25519>")]
14    pub public_key: <Ed25519 as Curve>::PublicKey,
15    #[serde_as(as = "AsCurve<Ed25519>")]
16    pub signature: <Ed25519 as Curve>::Signature,
17}
18
19impl Payload for SignedRawEd25519Payload {
20    #[inline]
21    fn hash(&self) -> [u8; 32] {
22        Sha256::digest(self.payload.as_bytes()).into()
23    }
24}
25
26impl SignedPayload for SignedRawEd25519Payload {
27    type PublicKey = <Ed25519 as Curve>::PublicKey;
28
29    #[inline]
30    fn verify(&self) -> Option<Self::PublicKey> {
31        Ed25519::verify(&self.signature, self.payload.as_bytes(), &self.public_key)
32    }
33}
34
35impl<T> ExtractDefusePayload<T> for SignedRawEd25519Payload
36where
37    T: DeserializeOwned,
38{
39    type Error = serde_json::Error;
40
41    fn extract_defuse_payload(self) -> Result<super::DefusePayload<T>, Self::Error> {
42        serde_json::from_str(&self.payload)
43    }
44}