Ton

Форк
0
/
restricted-wallet-code.fc 
73 строки · 2.1 Кб
1
;; Restricted wallet (a variant of wallet-code.fc)
2
;; until configuration parameter -13 is set, accepts messages only to elector smc
3

4
() recv_internal(slice in_msg) impure {
5
  ;; do nothing for internal messages
6
}
7

8
_ restricted?() inline {
9
  var p = config_param(-13);
10
  return null?(p) ? true : begin_parse(p).preload_uint(32) > now();
11
}
12

13
_ check_destination(msg, dest) inline_ref {
14
  var cs = msg.begin_parse();
15
  var flags = cs~load_uint(4);
16
  if (flags & 8) {
17
    ;; external messages are always valid
18
    return true;
19
  }
20
  var (s_addr, d_addr) = (cs~load_msg_addr(), cs~load_msg_addr());
21
  var (dest_wc, dest_addr) = parse_std_addr(d_addr);
22
  return (dest_wc == -1) & (dest_addr == dest);
23
}
24

25
() recv_external(slice in_msg) impure {
26
  var signature = in_msg~load_bits(512);
27
  var cs = in_msg;
28
  var (msg_seqno, valid_until) = (cs~load_uint(32), cs~load_uint(32));
29
  throw_if(35, valid_until <= now());
30
  var ds = get_data().begin_parse();
31
  var (stored_seqno, public_key) = (ds~load_uint(32), ds~load_uint(256));
32
  ds.end_parse();
33
  throw_unless(33, msg_seqno == stored_seqno);
34
  ifnot (msg_seqno) {
35
    accept_message();
36
    set_data(begin_cell().store_uint(stored_seqno + 1, 32).store_uint(public_key, 256).end_cell());
37
    return ();
38
  }
39
  throw_unless(34, check_signature(slice_hash(in_msg), signature, public_key));
40
  accept_message();
41
  var restrict = restricted?();
42
  var elector = config_param(1).begin_parse().preload_uint(256);
43
  cs~touch();
44
  while (cs.slice_refs()) {
45
    var mode = cs~load_uint(8);
46
    var msg = cs~load_ref();
47
    var ok = true;
48
    if (restrict) {
49
      ok = check_destination(msg, elector);
50
    }
51
    if (ok) {
52
      send_raw_message(msg, mode);
53
    }
54
  }
55
  cs.end_parse();
56
  set_data(begin_cell().store_uint(stored_seqno + 1, 32).store_uint(public_key, 256).end_cell());
57
}
58

59
;; Get methods
60

61
int seqno() method_id {
62
  return get_data().begin_parse().preload_uint(32);
63
}
64

65
int get_public_key() method_id {
66
  var cs = get_data().begin_parse();
67
  cs~load_uint(32);
68
  return cs.preload_uint(256);
69
}
70

71
int balance() method_id {
72
  return restricted?() ? 0 : get_balance().pair_first();
73
}
74

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.