Ton
185 строк · 4.2 Кб
1;;
2;; Basic workchain addresses
3;;
4
5int parse_work_addr(slice cs) {
6(int sender_wc, slice sender_addr) = parse_var_addr(cs);
7throw_unless(error::invalid_address(), 0 == sender_wc);
8return sender_addr~load_uint(256);
9}
10
11(slice) serialize_work_addr(int addr) {
12return (begin_cell()
13.store_uint(2, 2) ;; Is std address
14.store_uint(0, 1) ;; Non-unicast
15.store_uint(0, 8) ;; Basic workchain
16.store_uint(addr, 256) ;; Address hash
17).end_cell().begin_parse();
18}
19
20;;
21;; Custom Commands
22;;
23
24(int) equal_slices (slice s1, slice s2) asm "SDEQ";
25builder store_builder(builder to, builder what) asm(what to) "STB";
26builder store_builder_ref(builder to, builder what) asm(what to) "STBREFR";
27(slice, cell) load_maybe_cell(slice s) asm( -> 1 0) "LDDICT";
28(int) mod (int x, int y) asm "MOD";
29builder store_coins(builder b, int x) asm "STGRAMS";
30(slice, int) load_coins(slice s) asm( -> 1 0) "LDGRAMS";
31
32
33;;
34;; Events
35;;
36
37() send_std_message(
38slice to_addr,
39int value,
40int mode,
41int op,
42int query_id,
43builder content
44) impure {
45
46var body = begin_cell()
47.store_uint(op, 32)
48.store_uint(query_id, 64)
49.store_builder(content)
50.end_cell();
51
52var msg = begin_cell()
53.store_uint(0x10, 6)
54.store_slice(to_addr)
55.store_coins(value)
56.store_uint(1, 1 + 4 + 4 + 64 + 32 + 1 + 1)
57.store_ref(body)
58.end_cell();
59
60send_raw_message(msg, mode);
61}
62
63() send_empty_std_message(
64slice to_addr,
65int value,
66int mode,
67int op,
68int query_id
69) impure {
70
71var body = begin_cell()
72.store_uint(op, 32)
73.store_uint(query_id, 64)
74.end_cell();
75
76var msg = begin_cell()
77.store_uint(0x10, 6)
78.store_slice(to_addr)
79.store_coins(value)
80.store_uint(1, 1 + 4 + 4 + 64 + 32 + 1 + 1)
81.store_ref(body)
82.end_cell();
83
84send_raw_message(msg, mode);
85}
86
87() send_text_message(
88slice to_addr,
89int value,
90int mode,
91builder content
92) impure {
93
94var body = begin_cell()
95.store_uint(0, 32)
96.store_builder(content)
97.end_cell();
98
99var msg = begin_cell()
100.store_uint(0x10, 6)
101.store_slice(to_addr)
102.store_coins(value)
103.store_uint(1, 1 + 4 + 4 + 64 + 32 + 1 + 1)
104.store_ref(body)
105.end_cell();
106
107send_raw_message(msg, mode);
108}
109
110;;
111;; Generate
112;;
113
114(int) new_query_id() inline {
115return now() + mod(cur_lt(), 4294967296);
116}
117
118;;
119;; Text Utils
120;;
121
122(int, int) encode_number_to_text(int number) {
123int len = 0;
124int value = 0;
125int mult = 1;
126do {
127(number, int res) = number.divmod(10);
128value = value + (res + 48) * mult;
129mult = mult * 256;
130len = len + 1;
131} until (number == 0);
132return (len, value);
133}
134
135builder store_coins_string(builder msg, int amount) {
136(int ceil, int res) = divmod(amount, 1000000000);
137(int cl, int cv) = encode_number_to_text(ceil);
138msg = msg.store_uint(cv, cl * 8 );
139msg = msg.store_uint(46, 8); ;; "."
140(int rl, int rv) = encode_number_to_text(res);
141;; repeat( 9 - rl ) {
142;; msg = msg.store_uint(48, 8); ;; " "
143;; }
144return msg.store_uint(rv, rl * 8);
145}
146
147
148;; 'Stake'
149builder store_text_stake(builder b) inline {
150return b.store_uint(358434827109, 40);
151}
152
153;; ' '
154builder store_text_space(builder b) inline {
155return b.store_uint(32, 8);
156}
157
158;; 'accepted'
159builder store_text_accepted(builder b) inline {
160return b.store_uint(7017561931702887780, 64);
161}
162
163;; Stake 123.333 accepted
164builder store_accepted_stake(builder b, int amount) inline {
165return b.store_text_stake()
166.store_text_space()
167.store_coins_string(amount)
168.store_text_space()
169.store_text_accepted();
170}
171
172;; 'Withdraw completed'
173builder store_withdraw_completed(builder b) inline {
174return b.store_uint(7614653257073527469736132165096662684165476, 144);
175}
176
177;; 'Withdraw requested. Please, retry the command when your balance is ready.'
178builder store_withdraw_delayed(builder b) inline {
179return b
180.store_uint(1949351233810823032252520485584178069312463918, 152) ;; 'Withdraw requested.'
181.store_text_space()
182.store_uint(555062058613674355757418046597367430905687018487295295368960255172568430, 240) ;; 'Please, retry the command when'
183.store_text_space()
184.store_uint(45434371896731988359547695118970428857702208118225198, 176); ;; 'your balance is ready.'
185}