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
use super::{Message, UnsignedMessage};
use address::Address;
use crypto::{Error as CryptoError, Signature, Signer};
use encoding::tuple::*;
use encoding::Cbor;
use vm::{MethodNum, Serialized, TokenAmount};
#[derive(PartialEq, Clone, Debug, Serialize_tuple, Deserialize_tuple)]
pub struct SignedMessage {
message: UnsignedMessage,
signature: Signature,
}
impl SignedMessage {
pub fn new<S: Signer>(message: UnsignedMessage, signer: &S) -> Result<Self, CryptoError> {
let bz = message.marshal_cbor()?;
let signature = signer.sign_bytes(bz, message.from())?;
Ok(SignedMessage { message, signature })
}
pub fn message(&self) -> &UnsignedMessage {
&self.message
}
pub fn signature(&self) -> &Signature {
&self.signature
}
}
impl Message for SignedMessage {
fn from(&self) -> &Address {
self.message.from()
}
fn to(&self) -> &Address {
self.message.to()
}
fn sequence(&self) -> u64 {
self.message.sequence()
}
fn value(&self) -> &TokenAmount {
self.message.value()
}
fn method_num(&self) -> MethodNum {
self.message.method_num()
}
fn params(&self) -> &Serialized {
self.message.params()
}
fn gas_price(&self) -> &TokenAmount {
self.message.gas_price()
}
fn gas_limit(&self) -> u64 {
self.message.gas_limit()
}
fn required_funds(&self) -> TokenAmount {
self.message.required_funds()
}
}
impl Cbor for SignedMessage {}
#[cfg(feature = "json")]
pub mod json {
use super::*;
use crate::unsigned_message;
use crypto::signature;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
#[derive(Deserialize, Serialize)]
#[serde(transparent)]
pub struct SignedMessageJson(#[serde(with = "self")] pub SignedMessage);
#[derive(Serialize)]
#[serde(transparent)]
pub struct SignedMessageJsonRef<'a>(#[serde(with = "self")] pub &'a SignedMessage);
pub fn serialize<S>(m: &SignedMessage, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
#[derive(Serialize)]
struct SignedMessageSer<'a> {
#[serde(rename = "Message", with = "unsigned_message::json")]
message: &'a UnsignedMessage,
#[serde(rename = "Signature", with = "signature::json")]
signature: &'a Signature,
}
SignedMessageSer {
message: &m.message,
signature: &m.signature,
}
.serialize(serializer)
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<SignedMessage, D::Error>
where
D: Deserializer<'de>,
{
#[derive(Serialize, Deserialize)]
struct SignedMessageDe {
#[serde(rename = "Message", with = "unsigned_message::json")]
message: UnsignedMessage,
#[serde(rename = "Signature", with = "signature::json")]
signature: Signature,
}
let SignedMessageDe { message, signature } = Deserialize::deserialize(deserializer)?;
Ok(SignedMessage { message, signature })
}
}