Ton
175 строк · 4.8 Кб
1() op_deposit(int member, int value) impure {
2
3;; Read extras
4var (enabled, udpates_enabled, min_stake, deposit_fee, withdraw_fee, pool_fee, receipt_price) = ctx_extras;
5throw_unless(error::invalid_message(), enabled);
6
7;; Read stake value
8int fee = receipt_price + deposit_fee;
9int stake = value - fee;
10throw_unless(error::invalid_stake_value(), stake >= min_stake);
11
12;; Load nominators
13load_member(member);
14
15;; Add deposit
16member_stake_deposit(stake);
17
18;; Resolve address
19var address = ctx_owner;
20if (member != owner_id()) {
21address = serialize_work_addr(member);
22}
23
24;; Send receipt
25if (ctx_query_id == 0) {
26send_text_message(
27address,
28receipt_price,
29send_mode::default(),
30begin_cell()
31.store_accepted_stake(stake)
32);
33} else {
34send_empty_std_message(
35address,
36receipt_price,
37send_mode::default(),
38op::stake_deposit::response(),
39ctx_query_id
40);
41}
42
43;; Persist
44store_member();
45store_base_data();
46}
47
48() op_withdraw(int member, int value, int stake) impure {
49
50;; Read extras
51var (enabled, udpates_enabled, min_stake, deposit_fee, withdraw_fee, pool_fee, receipt_price) = ctx_extras;
52
53;; Check fee
54int fee = receipt_price + withdraw_fee;
55
56;; Check value
57throw_unless(error::too_low_value(), value == fee);
58
59;; Load member
60load_member(member);
61
62;; Try to withdraw immediatelly
63var (withdrawed, all) = member_stake_withdraw(stake);
64
65;; Resolve address
66var address = ctx_owner;
67if (member != owner_id()) {
68address = serialize_work_addr(member);
69}
70
71;; Send receipt
72if (ctx_query_id == 0) {
73send_text_message(
74address,
75withdrawed + receipt_price,
76send_mode::default(),
77all ? begin_cell().store_withdraw_completed() : begin_cell().store_withdraw_delayed()
78);
79} else {
80send_empty_std_message(
81address,
82withdrawed + receipt_price,
83send_mode::default(),
84all ? op::stake_withdraw::response() : op::stake_withdraw::delayed(),
85ctx_query_id
86);
87}
88
89;; Persist
90store_member();
91store_base_data();
92}
93
94() op_donate(int value) impure {
95
96;; Check value
97throw_unless(error::invalid_message(), value >= 2 * coins::1());
98
99;; Distribute profit to everyone
100distribute_profit(value - coins::1());
101
102;; Persist
103store_base_data();
104}
105
106() op_upgrade(int value, slice in_msg) impure {
107
108;; Read extras
109var (enabled, udpates_enabled, min_stake, deposit_fee, withdraw_fee, pool_fee, receipt_price) = ctx_extras;
110throw_unless(error::invalid_message(), udpates_enabled);
111
112;; Check value
113throw_unless(error::too_low_value(), value >= fees::deploy());
114
115;; Upgrade code
116var code = in_msg~load_ref();
117in_msg.end_parse();
118set_code(code);
119
120;; Send receipt
121send_empty_std_message(
122ctx_owner,
1230,
124send_mode::carry_remaining_value(),
125op::upgrade::response(),
126ctx_query_id
127);
128}
129
130() op_update(int value, slice in_msg) impure {
131
132;; Read extras
133var (enabled, udpates_enabled, min_stake, deposit_fee, withdraw_fee, pool_fee, receipt_price) = ctx_extras;
134
135;; Check value
136throw_unless(error::too_low_value(), value >= fees::deploy());
137
138;; Check extras
139var newExtras = in_msg~load_ref();
140var es = newExtras.begin_parse();
141var new_enabled = es~load_int(1);
142var new_udpates_enabled = es~load_int(1);
143var new_min_stake = es~load_coins();
144var new_deposit_fee = es~load_coins();
145var new_withdraw_fee = es~load_coins();
146var new_pool_fee = es~load_coins();
147var new_receipt_price = es~load_coins();
148es.end_parse();
149
150;; Once upgrades are disabled: prohibit re-enabling
151throw_if(error::invalid_message(), (~ udpates_enabled) & new_udpates_enabled);
152
153;; At least min_stake
154throw_unless(error::invalid_message(), new_min_stake >= params::min_stake());
155;; At least op fee
156throw_unless(error::invalid_message(), new_deposit_fee >= fees::op());
157throw_unless(error::invalid_message(), new_withdraw_fee >= fees::op());
158;; Must be in 0...10000
159throw_unless(error::invalid_message(), new_pool_fee <= 100 * 100);
160;; At least receipt price
161throw_unless(error::invalid_message(), new_receipt_price >= fees::receipt());
162
163;; Persist extras
164ctx_extras = (new_enabled, new_udpates_enabled, new_min_stake, new_deposit_fee, new_withdraw_fee, new_pool_fee, new_receipt_price);
165store_base_data();
166
167;; Send receipt
168send_empty_std_message(
169ctx_owner,
1700,
171send_mode::carry_remaining_value(),
172op::update::response(),
173ctx_query_id
174);
175}