defuse_core/payload/
nep413.rs

1use defuse_nep413::{Nep413Payload, SignedNep413Payload};
2use impl_tools::autoimpl;
3use near_sdk::{
4    AccountId, near,
5    serde::de::{self, DeserializeOwned},
6    serde_json,
7};
8
9use crate::Deadline;
10
11use super::{DefusePayload, ExtractDefusePayload};
12
13#[near(serializers = [json])]
14#[autoimpl(Deref using self.message)]
15#[autoimpl(DerefMut using self.message)]
16#[derive(Debug, Clone)]
17pub struct Nep413DefuseMessage<T> {
18    pub signer_id: AccountId,
19
20    pub deadline: Deadline,
21
22    #[serde(flatten)]
23    pub message: T,
24}
25
26impl<T> ExtractDefusePayload<T> for Nep413Payload
27where
28    T: DeserializeOwned,
29{
30    type Error = serde_json::Error;
31
32    fn extract_defuse_payload(self) -> Result<DefusePayload<T>, Self::Error> {
33        let Nep413DefuseMessage {
34            signer_id,
35            deadline,
36            message,
37        } = serde_json::from_str(&self.message)?;
38
39        Ok(DefusePayload {
40            signer_id,
41            verifying_contract: self.recipient.parse().map_err(|_| {
42                de::Error::invalid_value(de::Unexpected::Str(&self.recipient), &"AccountId")
43            })?,
44            deadline,
45            nonce: self.nonce,
46            message,
47        })
48    }
49}
50
51impl<T> ExtractDefusePayload<T> for SignedNep413Payload
52where
53    T: DeserializeOwned,
54{
55    type Error = serde_json::Error;
56
57    #[inline]
58    fn extract_defuse_payload(self) -> Result<DefusePayload<T>, Self::Error> {
59        self.payload.extract_defuse_payload()
60    }
61}