mirror of
				https://github.com/ton-blockchain/ton
				synced 2025-03-09 15:40:10 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			360 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			360 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| "Asm.fif" include
 | |
| "TonUtil.fif" include
 | |
| 
 | |
| 31 -1<< constant wc_undef
 | |
| 0 constant wc_base
 | |
| -1 constant wc_master
 | |
| 
 | |
| { wcid@ 2dup <> swap wc_undef <> and
 | |
|   abort"workchain_id already set to another value"
 | |
|   wcid! } : setworkchain
 | |
| { globalid@ 2dup <> swap and
 | |
|   abort"global_id already set to another value"
 | |
|   dup 0= abort"global_id cannot be zero"
 | |
|   globalid! } : setglobalid
 | |
| 
 | |
| <b b> constant empty_cell
 | |
| 
 | |
| variable @default-subwallet-id
 | |
| @default-subwallet-id 0!
 | |
| { @default-subwallet-id @ } : default-subwallet-id
 | |
| { @default-subwallet-id ! } : default-subwallet-id!
 | |
| 
 | |
| // b x --> b'  ( serializes a Gram amount )
 | |
| { -1 { 1+ 2dup 8 * ufits } until
 | |
|   rot over 4 u, -rot 8 * u, } : Gram,
 | |
| 
 | |
| // workchain-id -- wc-zero-state
 | |
| { <b x{9023afe2} s, globalid@ 32 i, 0 8 i, swap 32 i, 1 63 << 64 u,
 | |
|   0 64 i, now 32 u, 0 64 i, -1 32 i, <b 0 67 u, b> ref, 0 1 u,
 | |
|   <b 0 11 u, b> ref,
 | |
|   <b 0 128 10 + 1+ 1+ u, b> ref, 0 1 u, b>
 | |
|   dup isShardState? not abort"invalid ShardState created"
 | |
| } : mkemptyShardState
 | |
| 
 | |
| ' dictnew : Libs{
 | |
| 'nop : }Libs
 | |
| { <b swap 1 u, over ref, b> <s swap hash rot 256 udict!+
 | |
|   0= abort"duplicate library in collection" } : lib+
 | |
| { 0 lib+ } : private_lib
 | |
| { 1 lib+ } : public_lib
 | |
| 
 | |
| { (configdict) 0= abort"Configuration dictionary is empty" } : configdict
 | |
| 
 | |
| // version capabilities --
 | |
| { <b x{c4} s, rot 32 u, swap 64 u, b> 8 config! } : config.version!
 | |
| 1 constant capIhr
 | |
| 2 constant capCreateStats
 | |
| 4 constant capBounceMsgBody
 | |
| 8 constant capReportVersion
 | |
| 16 constant capSplitMergeTransactions
 | |
| 32 constant capShortDequeue
 | |
| 
 | |
| // max-validators masterchain-validators min-validators --
 | |
| { swap rot <b swap 16 u, swap 16 u, swap 16 u, b> 16 config! } : config.validator_num!
 | |
| 
 | |
| // min-stake max-stake min-total-stake max-factor --
 | |
| { 4 0 reverse <b swap Gram, swap Gram, swap Gram, swap 32 u, b>
 | |
|   17 config!
 | |
| } : config.validator_stake_limits!
 | |
| 
 | |
| // elected-for elections-begin-before elections-end-before stakes-frozen
 | |
| { 4 0 reverse <b { swap 32 u, } 4 times b> 15 config! } : config.election_params!
 | |
| 
 | |
| variable validator-dict
 | |
| dictnew 0 validator-dict 2!
 | |
| variable validators-weight
 | |
| validators-weight 0!
 | |
| 
 | |
| { validator-dict @ second } : validator#
 | |
| { dup 0<= abort"validator weight must be non-negative"
 | |
|   64 ufits not abort"validator weight must fit into 64 bits"
 | |
| } : check-val-weight
 | |
| // ( val-pubkey weight -- c )
 | |
