defuse_core/payload/
mod.rs1pub 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 impl_tools::autoimpl;
13use near_sdk::{AccountId, CryptoHash};
14use serde::{Deserialize, Serialize};
15use serde_with::{base64::Base64, serde_as};
16
17use crate::{Nonce, Timestamp};
18
19#[serde_as]
21#[autoimpl(Deref using self.message)]
22#[autoimpl(DerefMut using self.message)]
23#[cfg_attr(feature = "abi", derive(::schemars::JsonSchema))]
24#[derive(Debug, Clone, Serialize, Deserialize)]
25pub struct DefusePayload<T> {
26 pub signer_id: AccountId,
27 pub verifying_contract: AccountId,
28 pub deadline: Timestamp,
29 #[serde_as(as = "Base64")]
30 #[cfg_attr(feature = "abi", schemars(example = "self::examples::nonce"))]
31 pub nonce: Nonce,
32
33 #[serde(flatten)]
34 pub message: T,
35}
36
37pub trait ExtractDefusePayload<T> {
38 type Error;
39
40 fn extract_defuse_payload(self) -> Result<DefusePayload<T>, Self::Error>;
41}
42
43impl<T> ExtractDefusePayload<T> for DefusePayload<T> {
44 type Error = Infallible;
45
46 #[inline]
47 fn extract_defuse_payload(self) -> Result<Self, Self::Error> {
48 Ok(self)
49 }
50}
51
52pub trait Payload {
58 fn hash(&self) -> CryptoHash;
59}
60
61pub trait SignedPayload: Payload {
67 type PublicKey;
68
69 fn verify(&self) -> Option<Self::PublicKey>;
70}
71
72#[cfg(feature = "abi")]
73mod examples {
74 use super::Nonce;
75
76 use near_sdk::base64::{self, Engine};
77
78 pub fn nonce() -> String {
79 base64::engine::general_purpose::STANDARD.encode(Nonce::default())
80 }
81}