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