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