defuse_core/payload/
raw.rs

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