-
Notifications
You must be signed in to change notification settings - Fork 19
/
3.fc
73 lines (59 loc) · 3.1 KB
/
3.fc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
{-
TASK 3 - ADDRESS MEMORIZER.
The aim of address memorizer contract is to remember the address set by Manager and report it to anyone who request this information.
In particular:
* when contract get internal message from Manager which contains the following three fields:
* 32-bit unsigned `op` equal to 1 [more on op's here](https://ton.org/docs/#/howto/smart-contract-guidelines?id=internal-messages)
* immediately followed by some 64-bit unsigned `query_id`,
* immediately followed by valid MsgAddress,
it should store obtained address in the storage. Note, tests will not cover cases when messages contain valid `op`, `query_id`, `address` and then something else (that means that participants may handle such messages at their discretion).
* when contract get internal message from any address which contains the following two fields:
32-bit unsigned `op` equal to `2` immediately followed by some 64-bit unsigned `query_id`, it should response to sender with message with body containing:
1) 32-bit ungisned `op` equal to 3
2) the same 64-bit unsigned `query_id`
3) Manager's address
4) Address which was memorized since last Manager request (empty address `addr_none` if there were no Manager request yet)
5) TON value attached to message should be incoming value minus processing fees
Note, tests will not cover cases when messages contain valid `op=2`, `query_id` and then something else (that means that participants may handle such messages at their discretion).
* when address memorizer get any internal message which is not covered by description above it should throw with any exit code > 1.
The initial address memorizer storage contains Manager address immediately followed by empty address (`addr_none` constructor for MsgAddress).
-}
int equal_slices (slice a, slice b) asm "SDEQ";
(slice, slice) load_data () {
var ds = get_data().begin_parse();
return (ds~load_msg_addr(), ds~load_msg_addr());
}
() save_data (slice manager_address, slice memorized_address) {
set_data(begin_cell().store_slice(owner_address).store_slice(memorized_address).end_cell());
}
;; Parse sender address from incoming message
(slice, int) parse_sender_address (cell in_msg_full) {
var cs = in_msg_full.begin_parse();
var flags = cs~load_uint(4);
slice sender_address = cs~load_msg_addr();
return (sender_address, flags);
}
;; testable
() recv_internal (int balance, int msg_value, cell in_msg_full, slice in_msg_body) {
(slice manager_address, slice memorized_address) = load_data();
int op = in_msg_body~load_int(32);
int query_id = in_msg_body~load_uint(64);
if (op == 1) {
save_data(manager, in_msg_body);
}
if (op == 2) {
var (sender_address, _) = parse_sender_address(in_msg_full);
var msg = begin_cell()
.store_uint(0x10, 6)
.store_slice(sender)
.store_grams(0)
.store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1)
.store_uint(3, 32)
.store_uint(query_id, 64)
.store_slice(manager_address)
.store_slice(memorized_address)
.end_cell();
send_raw_message(msg, 0x64);
save_data(manager_address, memorized_address);
}
}