diem_types/transaction/
metadata.rs

1// Copyright (c) The Diem Core Contributors
2// SPDX-License-Identifier: Apache-2.0
3
4// Copyright 2021 Conflux Foundation. All rights reserved.
5// Conflux is free software and distributed under GNU General Public License.
6// See http://www.gnu.org/licenses/
7
8//! This file implements Diem transaction metadata types to allow
9//! easy parsing and introspection into metadata, whether the transaction
10//! is using regular subaddressing, is subject to travel rule or corresponds
11//! to an on-chain payment refund.
12
13use serde::{Deserialize, Serialize};
14
15/// List of all supported metadata types
16#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
17pub enum Metadata {
18    Undefined,
19    GeneralMetadata(GeneralMetadata),
20    TravelRuleMetadata(TravelRuleMetadata),
21    UnstructuredBytesMetadata(UnstructuredBytesMetadata),
22    RefundMetadata(RefundMetadata),
23    CoinTradeMetadata(CoinTradeMetadata),
24}
25
26/// List of supported transaction metadata format versions for regular
27/// addressing with optional subaddressing or refund reference
28#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
29pub enum GeneralMetadata {
30    GeneralMetadataVersion0(GeneralMetadataV0),
31}
32
33/// Transaction metadata for regular addressing with optional subaddressing
34/// or refunded transaction reference
35#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
36pub struct GeneralMetadataV0 {
37    /// Subaddress to which the funds are being sent
38    #[serde(with = "serde_bytes")]
39    to_subaddress: Option<Vec<u8>>,
40    /// Subaddress from which the funds are being sent
41    #[serde(with = "serde_bytes")]
42    from_subaddress: Option<Vec<u8>>,
43    /// In the case of refunds, referenced_event refers to the event sequence
44    /// number of the sender’s original sent payment event.
45    /// Since refunds are just another form of P2P transfer, the referenced
46    /// event field allows a refunded payment to refer back to the original
47    /// payment
48    referenced_event: Option<u64>,
49}
50
51impl GeneralMetadataV0 {
52    pub fn new(
53        to_subaddress: Option<Vec<u8>>, from_subaddress: Option<Vec<u8>>,
54        referenced_event: Option<u64>,
55    ) -> Self {
56        GeneralMetadataV0 {
57            to_subaddress,
58            from_subaddress,
59            referenced_event,
60        }
61    }
62
63    pub fn to_subaddress(&self) -> &Option<Vec<u8>> { &self.to_subaddress }
64
65    pub fn from_subaddress(&self) -> &Option<Vec<u8>> { &self.from_subaddress }
66
67    pub fn referenced_event(&self) -> &Option<u64> { &self.referenced_event }
68}
69
70/// List of supported transaction metadata format versions for transactions
71/// subject to travel rule
72#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
73pub enum TravelRuleMetadata {
74    TravelRuleMetadataVersion0(TravelRuleMetadataV0),
75}
76
77/// Transaction metadata format for transactions subject to travel rule
78#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
79pub struct TravelRuleMetadataV0 {
80    /// Off-chain reference_id.  Used when off-chain APIs are used.
81    /// Specifies the off-chain reference ID that was agreed upon in off-chain
82    /// APIs.
83    off_chain_reference_id: Option<String>,
84}
85
86/// Opaque binary transaction metadata
87#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
88pub struct UnstructuredBytesMetadata {
89    /// Unstructured byte vector metadata
90    #[serde(with = "serde_bytes")]
91    metadata: Option<Vec<u8>>,
92}
93
94/// List of supported transaction metadata format versions for refund
95/// transaction
96#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
97pub enum RefundMetadata {
98    RefundMetadataV0(RefundMetadataV0),
99}
100
101/// Transaction metadata format for transactions subject to refund transaction
102#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
103pub struct RefundMetadataV0 {
104    /// Transaction version that is refunded
105    pub transaction_version: u64,
106    /// The reason of the refund
107    pub reason: RefundReason,
108}
109
110#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
111pub enum RefundReason {
112    OtherReason,
113    InvalidSubaddress,
114    UserInitiatedPartialRefund,
115    UserInitiatedFullRefund,
116}
117
118/// List of supported transaction metadata format versions for coin trade
119/// transaction
120#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
121pub enum CoinTradeMetadata {
122    CoinTradeMetadataV0(CoinTradeMetadataV0),
123}
124
125/// Transaction metadata format for coin trades (purchases/sells)
126#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
127pub struct CoinTradeMetadataV0 {
128    /// A list of trade_ids this transaction wants to settle
129    pub trade_ids: Vec<String>,
130}