/
lib.rs
69 lines (57 loc) · 1.73 KB
/
lib.rs
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
use near_sdk::near;
use near_sdk::collections::Vector;
use near_sdk::json_types::{U128, U64};
use near_sdk::{env, AccountId, NearToken};
const POINT_ONE: NearToken = NearToken::from_millinear(100);
#[near(serializers=[json, borsh])]
pub struct PostedMessage {
pub premium: bool,
pub sender: AccountId,
pub text: String,
}
#[near(contract_state)]
pub struct GuestBook {
messages: Vector<PostedMessage>,
payments: Vector<NearToken>,
}
impl Default for GuestBook {
fn default() -> Self {
Self {
messages: Vector::new(b"m"),
payments: Vector::new(b"p"),
}
}
}
#[near]
impl GuestBook {
#[payable]
pub fn add_message(&mut self, text: String) {
let payment = env::attached_deposit();
let premium = payment >= POINT_ONE;
let sender = env::predecessor_account_id();
let message = PostedMessage {
premium,
sender,
text,
};
self.messages.push(&message);
self.payments.push(&payment);
}
pub fn get_messages(&self, from_index: Option<U128>, limit: Option<U64>) -> Vec<PostedMessage> {
let from = u128::from(from_index.unwrap_or(U128(0)));
self.messages
.iter()
.skip(from as usize)
.take(u64::from(limit.unwrap_or(U64::from(10))) as usize)
.collect()
}
pub fn get_payments(&self, from_index: Option<U128>, limit: Option<U64>) -> Vec<U128> {
let from = u128::from(from_index.unwrap_or(U128(0)));
self.payments
.iter()
.skip(from as usize)
.take(u64::from(limit.unwrap_or(U64::from(10))) as usize)
.map(|x| U128(x.as_yoctonear()))
.collect()
}
}