Ton
229 строк · 7.0 Кб
1#include "stdlib.fc";
2
3forall X -> X __tact_not_null(X x) { throw_if(128, null?(x)); return x; }
4
5global (int, slice, int, slice) __tact_context;
6global cell __tact_context_sys;
7
8(int, slice, int, slice) __tact_context_get() inline { return __tact_context; }
9
10() __tact_verify_address(slice address) inline {
11throw_unless(136, address.slice_bits() != 267);
12}
13
14builder __tact_store_bool(builder b, int v) inline {
15b = b.store_int(v, 1);
16return b;
17}
18
19(slice, slice) __tact_load_address(slice cs) inline {
20slice raw = cs~load_msg_addr();
21__tact_verify_address(raw);
22return (cs, raw);
23}
24
25builder __tact_store_address(builder b, slice address) inline {
26__tact_verify_address(address);
27b = b.store_slice(address);
28return b;
29}
30
31int __tact_address_eq(slice a, slice b) inline {
32return equal_slice_bits(a, b);
33}
34
35(slice, ((slice))) __gen_read_ChangeOwner(slice sc_0) inline_ref {
36throw_unless(129, sc_0~load_uint(32) == 256331011);
37var v'newOwner = sc_0~__tact_load_address();
38return (sc_0, (v'newOwner));
39}
40
41(slice, ((int, int))) __gen_read_Withdraw(slice sc_0) inline_ref {
42throw_unless(129, sc_0~load_uint(32) == 1672521544);
43var v'amount = sc_0~load_coins();
44var v'mode = sc_0~load_uint(8);
45return (sc_0, (v'amount, v'mode));
46}
47
48builder __gen_write_Treasure(builder build_0, (slice) v) inline_ref {
49var (v'owner) = v;
50build_0 = __tact_store_address(build_0, v'owner);
51return build_0;
52}
53
54(slice, ((slice))) __gen_read_Treasure(slice sc_0) inline_ref {
55var v'owner = sc_0~__tact_load_address();
56return (sc_0, (v'owner));
57}
58
59_ __gen_Context_get_sender((int, slice, int, slice) v) inline {
60var (v'bounced, v'sender, v'value, v'raw) = v;
61return v'sender;
62}
63
64(slice) __gen_load_Treasure() inline_ref {
65slice sc = get_data().begin_parse();
66__tact_context_sys = sc~load_ref();
67return sc~__gen_read_Treasure();
68}
69
70() __gen_store_Treasure((slice) v) impure inline_ref {
71builder b = begin_cell();
72b = b.store_ref(__tact_context_sys);
73b = __gen_write_Treasure(b, v);
74set_data(b.end_cell());
75}
76
77() $send((int, slice, int, int, cell, cell, cell) $params) impure {
78var (($params'bounce, $params'to, $params'value, $params'mode, $params'body, $params'code, $params'data)) = $params;
79builder $b = begin_cell();
80$b = store_int($b, 1, 2);
81$b = __tact_store_bool($b, $params'bounce);
82$b = store_int($b, 0, 3);
83$b = __tact_store_address($b, $params'to);
84$b = store_coins($b, $params'value);
85$b = store_int($b, 0, ((((1 + 4) + 4) + 64) + 32));
86if (((~ null?($params'code)) | (~ null?($params'data)))) {
87$b = __tact_store_bool($b, true);
88builder $bc = begin_cell();
89$bc = __tact_store_bool($bc, false);
90$bc = __tact_store_bool($bc, false);
91if ((~ null?($params'code))) {
92$bc = __tact_store_bool($bc, true);
93$bc = store_ref($bc, __tact_not_null($params'code));
94} else {
95$bc = __tact_store_bool($bc, false);
96}
97if ((~ null?($params'data))) {
98$bc = __tact_store_bool($bc, true);
99$bc = store_ref($bc, __tact_not_null($params'data));
100} else {
101$bc = __tact_store_bool($bc, false);
102}
103$bc = __tact_store_bool($bc, false);
104$b = __tact_store_bool($b, true);
105$b = store_ref($b, end_cell($bc));
106} else {
107$b = __tact_store_bool($b, false);
108}
109cell $body = $params'body;
110if ((~ null?($body))) {
111$b = __tact_store_bool($b, true);
112$b = store_ref($b, __tact_not_null($body));
113} else {
114$b = __tact_store_bool($b, false);
115}
116cell $c = end_cell($b);
117send_raw_message($c, $params'mode);
118}
119
120((slice), ()) $__gen_Treasure_requireOwner((slice) $self) impure {
121var (($self'owner)) = $self;
122throw_unless(132, __tact_address_eq(__gen_Context_get_sender(__tact_context_get()), $self'owner));
123return (($self'owner), ());
124}
125
126((slice), ()) $__gen_Treasure_doWithdraw((slice) $self, int $amount, int $mode) impure {
127var (($self'owner)) = $self;
128($self'owner)~$__gen_Treasure_requireOwner();
129$send((true, $self'owner, $amount, $mode, end_cell(begin_cell()), null(), null()));
130return (($self'owner), ());
131}
132
133slice $__gen_Treasure_owner((slice) $self) impure {
134var (($self'owner)) = $self;
135return $self'owner;
136}
137
138_ $__gen_get_owner() method_id(83229) {
139var self = __gen_load_Treasure();
140var res = $__gen_Treasure_owner(self);
141return res;
142}
143
144(((slice)), ()) $__gen_Treasure_receive_Withdraw((slice) $self, (int, int) $msg) impure {
145var ($self'owner) = $self;
146var ($msg'amount, $msg'mode) = $msg;
147($self'owner)~$__gen_Treasure_doWithdraw($msg'amount, $msg'mode);
148return (($self'owner), ());
149}
150
151((slice), ()) $__gen_Treasure_receive_comment_986c2ba124bb9287eb4a0bd8d3104e1c0067a3c93952d889c74d08185bd30d4d((slice) $self) impure {
152var ($self'owner) = $self;
153($self'owner)~$__gen_Treasure_doWithdraw(0, (32 + 128));
154return (($self'owner), ());
155}
156
157(((slice)), ()) $__gen_Treasure_receive_ChangeOwner((slice) $self, (slice) $msg) impure {
158var ($self'owner) = $self;
159var ($msg'newOwner) = $msg;
160($self'owner)~$__gen_Treasure_requireOwner();
161$self'owner = $msg'newOwner;
162return (($self'owner), ());
163}
164
165
166() recv_internal(int msg_value, cell in_msg_cell, slice in_msg) impure {
167
168;; Parse incoming message
169int op = 0;
170if (slice_bits(in_msg) >= 32) {
171op = in_msg.preload_uint(32);
172}
173var cs = in_msg_cell.begin_parse();
174var msg_flags = cs~load_uint(4);
175var msg_bounced = ((msg_flags & 1) == 1 ? true : false);
176slice msg_sender_addr = cs~load_msg_addr();
177__tact_context = (msg_bounced, msg_sender_addr, msg_value, cs);
178
179;; Handle bounced messages
180if (msg_bounced) {
181return ();
182}
183
184;; Receive Withdraw message
185if (op == 1672521544) {
186var self = __gen_load_Treasure();
187var msg = in_msg~__gen_read_Withdraw();
188self~$__gen_Treasure_receive_Withdraw(msg);
189__gen_store_Treasure(self);
190return ();
191}
192
193;; Receive ChangeOwner message
194if (op == 256331011) {
195var self = __gen_load_Treasure();
196var msg = in_msg~__gen_read_ChangeOwner();
197self~$__gen_Treasure_receive_ChangeOwner(msg);
198__gen_store_Treasure(self);
199return ();
200}
201
202;; Text Receivers
203if (op == 0) {
204var text_op = slice_hash(in_msg);
205
206;; Receive "Destroy" message
207if (text_op == 0x986c2ba124bb9287eb4a0bd8d3104e1c0067a3c93952d889c74d08185bd30d4d) {
208var self = __gen_load_Treasure();
209self~$__gen_Treasure_receive_comment_986c2ba124bb9287eb4a0bd8d3104e1c0067a3c93952d889c74d08185bd30d4d();
210__gen_store_Treasure(self);
211return ();
212}
213}
214
215throw(130);
216}
217
218_ supported_interfaces() method_id {
219return (
220"org.ton.introspection.v0"H >> 128,
221"org.ton.abi.ipfs.v0"H >> 128,
222"org.ton.ownable.transferable"H >> 128,
223"org.ton.ownable"H >> 128
224);
225}
226
227_ get_abi_ipfs() {
228return "ipfs://QmSZriPPLDUQWqjYmMRWAqKkhCeq32L339Q2PQrBaYMAqT";
229}
230