Ton
104 строки · 2.5 Кб
1(slice, (int)) ~parse_text_command(slice in_msg) {
2int op = 0;
3;; 3 possible commands deposit, recover, withdraw
4int first_char = in_msg~load_uint(8);
5
6;; Deposit
7if( first_char == 68 ) { ;; D
8throw_unless(error::unknown_text_command(), in_msg~load_uint(48) == 111533580577140); ;; eposit
9op = op::stake_deposit();
10}
11
12;; Withdraw
13if( first_char == 87 ) { ;; W
14throw_unless(error::unknown_text_command(), in_msg~load_uint(56) == 29682864265257335); ;; ithdraw
15op = op::stake_withdraw();
16}
17
18;; Recover
19if( first_char == 82 ) { ;; R
20throw_unless(error::unknown_text_command(), in_msg~load_uint(48) == 111477746197874); ;; ecover
21op = op::stake_recover();
22}
23
24return (in_msg, (op));
25}
26
27() op_nominators(int member, int flags, int value, slice in_msg) impure {
28
29;; Ignore bounced
30if (flags & 1) {
31return ();
32}
33
34;; Check value
35throw_unless(error::invalid_message(), value >= params::min_op());
36
37;; Parse operation
38int op = in_msg~load_uint(32);
39
40;; Text operations
41if (op == 0) {
42ctx_query_id = 0;
43op = in_msg~parse_text_command();
44
45;; Deposit stake
46if (op == op::stake_deposit()) {
47op_deposit(member, value);
48return ();
49}
50
51;; Withdraw stake
52if (op == op::stake_withdraw()) {
53op_withdraw(member, value, 0);
54return ();
55}
56
57;; Recover stake
58if (op == op::stake_recover()) {
59load_validator_data();
60op_stake_recover(value);
61return ();
62}
63
64;; Unknown message
65throw(error::invalid_message());
66return ();
67}
68
69int query_id = in_msg~load_uint(64);
70int gas_limit = in_msg~load_coins();
71set_gas_limit(gas_limit);
72ctx_query_id = query_id;
73throw_unless(error::invalid_message(), ctx_query_id > 0);
74
75;; Deposit stake
76if (op == op::stake_deposit()) {
77op_deposit(member, value);
78return ();
79}
80
81;; Withdraw stake
82if (op == op::stake_withdraw()) {
83int stake = in_msg~load_coins();
84in_msg.end_parse();
85op_withdraw(member, value, stake);
86return ();
87}
88
89;; Recover stake
90if (op == op::stake_recover()) {
91load_validator_data();
92op_stake_recover(value);
93return ();
94}
95
96;; Donate stake
97if (op == op::donate()) {
98op_donate(value);
99return ();
100}
101
102;; Unknown message
103throw(error::invalid_message());
104}