Ton
67 строк · 1.7 Кб
1(int) equal_slices (slice s1, slice s2) asm "SDEQ";
2
3() recv_internal(cell in_msg_cell, slice in_msg) {
4
5;; Parse message
6var cs = in_msg_cell.begin_parse();
7var flags = cs~load_uint(4); ;; int_msg_info$0 ihr_disabled:Bool bounce:Bool bounced:Bool
8slice s_addr = cs~load_msg_addr();
9
10;; Parse data
11var ds = get_data().begin_parse();
12slice address_0 = ds~load_msg_addr();
13slice address_1 = ds~load_msg_addr();
14ds~skip_bits(64);
15ds.end_parse();
16
17;; Resolve addresses address
18slice src = null();
19slice dst = null();
20if (equal_slices(s_addr, address_0)) {
21src = address_0;
22dst = address_1;
23} elseif (equal_slices(s_addr, address_1)) {
24src = address_1;
25dst = address_0;
26}
27
28;; Bounce while keeping storage fee on unknown
29;; Useful fro deploy
30if (null?(src)) {
31raw_reserve(1000000000, 2);
32var msg = begin_cell()
33.store_uint(0x10, 6)
34.store_slice(s_addr)
35.store_grams(0)
36.store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1)
37.end_cell();
38send_raw_message(msg, 128);
39return ();
40}
41
42;; Process messages
43raw_reserve(1000000000, 2);
44var msg = begin_cell()
45.store_uint(flags, 4)
46.store_uint(0, 2)
47.store_slice(dst)
48.store_grams(0)
49.store_uint(0, 1 + 4 + 4 + 64 + 32 + 1);
50
51;; Content
52if(msg.builder_bits() + 1 + in_msg.slice_bits() > 1023) {
53msg = msg.store_uint(1,1)
54.store_ref(begin_cell().store_slice(in_msg).end_cell());
55} else {
56msg = msg.store_uint(0,1)
57.store_slice(in_msg);
58}
59
60;; Send message
61send_raw_message(msg.end_cell(), 128);
62}
63
64() recv_external(slice in_msg) impure {
65;; Do not accept external messages
66throw(72);
67}