defuse_core/payload/
ton_connect.rs1use defuse_ton_connect::{SignedTonConnectPayload, TonConnectPayload, TonConnectPayloadSchema};
2use near_sdk::{
3 serde::de::{DeserializeOwned, Error},
4 serde_json,
5};
6
7use super::{DefusePayload, ExtractDefusePayload};
8
9impl<T> ExtractDefusePayload<T> for SignedTonConnectPayload
10where
11 T: DeserializeOwned,
12{
13 type Error = serde_json::Error;
14
15 #[inline]
16 fn extract_defuse_payload(self) -> Result<DefusePayload<T>, Self::Error> {
17 self.payload.extract_defuse_payload()
18 }
19}
20
21impl<T> ExtractDefusePayload<T> for TonConnectPayload
22where
23 T: DeserializeOwned,
24{
25 type Error = serde_json::Error;
26
27 fn extract_defuse_payload(self) -> Result<DefusePayload<T>, Self::Error> {
28 let TonConnectPayloadSchema::Text { text } = self.payload else {
29 return Err(Error::custom("only text payload supported"));
30 };
31
32 let p: DefusePayload<T> = serde_json::from_str(&text)?;
33
34 if p.deadline.into_timestamp() < self.timestamp {
44 return Err(Error::custom("deadline < timestamp"));
45 }
46
47 Ok(p)
48 }
49}