Ton

Форк
0
/
CreateState.fif 
360 строк · 11.5 Кб
1
"Asm.fif" include
2
"TonUtil.fif" include
3

4
31 -1<< constant wc_undef
5
0 constant wc_base
6
-1 constant wc_master
7

8
{ wcid@ 2dup <> swap wc_undef <> and
9
  abort"workchain_id already set to another value"
10
  wcid! } : setworkchain
11
{ globalid@ 2dup <> swap and
12
  abort"global_id already set to another value"
13
  dup 0= abort"global_id cannot be zero"
14
  globalid! } : setglobalid
15

16
<b b> constant empty_cell
17

18
variable @default-subwallet-id
19
@default-subwallet-id 0!
20
{ @default-subwallet-id @ } : default-subwallet-id
21
{ @default-subwallet-id ! } : default-subwallet-id!
22

23
// b x --> b'  ( serializes a Gram amount )
24
{ -1 { 1+ 2dup 8 * ufits } until
25
  rot over 4 u, -rot 8 * u, } : Gram,
26

27
// workchain-id -- wc-zero-state
28
{ <b x{9023afe2} s, globalid@ 32 i, 0 8 i, swap 32 i, 1 63 << 64 u,
29
  0 64 i, now 32 u, 0 64 i, -1 32 i, <b 0 67 u, b> ref, 0 1 u,
30
  <b 0 11 u, b> ref,
31
  <b 0 128 10 + 1+ 1+ u, b> ref, 0 1 u, b>
32
  dup isShardState? not abort"invalid ShardState created"
33
} : mkemptyShardState
34

35
' dictnew : Libs{
36
'nop : }Libs
37
{ <b swap 1 u, over ref, b> <s swap hash rot 256 udict!+
38
  0= abort"duplicate library in collection" } : lib+
39
{ 0 lib+ } : private_lib
40
{ 1 lib+ } : public_lib
41

42
{ (configdict) 0= abort"Configuration dictionary is empty" } : configdict
43

44
// version capabilities --
45
{ <b x{c4} s, rot 32 u, swap 64 u, b> 8 config! } : config.version!
46
1 constant capIhr
47
2 constant capCreateStats
48
4 constant capBounceMsgBody
49
8 constant capReportVersion
50
16 constant capSplitMergeTransactions
51
32 constant capShortDequeue
52

53
// max-validators masterchain-validators min-validators --
54
{ swap rot <b swap 16 u, swap 16 u, swap 16 u, b> 16 config! } : config.validator_num!
55

56
// min-stake max-stake min-total-stake max-factor --
57
{ 4 0 reverse <b swap Gram, swap Gram, swap Gram, swap 32 u, b>
58
  17 config!
59
} : config.validator_stake_limits!
60

61
// elected-for elections-begin-before elections-end-before stakes-frozen
62
{ 4 0 reverse <b { swap 32 u, } 4 times b> 15 config! } : config.election_params!
63

64
variable validator-dict
65
dictnew 0 validator-dict 2!
66
variable validators-weight
67
validators-weight 0!
68

