Ton

Форк
0
185 строк · 4.2 Кб
1
;;
2
;; Basic workchain addresses
3
;;
4

5
int parse_work_addr(slice cs) {
6
  (int sender_wc, slice sender_addr) = parse_var_addr(cs);
7
  throw_unless(error::invalid_address(), 0 == sender_wc);
8
  return sender_addr~load_uint(256);
9
}
10

11
(slice) serialize_work_addr(int addr) {
12
   return (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";
25
builder store_builder(builder to, builder what) asm(what to) "STB";
26
builder 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";
29
builder 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(
38
  slice to_addr,
39
  int value,
40
  int mode, 
41
  int op, 
42
  int query_id,
43
  builder content
44
) impure {
45

46
  var body = begin_cell()
47
      .store_uint(op, 32)
48
      .store_uint(query_id, 64)
49
      .store_builder(content)
50
  .end_cell();
51

52
  var 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

60
  send_raw_message(msg, mode);
61
}
62

63
() send_empty_std_message(
64
  slice to_addr,
65
  int value,
66
  int mode, 
67
  int op, 
68
  int query_id
69
) impure {
70

71
  var body = begin_cell()
72
      .store_uint(op, 32)
73
      .store_uint(query_id, 64)
74
  .end_cell();
75

76
  var 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

84
  send_raw_message(msg, mode);
85
}
86

87
() send_text_message(
88
  slice to_addr,
89
  int value,
90
  int mode, 
91
  builder content
92
) impure {
93

94
  var body = begin_cell()
95
      .store_uint(0, 32)
96
      .store_builder(content)
97
  .end_cell();
98

99
  var 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

107
  send_raw_message(msg, mode);
108
}
109

110
;;
111
;; Generate
112
;;
113

114
(int) new_query_id() inline {
115
    return now() + mod(cur_lt(), 4294967296);
116
}
117

118
;;
119
;; Text Utils
120
;;
121

122
(int, int) encode_number_to_text(int number) {
123
  int len = 0;
124
  int value = 0;
125
  int mult = 1;
126
  do {
127
    (number, int res) = number.divmod(10);
128
    value = value + (res + 48) * mult;
129
    mult = mult * 256;
130
    len = len + 1;
131
  } until (number == 0);
132
  return (len, value);
133
}
134

135
builder 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);
138
  msg = msg.store_uint(cv, cl * 8 );
139
  msg = 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
  ;; }
144
  return msg.store_uint(rv, rl * 8);
145
}
146

147

148
;; 'Stake'
149
builder store_text_stake(builder b) inline {
150
    return b.store_uint(358434827109, 40);
151
}
152

153
;; ' '
154
builder store_text_space(builder b) inline {
155
    return b.store_uint(32, 8);
156
}
157

158
;; 'accepted'
159
builder store_text_accepted(builder b) inline {
160
    return b.store_uint(7017561931702887780, 64);
161
}
162

163
;; Stake 123.333 accepted
164
builder store_accepted_stake(builder b, int amount) inline {
165
    return 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'
173
builder store_withdraw_completed(builder b) inline {
174
    return b.store_uint(7614653257073527469736132165096662684165476, 144);
175
}
176

177
;; 'Withdraw requested. Please, retry the command when your balance is ready.'
178
builder store_withdraw_delayed(builder b) inline {
179
    return 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
}

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

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

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

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