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