defuse_core/payload/
mod.rs

1pub mod erc191;
2pub mod multi;
3pub mod nep413;
4pub mod raw;
5pub mod sep53;
6pub mod tip191;
7pub mod ton_connect;
8pub mod webauthn;
9
10use core::convert::Infallible;
11
12use defuse_serde_utils::base64::Base64;
13use impl_tools::autoimpl;
14use near_sdk::{AccountId, near};
15use serde_with::serde_as;
16
17use crate::{Deadline, Nonce};
18
19// TODO: add version
20#[near(serializers = [json])]
21#[autoimpl(Deref using self.message)]
22#[autoimpl(DerefMut using self.message)]
23#[derive(Debug, Clone)]
24pub struct DefusePayload<T> {
25    pub signer_id: AccountId,
26    pub verifying_contract: AccountId,
27    pub deadline: Deadline,
28    #[serde_as(as = "Base64")]
29    #[cfg_attr(feature = "abi", schemars(example = "self::examples::nonce"))]
30    pub nonce: Nonce,
31
32    #[serde(flatten)]
33    pub message: T,
34}
35
36pub trait ExtractDefusePayload<T> {
37    type Error;
38
39    fn extract_defuse_payload(self) -> Result<DefusePayload<T>, Self::Error>;
40}
41
42impl<T> ExtractDefusePayload<T> for DefusePayload<T> {
43    type Error = Infallible;
44
45    #[inline]
46    fn extract_defuse_payload(self) -> Result<Self, Self::Error> {
47        Ok(self)
48    }
49}
50
51#[cfg(feature = "abi")]
52mod examples {
53    use super::*;
54
55    use near_sdk::base64::{self, Engine};
56
57    pub fn nonce() -> String {
58        base64::engine::general_purpose::STANDARD.encode(Nonce::default())
59    }
60}