| { dup check-val-weight
 | |
|   over Blen 32 <> abort"validator public key must be 32 bytes long"
 | |
|   <b x{538e81278a} s, rot B, swap 64 u, b>
 | |
| } : serialize-validator
 | |
| // ( val-pubkey adnl weight -- c )
 | |
| { dup check-val-weight
 | |
|   over 256 ufits not abort"adnl address must fit into 256 bits"
 | |
|   rot dup Blen 32 <> abort"validator public key must be 32 bytes long"
 | |
|   <b x{738e81278a} s, swap B, swap 64 u, swap 256 u, b>
 | |
| } : serialize-adnl-validator
 | |
| // ( weight val-cell -- )
 | |
| { swap validators-weight +!
 | |
|   <s validator-dict 2@ dup 1+ 3 -roll swap 
 | |
|   16 udict!+ 0= abort"cannot add validator"
 | |
|   swap validator-dict 2!
 | |
| } : register-validator
 | |
| // val-pubkey weight --
 | |
| { tuck serialize-validator register-validator } : add-validator
 | |
| // val-pubkey adnl-addr weight --
 | |
| { -rot 2 pick serialize-adnl-validator register-validator
 | |
| } : add-adnl-validator
 | |
| // since-ut until-ut main-val-cnt-or-0 --
 | |
