1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
//! Consensus module types.
use oasis_core_runtime::consensus::beacon::EpochTime;

use crate::types::{address::Address, message::MessageEvent, token};

/// Deposit into runtime call.
/// Transfer from consensus staking to an account in this runtime.
/// The transaction signer has a consensus layer allowance benefiting this runtime's staking
/// address. The `to` address runtime account gets the tokens.
#[derive(Clone, Debug, Default, cbor::Encode, cbor::Decode)]
pub struct Deposit {
    #[cbor(optional)]
    pub to: Option<Address>,
    pub amount: token::BaseUnits,
}

/// Withdraw from runtime call.
/// Transfer from an account in this runtime to consensus staking.
/// The `to` address consensus staking account gets the tokens.
#[derive(Clone, Debug, Default, cbor::Encode, cbor::Decode)]
pub struct Withdraw {
    #[cbor(optional)]
    pub to: Option<Address>,
    pub amount: token::BaseUnits,
}

/// Delegate from runtime call.
#[derive(Clone, Debug, Default, cbor::Encode, cbor::Decode)]
pub struct Delegate {
    pub to: Address,
    pub amount: token::BaseUnits,
    #[cbor(optional)]
    pub receipt: u64,
}

/// Undelegate into runtime call.
#[derive(Clone, Debug, Default, cbor::Encode, cbor::Decode)]
pub struct Undelegate {
    pub from: Address,
    pub shares: u128,
    #[cbor(optional)]
    pub receipt: u64,
}

/// Kind of receipt.
#[derive(Clone, Debug, Default, cbor::Encode, cbor::Decode)]
#[cfg_attr(test, derive(PartialEq, Eq))]
#[repr(u8)]
pub enum ReceiptKind {
    #[default]
    Invalid = 0,
    Delegate = 1,
    UndelegateStart = 2,
    UndelegateDone = 3,
}

impl ReceiptKind {
    /// Whether the receipt kind is valid.
    pub fn is_valid(&self) -> bool {
        !matches!(self, Self::Invalid)
    }
}

/// Take receipt internal runtime call.
#[derive(Clone, Debug, Default, cbor::Encode, cbor::Decode)]
pub struct TakeReceipt {
    pub kind: ReceiptKind,
    pub id: u64,
}

/// A receipt.
#[derive(Clone, Debug, Default, cbor::Encode, cbor::Decode)]
#[cfg_attr(test, derive(PartialEq, Eq))]
pub struct Receipt {
    /// Shares received (for delegations).
    #[cbor(optional)]
    pub shares: u128,

    /// Undelegate end epoch.
    #[cbor(optional)]
    pub epoch: EpochTime,

    /// Undelegate end receipt.
    #[cbor(optional)]
    pub receipt: u64,

    /// Amount of tokens received.
    #[cbor(optional)]
    pub amount: u128,

    /// Consensus layer error.
    #[cbor(optional)]
    pub error: Option<ConsensusError>,
}

/// Balance query.
#[derive(Clone, Debug, Default, cbor::Encode, cbor::Decode)]
pub struct BalanceQuery {
    pub address: Address,
}

/// Consensus account query.
#[derive(Clone, Debug, Default, cbor::Encode, cbor::Decode)]
pub struct ConsensusAccountQuery {
    pub address: Address,
}

/// Delegation query.
#[derive(Clone, Debug, Default, cbor::Encode, cbor::Decode)]
pub struct DelegationQuery {
    pub from: Address,
    pub to: Address,
}

/// Delegations query.
#[derive(Clone, Debug, Default, cbor::Encode, cbor::Decode)]
pub struct DelegationsQuery {
    pub from: Address,
}

/// Undelegations query.
#[derive(Clone, Debug, Default, cbor::Encode, cbor::Decode)]
pub struct UndelegationsQuery {
    pub to: Address,
}

#[derive(Clone, Debug, Default, cbor::Encode, cbor::Decode)]
pub struct AccountBalance {
    pub balance: u128,
}

/// Information about a delegation.
#[derive(Clone, Debug, Default, cbor::Encode, cbor::Decode)]
pub struct DelegationInfo {
    /// The amount of owned shares.
    pub shares: u128,

    /// Receipt identifier for this undelegation.
    #[cbor(optional)]
    pub receipt: u64,
}

/// Extended information about a delegation.
#[derive(Clone, Debug, Default, cbor::Encode, cbor::Decode)]
pub struct ExtendedDelegationInfo {
    /// Address delegated to.
    pub to: Address,
    /// The amount of owned shares.
    pub shares: u128,
}

/// Information about an undelegation.
#[derive(Clone, Debug, Default, cbor::Encode, cbor::Decode)]
pub struct UndelegationInfo {
    /// Address being undelegated from.
    pub from: Address,
    /// Epoch when the undelegation will be complete.
    pub epoch: EpochTime,
    /// The amount of undelegated shares.
    pub shares: u128,
}

/// Context for consensus transfer message handler.
#[derive(Clone, Debug, Default, cbor::Encode, cbor::Decode)]
pub struct ConsensusTransferContext {
    pub address: Address,
    #[cbor(optional)]
    pub nonce: u64,
    #[cbor(optional)]
    pub to: Address,
    pub amount: token::BaseUnits,
}

/// Context for consensus withdraw message handler.
#[derive(Clone, Debug, Default, cbor::Encode, cbor::Decode)]
pub struct ConsensusWithdrawContext {
    #[cbor(optional)]
    pub from: Address,
    #[cbor(optional)]
    pub nonce: u64,
    pub address: Address,
    pub amount: token::BaseUnits,
}

/// Context for consensus delegate message handler.
#[derive(Clone, Debug, cbor::Encode, cbor::Decode, Default)]
pub struct ConsensusDelegateContext {
    pub from: Address,
    pub nonce: u64,
    pub to: Address,
    pub amount: token::BaseUnits,
    #[cbor(optional)]
    pub receipt: bool,
}

/// Context for consensus undelegate message handler.
#[derive(Clone, Debug, cbor::Encode, cbor::Decode, Default)]
pub struct ConsensusUndelegateContext {
    pub from: Address,
    pub nonce: u64,
    pub to: Address,
    pub shares: u128,
    #[cbor(optional)]
    pub receipt: bool,
}

/// Error details from the consensus layer.
#[derive(Clone, Debug, Default, PartialEq, Eq, cbor::Encode, cbor::Decode)]
pub struct ConsensusError {
    #[cbor(optional)]
    pub module: String,

    #[cbor(optional)]
    pub code: u32,
}

impl From<MessageEvent> for ConsensusError {
    fn from(me: MessageEvent) -> Self {
        Self {
            module: me.module,
            code: me.code,
        }
    }
}