69
{ validator-dict @ second } : validator#
70
{ dup 0<= abort"validator weight must be non-negative"
71
  64 ufits not abort"validator weight must fit into 64 bits"
72
} : check-val-weight
73
// ( val-pubkey weight -- c )
74
{ dup check-val-weight
75
  over Blen 32 <> abort"validator public key must be 32 bytes long"
76
  <b x{538e81278a} s, rot B, swap 64 u, b>
77
} : serialize-validator
78
// ( val-pubkey adnl weight -- c )
79
{ dup check-val-weight
80
  over 256 ufits not abort"adnl address must fit into 256 bits"
81
  rot dup Blen 32 <> abort"validator public key must be 32 bytes long"
82
  <b x{738e81278a} s, swap B, swap 64 u, swap 256 u, b>
83
} : serialize-adnl-validator
84
// ( weight val-cell -- )
85
{ swap validators-weight +!
86
  <s validator-dict 2@ dup 1+ 3 -roll swap 
87
  16 udict!+ 0= abort"cannot add validator"
88
  swap validator-dict 2!
89
} : register-validator
90
// val-pubkey weight --
91
{ tuck serialize-validator register-validator } : add-validator
92
// val-pubkey adnl-addr weight --
93
{ -rot 2 pick serialize-adnl-validator register-validator
94
} : add-adnl-validator
95
// since-ut until-ut main-val-cnt-or-0 --
96
{ ?dup 0= { validator# } if 
97
  validator# 0= abort"no initial validators defined"
98
  rot <b x{12} s, swap 32 u, rot 32 u, validator# 16 u, swap 16 u,
99
  validators-weight @ 64 u,  validator-dict @ first dict, b>
100
  34 config!
101
} : config.validators!
102

103
variable workchain-dict
104
// root-hash file-hash enable-utime actual-min-split min-split max-split workchain-id --
105
{ <b x{a6} s, 5 roll 32 u, 4 roll 8 u, 3 roll 8 u, rot 8 u, x{e000} s,
106
  3 roll 256 u, rot 256 u, 0 32 u, x{1} s, -1 32 i, 0 64 u, b>
107
  dup isWorkchainDescr? not abort"invalid WorkchainDescr created"
108
  <s swap workchain-dict @ 32 idict!+ 0= abort"cannot add workchain"
109
  workchain-dict !
110
} : add-std-workchain
111
// --
112
{ workchain-dict @ dict>s s>c 12 config! } : config.workchains!
113

114
variable special-dict
115
// special-smc-addr --
116
{ x{} swap special-dict @ 256 udict! not abort"cannot add a new special smart contract"
117
  special-dict !
118
} : make_special
119
{ special-dict @ dict>s s>c 31 config! } : config.special!
120

121
// ( l -- D )  Converts a list of parameter indices into a dictionary
122
{ dictnew { swap uncons -rot <b swap rot 32 b>idict! not abort"cannot add parameter index" over null?
123
  } until nip
124
} : param-list-to-dict
125
{ param-list-to-dict 9 config! } : config.mandatory_params!
126
{ param-list-to-dict 10 config! } : config.critical_params!
127

128
// min_tot_rounds max_tot_rounds min_wins max_losses min_store_sec max_store_sec bit_price cell_price --
129
{ 8 untuple 8 0 reverse <b x{36} s, { swap 8 u, } 4 times { swap 32 u, } 4 times b> } : cfg-prop-setup
130
// normal-prop-params critical-prop-params --
131
{ swap cfg-prop-setup swap cfg-prop-setup <b x{91} s, rot ref, swap ref, b> } : make-proposals-setup
132
{ make-proposals-setup 11 config! } : config.param_proposals_setup!
133

134
// deposit bit_pps cell_pps
135
{ 3 0 reverse <b x{1a} s, swap Gram, swap Gram, swap Gram, b> } : create-complaint-pricing
136
{ create-complaint-pricing 13 config! } : config.complaint_prices!
137

138
// bit-pps cell-pps mc-bit-pps mc-cell-pps --
139
{ <b x{cc} s, 0 32 u, 4 roll 64 u, 3 roll 64 u, rot 64 u, swap 64 u,
140
  0 dictnew 32 b>udict! 0= abort"cannot create storage prices dictionary"
141
  <b swap <s s, b> 18 config!
142
} : config.storage_prices!
143
{ 16 << } : sg*
144
{ 16 <</r } : sg*/
145
{ bl word (number) ?dup 0= abort"not a valid 2^16-based fraction" 
146
  1- { sg*/ } { sg* } cond 
147
  1 'nop
148
} ::_ sg~
149

150
// gas_price gas_limit spec_limit gas_credit block_gas_limit freeze_due_limit delete_due_limit b -- c
151
{ 7 1 reverse x{de} s, { swap 64 u, } 7 times b>
152
} : make-gas-prices-basic
153
// gas_price ... delete_due_limit flat_gas_limit flat_gas_rate -- c
154
{ 2dup or { <b x{d1} s, rot 64 u, swap 64 u, } { 2drop <b } cond
155
  make-gas-prices-basic
156
} : make-gas-prices
157
{ make-gas-prices 20 config! } : config.mc_gas_prices!
158
{ make-gas-prices 21 config! } : config.gas_prices!
159

160
// lump_price bit_price cell_price ihr_factor first_frac next_frac
161
{ 6 0 reverse <b x{ea} s, swap 64 u, swap 64 u, swap 64 u, swap 32 u, swap 16 u, swap 16 u, b>
162
} : make-msg-fwd-prices
163
{ make-msg-fwd-prices 24 config! } : config.mc_fwd_prices!
164
{ make-msg-fwd-prices 25 config! } : config.fwd_prices!
165

166
// mc-cc-lifetime sh-cc-lifetime sh-val-lifetime sh-val-num mc-shuffle
167
{ 4 1 reverse <b x{c201_} s, swap 1 i, swap 32 u, swap 32 u, swap 32 u, swap 32 u, b>
168
} : make-catchain-params
169
{ make-catchain-params 28 config! } : config.catchain_params!
170
// round-candidates next-cand-delay-ms consensus-timeout-ms fast-attempts attempt-duration cc-max-deps max-block-size max-collated-size new-cc-ids
171
{ 8 1 reverse <b x{d701_} s, swap 1 i, swap 8 u, { swap 32 u, } 7 times b> } : make-vsession-params
172
{ make-vsession-params 29 config! } : config.consensus_params!
173

174
// b [underload soft hard] -- b'
175
{ untriple 3 roll x{c3} s, 3 roll 32 u, rot 32 u, swap 32 u, } : param_limits,
176
// bytes-limits gas-limits lt-limits -- c
177
{ <b x{5d} s, 3 roll param_limits, rot param_limits, swap param_limits, b>
178
} : make-block-limits
179
{ make-block-limits 22 config! } : config.mc_block_limits!
180
{ make-block-limits 23 config! } : config.block_limits!
181

182
// mc-block-create-fee bc-block-create-fee
183
{ <b x{6b} s, rot Gram, swap Gram, b> } : make-block-create-fees
184
{ make-block-create-fees 14 config! } : config.block_create_fees!
185

186
{ <b swap 256 u, b> } : make-smc-addr-cell
187
{ make-smc-addr-cell 0 config! } : config.config_smc!
188
{ make-smc-addr-cell 1 config! } : config.elector_smc!
189
{ make-smc-addr-cell 2 config! } : config.minter_smc!
190
{ make-smc-addr-cell 3 config! } : config.collector_smc!
191

192
{ <b swap dict, b> 7 config! } : config.to_mint!
193

194
1000000000 constant Gram
195
1000000 constant mGram
196
1000 constant uGram
197
1 constant nGram
198
{ Gram * } : Gram*
199
{ mGram * } : mGram*
200
{ uGram * } : uGram*
201
'nop : nGram*
202
{ Gram swap */r } : Gram*/
203
{ mGram swap */r } : mGram*/
204
{ uGram swap */r } : uGram*/
205
{ /r } : nGram*/
206

207
// GR$.17 is equivalent to 170000000
208
{ bl word (number) ?dup 0= abort"not a valid Gram amount" 
209
  1- { Gram swap */r } { Gram * } cond 
210
  1 'nop
211
} ::_ GR$
212

213
{ 10 << } : *Ki
214
{ 20 << } : *Mi
215
{ 30 << } : *Gi
216
{ 10 <</r } : */Ki
217
{ 20 <</r } : */Mi
218
{ 30 <</r } : */Gi
219
{ 1000 * } : *K
220
{ 1000000 * } : *M
221
{ 1000000000 * } : *G
222
{ 1000 swap */r } : */K
223
{ 1000000 swap */r } : */M
224
{ 1000000000 swap */r } : */G
225

226
0 constant recv_internal
227
-1 constant recv_external
228
-2 constant run_ticktock
229
-3 constant split_prepare
230
-4 constant split_install
231

232
// public key conversion
233

234

235
// restricted wallet creation
236

237
// same as in new-wallet-v3.fif
238
"wallet-v3-code.fif" include
239
=: WCode3
240

241
"auto/wallet-code.fif" include =: WCode0
242
"auto/restricted-wallet-code.fif" include =: RWCode1
243
"auto/restricted-wallet2-code.fif" include =: RWCode2
244
"auto/restricted-wallet3-code.fif" include =: RWCode3
245

246
// pubkey amount --
247
{ over ."Key " pubkey>$ type ." -> "
248
  RWCode1  // code
249
  <b 1 32 u, 3 roll 256 u, b>  // data
250
  empty_cell  // libs
251
  3 roll  // balance
252
  0 // split_depth
253
  0 // ticktock
254
  2 // mode: create
255
  register_smc
256
  Masterchain swap 6 .Addr cr
257
} : create-wallet1
258

259
// pubkey amount
260
{ over ."W0 Key " pubkey>$ type space dup .GR ." -> "
261
  WCode3  // code
262
  <b 0 32 u, default-subwallet-id 32 u, 3 roll 256 u, b>  // data
263
  empty_cell  // libs
264
  3 roll      // balance
265
  0 0 2 register_smc
266
  Masterchain swap 6 .Addr cr
267
} : create-wallet0
268

269
// D x t -- D'
270
{ <b rot Gram, swap rot 32 b>idict! not abort"cannot add value"
271
} : rdict-entry
272
{ 86400 * } : days*
273
{ 365 * days* } : years*
274
// balance -- dict
275
{ dictnew
276
  over 31 -1<< rdict-entry
277
  over 3/4 */ 91 days* rdict-entry
278
  over 1/2 */ 183 days* rdict-entry
279
  swap 1/4 */ 365 days* rdict-entry
280
  0 548 days* rdict-entry
281
} : make-rdict1
282
{ dictnew
283
  over 31 -1<< rdict-entry
284
  over .9 */ 0 rdict-entry
285
  over .6775 */ 1 years* rdict-entry
286
  over .445 */ 2 years* rdict-entry
287
  swap .2225 */ 3 years* rdict-entry
288
  0 4 years* 86400 + rdict-entry
289
} : make-rdict2
290

291
variable 'make-rdict
292
{ 'make-rdict @ execute } : make-rdict
293

294
variable rwallet-start-at  rwallet-start-at 0!
295
now 86400 / 1+ 86400 * rwallet-start-at !
296

297
// pubkey amount --
298
{ over ."Key " pubkey>$ type ." -> "
299
  RWCode2  // code
300
  <b 1 32 u, 3 pick 256 u, rwallet-start-at @ 32 u, 
301
     3 roll make-rdict dict, b>  // data
302
  empty_cell  // libs
303
  3 roll  // balance
304
  0 // split_depth
305
  0 // ticktock
306
  2 // mode: create
307
  register_smc
308
  Masterchain swap 6 .Addr cr
309
} : create-wallet2
310

311
variable rwallet-init-pubkey
312

313
// pubkey -- addr
314
{ RWCode3  // code
315
  <b 0 32 u, default-subwallet-id 32 u,
316
     rwallet-init-pubkey @ 256 u,
317
     rot 256 u,
318
  b> // data
319
  empty_cell  // libs
320
  0  // balance
321
  0 0 0 register_smc  // compute address only
322
} : precompute-wallet3-addr
323

324
variable w3-addr
325

326
// pubkey amount 'rdict --
327
{ 'make-rdict ! over precompute-wallet3-addr w3-addr !
328
  over ."RW3 Key " pubkey>$ type space dup .GR ." -> "
329
  RWCode3  // code
330
  <b 1 32 u, default-subwallet-id 32 u, 3 roll 256 u, rwallet-start-at @ 32 u,
331
  2 pick make-rdict dict, b>  // data
332
  empty_cell  // libs
333
  3 roll  // balance
334
  0 // split_depth
335
  0 // ticktock
336
  w3-addr @  // address
337
  6 // mode: create+setaddr
338
  register_smc
339
  Masterchain swap 6 .Addr cr
340
} : create-wallet3-internal
341

342
{ ' make-rdict1 create-wallet3-internal } : create-wallet3
343
{ ' make-rdict2 create-wallet3-internal } : create-wallet3b
344

345
// pubkey amount
346
{ over ."Key " pubkey>$ type space dup .GR ." -> "
347
  WCode0  // code
348
  <b 1 32 u, 3 roll 256 u, b>  // data
349
  empty_cell  // libs
350
  3 roll  // balance
351
  0 // split_depth
352
  0 // ticktock
353
  2 // mode: create
354
  register_smc
355
  Masterchain swap 6 .Addr cr
356
} : create-wallet0a
357

358
{ dup tlb-type-lookup { nip } { "unknown TLB type " swap $+ abort } cond } : $>tlb
359
{ bl word $>tlb 1 'nop } ::_ tlb:
360
{ <b swap vmcont, b> <s tlb:VmCont tlb-dump-as } : vmcont.
361

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

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

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

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