| { ?dup 0= { validator# } if 
 | |
|   validator# 0= abort"no initial validators defined"
 | |
|   rot <b x{12} s, swap 32 u, rot 32 u, validator# 16 u, swap 16 u,
 | |
|   validators-weight @ 64 u,  validator-dict @ first dict, b>
 | |
|   34 config!
 | |
| } : config.validators!
 | |
| 
 | |
| variable workchain-dict
 | |
| // root-hash file-hash enable-utime actual-min-split min-split max-split workchain-id --
 | |
| { <b x{a6} s, 5 roll 32 u, 4 roll 8 u, 3 roll 8 u, rot 8 u, x{e000} s,
 | |
|   3 roll 256 u, rot 256 u, 0 32 u, x{1} s, -1 32 i, 0 64 u, b>
 | |
|   dup isWorkchainDescr? not abort"invalid WorkchainDescr created"
 | |
|   <s swap workchain-dict @ 32 idict!+ 0= abort"cannot add workchain"
 | |
|   workchain-dict !
 | |
| } : add-std-workchain
 | |
| // --
 | |
| { workchain-dict @ dict>s s>c 12 config! } : config.workchains!
 | |
| 
 | |
| variable special-dict
 | |
| // special-smc-addr --
 | |
| { x{} swap special-dict @ 256 udict! not abort"cannot add a new special smart contract"
 | |
|   special-dict !
 | |
| } : make_special
 | |
| { special-dict @ dict>s s>c 31 config! } : config.special!
 | |
| 
 | |
| // ( l -- D )  Converts a list of parameter indices into a dictionary
 | |
| { dictnew { swap uncons -rot <b swap rot 32 b>idict! not abort"cannot add parameter index" over null?
 | |
|   } until nip
 | |
| } : param-list-to-dict
 | |
| { param-list-to-dict 9 config! } : config.mandatory_params!
 | |
| { param-list-to-dict 10 config! } : config.critical_params!
 | |
| 
 | |
| // min_tot_rounds max_tot_rounds min_wins max_losses min_store_sec max_store_sec bit_price cell_price --
 | |
| { 8 untuple 8 0 reverse <b x{36} s, { swap 8 u, } 4 times { swap 32 u, } 4 times b> } : cfg-prop-setup
 | |
| // normal-prop-params critical-prop-params --
 | |
| { swap cfg-prop-setup swap cfg-prop-setup <b x{91} s, rot ref, swap ref, b> } : make-proposals-setup
 | |
| { make-proposals-setup 11 config! } : config.param_proposals_setup!
 | |
| 
 | |
| // deposit bit_pps cell_pps
 | |
| { 3 0 reverse <b x{1a} s, swap Gram, swap Gram, swap Gram, b> } : create-complaint-pricing
 | |
| { create-complaint-pricing 13 config! } : config.complaint_prices!
 | |
| 
 | |
| // bit-pps cell-pps mc-bit-pps mc-cell-pps --
 | |
| { <b x{cc} s, 0 32 u, 4 roll 64 u, 3 roll 64 u, rot 64 u, swap 64 u,
 | |
|   0 dictnew 32 b>udict! 0= abort"cannot create storage prices dictionary"
 | |
|   <b swap <s s, b> 18 config!
 | |
| } : config.storage_prices!
 | |
| { 16 << } : sg*
 | |
| { 16 <</r } : sg*/
 | |
| { bl word (number) ?dup 0= abort"not a valid 2^16-based fraction" 
 | |
|   1- { sg*/ } { sg* } cond 
 | |
|   1 'nop
 | |
| } ::_ sg~
 | |
| 
 | |
| // gas_price gas_limit spec_limit gas_credit block_gas_limit freeze_due_limit delete_due_limit b -- c
 | |
| { 7 1 reverse x{de} s, { swap 64 u, } 7 times b>
 | |
| } : make-gas-prices-basic
 | |
| // gas_price ... delete_due_limit flat_gas_limit flat_gas_rate -- c
 | |
| { 2dup or { <b x{d1} s, rot 64 u, swap 64 u, } { 2drop <b } cond
 | |
|   make-gas-prices-basic
 | |
| } : make-gas-prices
 | |
| { make-gas-prices 20 config! } : config.mc_gas_prices!
 | |
| { make-gas-prices 21 config! } : config.gas_prices!
 | |
| 
 | |
| // lump_price bit_price cell_price ihr_factor first_frac next_frac
 | |
| { 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>
 | |
| } : make-msg-fwd-prices
 | |
| { make-msg-fwd-prices 24 config! } : config.mc_fwd_prices!
 | |
| { make-msg-fwd-prices 25 config! } : config.fwd_prices!
 | |
| 
 | |
| // mc-cc-lifetime sh-cc-lifetime sh-val-lifetime sh-val-num mc-shuffle
 | |
| { 4 1 reverse <b x{c201_} s, swap 1 i, swap 32 u, swap 32 u, swap 32 u, swap 32 u, b>
 | |
| } : make-catchain-params
 | |
| { make-catchain-params 28 config! } : config.catchain_params!
 | |
| // 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
 | |
| { 8 1 reverse <b x{d701_} s, swap 1 i, swap 8 u, { swap 32 u, } 7 times b> } : make-vsession-params
 | |
| { make-vsession-params 29 config! } : config.consensus_params!
 | |
| 
 | |
| // b [underload soft hard] -- b'
 | |
| { untriple 3 roll x{c3} s, 3 roll 32 u, rot 32 u, swap 32 u, } : param_limits,
 | |
| // bytes-limits gas-limits lt-limits -- c
 | |
| { <b x{5d} s, 3 roll param_limits, rot param_limits, swap param_limits, b>
 | |
| } : make-block-limits
 | |
| { make-block-limits 22 config! } : config.mc_block_limits!
 | |
| { make-block-limits 23 config! } : config.block_limits!
 | |
| 
 | |
| // mc-block-create-fee bc-block-create-fee
 | |
| { <b x{6b} s, rot Gram, swap Gram, b> } : make-block-create-fees
 | |
| { make-block-create-fees 14 config! } : config.block_create_fees!
 | |
| 
 | |
| { <b swap 256 u, b> } : make-smc-addr-cell
 | |
| { make-smc-addr-cell 0 config! } : config.config_smc!
 | |
| { make-smc-addr-cell 1 config! } : config.elector_smc!
 | |
| { make-smc-addr-cell 2 config! } : config.minter_smc!
 | |
| { make-smc-addr-cell 3 config! } : config.collector_smc!
 | |
| 
 | |
| { <b swap dict, b> 7 config! } : config.to_mint!
 | |
| 
 | |
| 1000000000 constant Gram
 | |
| 1000000 constant mGram
 | |
| 1000 constant uGram
 | |
| 1 constant nGram
 | |
| { Gram * } : Gram*
 | |
| { mGram * } : mGram*
 | |
| { uGram * } : uGram*
 | |
| 'nop : nGram*
 | |
| { Gram swap */r } : Gram*/
 | |
| { mGram swap */r } : mGram*/
 | |
| { uGram swap */r } : uGram*/
 | |
| { /r } : nGram*/
 | |
| 
 | |
| // GR$.17 is equivalent to 170000000
 | |
| { bl word (number) ?dup 0= abort"not a valid Gram amount" 
 | |
|   1- { Gram swap */r } { Gram * } cond 
 | |
|   1 'nop
 | |
| } ::_ GR$
 | |
| 
 | |
| { 10 << } : *Ki
 | |
| { 20 << } : *Mi
 | |
| { 30 << } : *Gi
 | |
| { 10 <</r } : */Ki
 | |
| { 20 <</r } : */Mi
 | |
| { 30 <</r } : */Gi
 | |
| { 1000 * } : *K
 | |
| { 1000000 * } : *M
 | |
| { 1000000000 * } : *G
 | |
| { 1000 swap */r } : */K
 | |
| { 1000000 swap */r } : */M
 | |
| { 1000000000 swap */r } : */G
 | |
| 
 | |
| 0 constant recv_internal
 | |
| -1 constant recv_external
 | |
| -2 constant run_ticktock
 | |
| -3 constant split_prepare
 | |
| -4 constant split_install
 | |
| 
 | |
| // public key conversion
 | |
| 
 | |
| 
 | |
| // restricted wallet creation
 | |
| 
 | |
| // same as in new-wallet-v3.fif
 | |
| "wallet-v3-code.fif" include
 | |
| =: WCode3
 | |
| 
 | |
| "auto/wallet-code.fif" include =: WCode0
 | |
| "auto/restricted-wallet-code.fif" include =: RWCode1
 | |
| "auto/restricted-wallet2-code.fif" include =: RWCode2
 | |
| "auto/restricted-wallet3-code.fif" include =: RWCode3
 | |
| 
 | |
| // pubkey amount --
 | |
| { over ."Key " pubkey>$ type ." -> "
 | |
|   RWCode1  // code
 | |
|   <b 1 32 u, 3 roll 256 u, b>  // data
 | |
|   empty_cell  // libs
 | |
|   3 roll  // balance
 | |
|   0 // split_depth
 | |
|   0 // ticktock
 | |
|   2 // mode: create
 | |
|   register_smc
 | |
|   Masterchain swap 6 .Addr cr
 | |
| } : create-wallet1
 | |
| 
 | |
| // pubkey amount
 | |
| { over ."W0 Key " pubkey>$ type space dup .GR ." -> "
 | |
|   WCode3  // code
 | |
|   <b 0 32 u, default-subwallet-id 32 u, 3 roll 256 u, b>  // data
 | |
|   empty_cell  // libs
 | |
|   3 roll      // balance
 | |
|   0 0 2 register_smc
 | |
|   Masterchain swap 6 .Addr cr
 | |
| } : create-wallet0
 | |
| 
 | |
| // D x t -- D'
 | |
| { <b rot Gram, swap rot 32 b>idict! not abort"cannot add value"
 | |
| } : rdict-entry
 | |
| { 86400 * } : days*
 | |
| { 365 * days* } : years*
 | |
| // balance -- dict
 | |
| { dictnew
 | |
|   over 31 -1<< rdict-entry
 | |
|   over 3/4 */ 91 days* rdict-entry
 | |
|   over 1/2 */ 183 days* rdict-entry
 | |
|   swap 1/4 */ 365 days* rdict-entry
 | |
|   0 548 days* rdict-entry
 | |
| } : make-rdict1
 | |
| { dictnew
 | |
|   over 31 -1<< rdict-entry
 | |
|   over .9 */ 0 rdict-entry
 | |
|   over .6775 */ 1 years* rdict-entry
 | |
|   over .445 */ 2 years* rdict-entry
 | |
|   swap .2225 */ 3 years* rdict-entry
 | |
|   0 4 years* 86400 + rdict-entry
 | |
| } : make-rdict2
 | |
| 
 | |
| variable 'make-rdict
 | |
| { 'make-rdict @ execute } : make-rdict
 | |
| 
 | |
| variable rwallet-start-at  rwallet-start-at 0!
 | |
| now 86400 / 1+ 86400 * rwallet-start-at !
 | |
| 
 | |
| // pubkey amount --
 | |
| { over ."Key " pubkey>$ type ." -> "
 | |
|   RWCode2  // code
 | |
|   <b 1 32 u, 3 pick 256 u, rwallet-start-at @ 32 u, 
 | |
|      3 roll make-rdict dict, b>  // data
 | |
|   empty_cell  // libs
 | |
|   3 roll  // balance
 | |
|   0 // split_depth
 | |
|   0 // ticktock
 | |
|   2 // mode: create
 | |
|   register_smc
 | |
|   Masterchain swap 6 .Addr cr
 | |
| } : create-wallet2
 | |
| 
 | |
| variable rwallet-init-pubkey
 | |
| 
 | |
| // pubkey -- addr
 | |
| { RWCode3  // code
 | |
|   <b 0 32 u, default-subwallet-id 32 u,
 | |
|      rwallet-init-pubkey @ 256 u,
 | |
|      rot 256 u,
 | |
|   b> // data
 | |
|   empty_cell  // libs
 | |
|   0  // balance
 | |
|   0 0 0 register_smc  // compute address only
 | |
| } : precompute-wallet3-addr
 | |
| 
 | |
| variable w3-addr
 | |
| 
 | |
| // pubkey amount 'rdict --
 | |
| { 'make-rdict ! over precompute-wallet3-addr w3-addr !
 | |
|   over ."RW3 Key " pubkey>$ type space dup .GR ." -> "
 | |
|   RWCode3  // code
 | |
|   <b 1 32 u, default-subwallet-id 32 u, 3 roll 256 u, rwallet-start-at @ 32 u,
 | |
|   2 pick make-rdict dict, b>  // data
 | |
|   empty_cell  // libs
 | |
|   3 roll  // balance
 | |
|   0 // split_depth
 | |
|   0 // ticktock
 | |
|   w3-addr @  // address
 | |
|   6 // mode: create+setaddr
 | |
|   register_smc
 | |
|   Masterchain swap 6 .Addr cr
 | |
| } : create-wallet3-internal
 | |
| 
 | |
| { ' make-rdict1 create-wallet3-internal } : create-wallet3
 | |
| { ' make-rdict2 create-wallet3-internal } : create-wallet3b
 | |
| 
 | |
| // pubkey amount
 | |
| { over ."Key " pubkey>$ type space dup .GR ." -> "
 | |
|   WCode0  // code
 | |
|   <b 1 32 u, 3 roll 256 u, b>  // data
 | |
|   empty_cell  // libs
 | |
|   3 roll  // balance
 | |
|   0 // split_depth
 | |
|   0 // ticktock
 | |
|   2 // mode: create
 | |
|   register_smc
 | |
|   Masterchain swap 6 .Addr cr
 | |
| } : create-wallet0a
 | |
| 
 | |
| { dup tlb-type-lookup { nip } { "unknown TLB type " swap $+ abort } cond } : $>tlb
 | |
| { bl word $>tlb 1 'nop } ::_ tlb:
 | |
| { <b swap vmcont, b> <s tlb:VmCont tlb-dump-as } : vmcont.
 |