mirror of
				https://github.com/ton-blockchain/ton
				synced 2025-03-09 15:40:10 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			208 lines
		
	
	
	
		
			14 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			208 lines
		
	
	
	
		
			14 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| ;; Standard library for funC
 | |
| ;;
 | |
| 
 | |
| forall X -> tuple cons(X head, tuple tail) pure asm "CONS";
 | |
| forall X -> (X, tuple) uncons(tuple list) pure asm "UNCONS";
 | |
| forall X -> (tuple, X) list_next(tuple list) pure asm( -> 1 0) "UNCONS";
 | |
| forall X -> X car(tuple list) pure asm "CAR";
 | |
| tuple cdr(tuple list) pure asm "CDR";
 | |
| tuple empty_tuple() pure asm "NIL";
 | |
| forall X -> tuple tpush(tuple t, X value) pure asm "TPUSH";
 | |
| forall X -> (tuple, ()) ~tpush(tuple t, X value) pure asm "TPUSH";
 | |
| forall X -> [X] single(X x) pure asm "SINGLE";
 | |
| forall X -> X unsingle([X] t) pure asm "UNSINGLE";
 | |
| forall X, Y -> [X, Y] pair(X x, Y y) pure asm "PAIR";
 | |
| forall X, Y -> (X, Y) unpair([X, Y] t) pure asm "UNPAIR";
 | |
| forall X, Y, Z -> [X, Y, Z] triple(X x, Y y, Z z) pure asm "TRIPLE";
 | |
| forall X, Y, Z -> (X, Y, Z) untriple([X, Y, Z] t) pure asm "UNTRIPLE";
 | |
| forall X, Y, Z, W -> [X, Y, Z, W] tuple4(X x, Y y, Z z, W w) pure asm "4 TUPLE";
 | |
| forall X, Y, Z, W -> (X, Y, Z, W) untuple4([X, Y, Z, W] t) pure asm "4 UNTUPLE";
 | |
| forall X -> X first(tuple t) pure asm "FIRST";
 | |
| forall X -> X second(tuple t) pure asm "SECOND";
 | |
| forall X -> X third(tuple t) pure asm "THIRD";
 | |
| forall X -> X fourth(tuple t) pure asm "3 INDEX";
 | |
| forall X, Y -> X pair_first([X, Y] p) pure asm "FIRST";
 | |
| forall X, Y -> Y pair_second([X, Y] p) pure asm "SECOND";
 | |
| forall X, Y, Z -> X triple_first([X, Y, Z] p) pure asm "FIRST";
 | |
| forall X, Y, Z -> Y triple_second([X, Y, Z] p) pure asm "SECOND";
 | |
| forall X, Y, Z -> Z triple_third([X, Y, Z] p) pure asm "THIRD";
 | |
| forall X -> X null() pure asm "PUSHNULL";
 | |
| forall X -> (X, ()) ~impure_touch(X x) asm "NOP";
 | |
| 
 | |
| int now() pure asm "NOW";
 | |
| slice my_address() pure asm "MYADDR";
 | |
| [int, cell] get_balance() pure asm "BALANCE";
 | |
| int cur_lt() pure asm "LTIME";
 | |
| int block_lt() pure asm "BLOCKLT";
 | |
| 
 | |
| int cell_hash(cell c) pure asm "HASHCU";
 | |
| int slice_hash(slice s) pure asm "HASHSU";
 | |
| int string_hash(slice s) pure asm "SHA256U";
 | |
| 
 | |
| int check_signature(int hash, slice signature, int public_key) pure asm "CHKSIGNU";
 | |
| int check_data_signature(slice data, slice signature, int public_key) pure asm "CHKSIGNS";
 | |
| 
 | |
| (int, int, int) compute_data_size(cell c, int max_cells) asm "CDATASIZE";
 | |
| (int, int, int) slice_compute_data_size(slice s, int max_cells) asm "SDATASIZE";
 | |
| (int, int, int, int) compute_data_size?(cell c, int max_cells) pure asm "CDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT";
 | |
| (int, int, int, int) slice_compute_data_size?(cell c, int max_cells) pure asm "SDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT";
 | |
| 
 | |
| ;; () throw_if(int excno, int cond) asm "THROWARGIF";
 | |
| 
 | |
| () dump_stack() asm "DUMPSTK";
 | |
| 
 | |
| cell get_data() pure asm "c4 PUSH";
 | |
| () set_data(cell c) asm "c4 POP";
 | |
| cont get_c3() asm "c3 PUSH";
 | |
| () set_c3(cont c) asm "c3 POP";
 | |
| cont bless(slice s) asm "BLESS";
 | |
| 
 | |
| () accept_message() asm "ACCEPT";
 | |
| () set_gas_limit(int limit) asm "SETGASLIMIT";
 | |
| () commit() asm "COMMIT";
 | |
| () buy_gas(int gram) asm "BUYGAS";
 | |
| 
 | |
| int min(int x, int y) pure asm "MIN";
 | |
| int max(int x, int y) pure asm "MAX";
 | |
| (int, int) minmax(int x, int y) pure asm "MINMAX";
 | |
| int abs(int x) pure asm "ABS";
 | |
| 
 | |
| slice begin_parse(cell c) pure asm "CTOS";
 | |
| () end_parse(slice s) asm "ENDS";
 | |
| (slice, cell) load_ref(slice s) pure asm( -> 1 0) "LDREF";
 | |
| cell preload_ref(slice s) pure asm "PLDREF";
 | |
| ;; (slice, int) ~load_int(slice s, int len) pure asm(s len -> 1 0) "LDIX";
 | |
| ;; (slice, int) ~load_uint(slice s, int len) pure asm( -> 1 0) "LDUX";
 | |
| ;; int preload_int(slice s, int len) pure asm "PLDIX";
 | |
| ;; int preload_uint(slice s, int len) pure asm "PLDUX";
 | |
| ;; (slice, slice) load_bits(slice s, int len) pure asm(s len -> 1 0) "LDSLICEX";
 | |
| ;; slice preload_bits(slice s, int len) pure asm "PLDSLICEX";
 | |
| (slice, int) load_grams(slice s) pure asm( -> 1 0) "LDGRAMS";
 | |
| slice skip_bits(slice s, int len) pure asm "SDSKIPFIRST";
 | |
| (slice, ()) ~skip_bits(slice s, int len) pure asm "SDSKIPFIRST";
 | |
| slice first_bits(slice s, int len) pure asm "SDCUTFIRST";
 | |
| slice skip_last_bits(slice s, int len) pure asm "SDSKIPLAST";
 | |
| (slice, ()) ~skip_last_bits(slice s, int len) pure asm "SDSKIPLAST";
 | |
| slice slice_last(slice s, int len) pure asm "SDCUTLAST";
 | |
| (slice, cell) load_dict(slice s) pure asm( -> 1 0) "LDDICT";
 | |
| cell preload_dict(slice s) pure asm "PLDDICT";
 | |
| slice skip_dict(slice s) pure asm "SKIPDICT";
 | |
| 
 | |
| (slice, cell) load_maybe_ref(slice s) pure asm( -> 1 0) "LDOPTREF";
 | |
| cell preload_maybe_ref(slice s) pure asm "PLDOPTREF";
 | |
| builder store_maybe_ref(builder b, cell c) pure asm(c b) "STOPTREF";
 | |
| 
 | |
| int cell_depth(cell c) pure asm "CDEPTH";
 | |
| 
 | |
| int slice_refs(slice s) pure asm "SREFS";
 | |
| int slice_bits(slice s) pure asm "SBITS";
 | |
| (int, int) slice_bits_refs(slice s) pure asm "SBITREFS";
 | |
| int slice_empty?(slice s) pure asm "SEMPTY";
 | |
| int slice_data_empty?(slice s) pure asm "SDEMPTY";
 | |
| int slice_refs_empty?(slice s) pure asm "SREMPTY";
 | |
| int slice_depth(slice s) pure asm "SDEPTH";
 | |
| 
 | |
| int builder_refs(builder b) pure asm "BREFS";
 | |
| int builder_bits(builder b) pure asm "BBITS";
 | |
| int builder_depth(builder b) pure asm "BDEPTH";
 | |
| 
 | |
| builder begin_cell() pure asm "NEWC";
 | |
| cell end_cell(builder b) pure asm "ENDC";
 | |
| builder store_ref(builder b, cell c) pure asm(c b) "STREF";
 | |
| ;; builder store_uint(builder b, int x, int len) pure asm(x b len) "STUX";
 | |
| ;; builder store_int(builder b, int x, int len) pure asm(x b len) "STIX";
 | |
| builder store_slice(builder b, slice s) pure asm "STSLICER";
 | |
| builder store_grams(builder b, int x) pure asm "STGRAMS";
 | |
| builder store_dict(builder b, cell c) pure asm(c b) "STDICT";
 | |
| 
 | |
| (slice, slice) load_msg_addr(slice s) pure asm( -> 1 0) "LDMSGADDR";
 | |
| tuple parse_addr(slice s) pure asm "PARSEMSGADDR";
 | |
| (int, int) parse_std_addr(slice s) pure asm "REWRITESTDADDR";
 | |
| (int, slice) parse_var_addr(slice s) pure asm "REWRITEVARADDR";
 | |
| 
 | |
| cell idict_set_ref(cell dict, int key_len, int index, cell value) pure asm(value index dict key_len) "DICTISETREF";
 | |
| (cell, ()) ~idict_set_ref(cell dict, int key_len, int index, cell value) pure asm(value index dict key_len) "DICTISETREF";
 | |
| cell udict_set_ref(cell dict, int key_len, int index, cell value) pure asm(value index dict key_len) "DICTUSETREF";
 | |
| (cell, ()) ~udict_set_ref(cell dict, int key_len, int index, cell value) pure asm(value index dict key_len) "DICTUSETREF";
 | |
| cell idict_get_ref(cell dict, int key_len, int index) pure asm(index dict key_len) "DICTIGETOPTREF";
 | |
| (cell, int) idict_get_ref?(cell dict, int key_len, int index) pure asm(index dict key_len) "DICTIGETREF" "NULLSWAPIFNOT";
 | |
| (cell, int) udict_get_ref?(cell dict, int key_len, int index) pure asm(index dict key_len) "DICTUGETREF" "NULLSWAPIFNOT";
 | |
| (cell, cell) idict_set_get_ref(cell dict, int key_len, int index, cell value) pure asm(value index dict key_len) "DICTISETGETOPTREF";
 | |
| (cell, cell) udict_set_get_ref(cell dict, int key_len, int index, cell value) pure asm(value index dict key_len) "DICTUSETGETOPTREF";
 | |
| (cell, int) idict_delete?(cell dict, int key_len, int index) pure asm(index dict key_len) "DICTIDEL";
 | |
| (cell, int) udict_delete?(cell dict, int key_len, int index) pure asm(index dict key_len) "DICTUDEL";
 | |
| (slice, int) idict_get?(cell dict, int key_len, int index) pure asm(index dict key_len) "DICTIGET" "NULLSWAPIFNOT";
 | |
| (slice, int) udict_get?(cell dict, int key_len, int index) pure asm(index dict key_len) "DICTUGET" "NULLSWAPIFNOT";
 | |
| (cell, slice, int) idict_delete_get?(cell dict, int key_len, int index) pure asm(index dict key_len) "DICTIDELGET" "NULLSWAPIFNOT";
 | |
| (cell, slice, int) udict_delete_get?(cell dict, int key_len, int index) pure asm(index dict key_len) "DICTUDELGET" "NULLSWAPIFNOT";
 | |
| (cell, (slice, int)) ~idict_delete_get?(cell dict, int key_len, int index) pure asm(index dict key_len) "DICTIDELGET" "NULLSWAPIFNOT";
 | |
| (cell, (slice, int)) ~udict_delete_get?(cell dict, int key_len, int index) pure asm(index dict key_len) "DICTUDELGET" "NULLSWAPIFNOT";
 | |
| cell udict_set(cell dict, int key_len, int index, slice value) pure asm(value index dict key_len) "DICTUSET";
 | |
| (cell, ()) ~udict_set(cell dict, int key_len, int index, slice value) pure asm(value index dict key_len) "DICTUSET";
 | |
| cell idict_set(cell dict, int key_len, int index, slice value) pure asm(value index dict key_len) "DICTISET";
 | |
| (cell, ()) ~idict_set(cell dict, int key_len, int index, slice value) pure asm(value index dict key_len) "DICTISET";
 | |
| cell dict_set(cell dict, int key_len, slice index, slice value) pure asm(value index dict key_len) "DICTSET";
 | |
| (cell, ()) ~dict_set(cell dict, int key_len, slice index, slice value) pure asm(value index dict key_len) "DICTSET";
 | |
| (cell, int) udict_add?(cell dict, int key_len, int index, slice value) pure asm(value index dict key_len) "DICTUADD";
 | |
| (cell, int) udict_replace?(cell dict, int key_len, int index, slice value) pure asm(value index dict key_len) "DICTUREPLACE";
 | |
| (cell, int) idict_add?(cell dict, int key_len, int index, slice value) pure asm(value index dict key_len) "DICTIADD";
 | |
| (cell, int) idict_replace?(cell dict, int key_len, int index, slice value) pure asm(value index dict key_len) "DICTIREPLACE";
 | |
| cell udict_set_builder(cell dict, int key_len, int index, builder value) pure asm(value index dict key_len) "DICTUSETB";
 | |
| (cell, ()) ~udict_set_builder(cell dict, int key_len, int index, builder value) pure asm(value index dict key_len) "DICTUSETB";
 | |
| cell idict_set_builder(cell dict, int key_len, int index, builder value) pure asm(value index dict key_len) "DICTISETB";
 | |
| (cell, ()) ~idict_set_builder(cell dict, int key_len, int index, builder value) pure asm(value index dict key_len) "DICTISETB";
 | |
| cell dict_set_builder(cell dict, int key_len, slice index, builder value) pure asm(value index dict key_len) "DICTSETB";
 | |
| (cell, ()) ~dict_set_builder(cell dict, int key_len, slice index, builder value) pure asm(value index dict key_len) "DICTSETB";
 | |
| (cell, int) udict_add_builder?(cell dict, int key_len, int index, builder value) pure asm(value index dict key_len) "DICTUADDB";
 | |
| (cell, int) udict_replace_builder?(cell dict, int key_len, int index, builder value) pure asm(value index dict key_len) "DICTUREPLACEB";
 | |
| (cell, int) idict_add_builder?(cell dict, int key_len, int index, builder value) pure asm(value index dict key_len) "DICTIADDB";
 | |
| (cell, int) idict_replace_builder?(cell dict, int key_len, int index, builder value) pure asm(value index dict key_len) "DICTIREPLACEB";
 | |
| (cell, int, slice, int) udict_delete_get_min(cell dict, int key_len) pure asm(-> 0 2 1 3) "DICTUREMMIN" "NULLSWAPIFNOT2";
 | |
| (cell, (int, slice, int)) ~udict::delete_get_min(cell dict, int key_len) pure asm(-> 0 2 1 3) "DICTUREMMIN" "NULLSWAPIFNOT2";
 | |
| (cell, int, slice, int) idict_delete_get_min(cell dict, int key_len) pure asm(-> 0 2 1 3) "DICTIREMMIN" "NULLSWAPIFNOT2";
 | |
| (cell, (int, slice, int)) ~idict::delete_get_min(cell dict, int key_len) pure asm(-> 0 2 1 3) "DICTIREMMIN" "NULLSWAPIFNOT2";
 | |
| (cell, slice, slice, int) dict_delete_get_min(cell dict, int key_len) pure asm(-> 0 2 1 3) "DICTREMMIN" "NULLSWAPIFNOT2";
 | |
| (cell, (slice, slice, int)) ~dict::delete_get_min(cell dict, int key_len) pure asm(-> 0 2 1 3) "DICTREMMIN" "NULLSWAPIFNOT2";
 | |
| (cell, int, slice, int) udict_delete_get_max(cell dict, int key_len) pure asm(-> 0 2 1 3) "DICTUREMMAX" "NULLSWAPIFNOT2";
 | |
| (cell, (int, slice, int)) ~udict::delete_get_max(cell dict, int key_len) pure asm(-> 0 2 1 3) "DICTUREMMAX" "NULLSWAPIFNOT2";
 | |
| (cell, int, slice, int) idict_delete_get_max(cell dict, int key_len) pure asm(-> 0 2 1 3) "DICTIREMMAX" "NULLSWAPIFNOT2";
 | |
| (cell, (int, slice, int)) ~idict::delete_get_max(cell dict, int key_len) pure asm(-> 0 2 1 3) "DICTIREMMAX" "NULLSWAPIFNOT2";
 | |
| (cell, slice, slice, int) dict_delete_get_max(cell dict, int key_len) pure asm(-> 0 2 1 3) "DICTREMMAX" "NULLSWAPIFNOT2";
 | |
| (cell, (slice, slice, int)) ~dict::delete_get_max(cell dict, int key_len) pure asm(-> 0 2 1 3) "DICTREMMAX" "NULLSWAPIFNOT2";
 | |
| (int, slice, int) udict_get_min?(cell dict, int key_len) pure asm (-> 1 0 2) "DICTUMIN" "NULLSWAPIFNOT2";
 | |
| (int, slice, int) udict_get_max?(cell dict, int key_len) pure asm (-> 1 0 2) "DICTUMAX" "NULLSWAPIFNOT2";
 | |
| (int, cell, int) udict_get_min_ref?(cell dict, int key_len) pure asm (-> 1 0 2) "DICTUMINREF" "NULLSWAPIFNOT2";
 | |
| (int, cell, int) udict_get_max_ref?(cell dict, int key_len) pure asm (-> 1 0 2) "DICTUMAXREF" "NULLSWAPIFNOT2";
 | |
| (int, slice, int) idict_get_min?(cell dict, int key_len) pure asm (-> 1 0 2) "DICTIMIN" "NULLSWAPIFNOT2";
 | |
| (int, slice, int) idict_get_max?(cell dict, int key_len) pure asm (-> 1 0 2) "DICTIMAX" "NULLSWAPIFNOT2";
 | |
| (int, cell, int) idict_get_min_ref?(cell dict, int key_len) pure asm (-> 1 0 2) "DICTIMINREF" "NULLSWAPIFNOT2";
 | |
| (int, cell, int) idict_get_max_ref?(cell dict, int key_len) pure asm (-> 1 0 2) "DICTIMAXREF" "NULLSWAPIFNOT2";
 | |
| (int, slice, int) udict_get_next?(cell dict, int key_len, int pivot) pure asm(pivot dict key_len -> 1 0 2) "DICTUGETNEXT" "NULLSWAPIFNOT2";
 | |
| (int, slice, int) udict_get_nexteq?(cell dict, int key_len, int pivot) pure asm(pivot dict key_len -> 1 0 2) "DICTUGETNEXTEQ" "NULLSWAPIFNOT2";
 | |
| (int, slice, int) udict_get_prev?(cell dict, int key_len, int pivot) pure asm(pivot dict key_len -> 1 0 2) "DICTUGETPREV" "NULLSWAPIFNOT2";
 | |
| (int, slice, int) udict_get_preveq?(cell dict, int key_len, int pivot) pure asm(pivot dict key_len -> 1 0 2) "DICTUGETPREVEQ" "NULLSWAPIFNOT2";
 | |
| (int, slice, int) idict_get_next?(cell dict, int key_len, int pivot) pure asm(pivot dict key_len -> 1 0 2) "DICTIGETNEXT" "NULLSWAPIFNOT2";
 | |
| (int, slice, int) idict_get_nexteq?(cell dict, int key_len, int pivot) pure asm(pivot dict key_len -> 1 0 2) "DICTIGETNEXTEQ" "NULLSWAPIFNOT2";
 | |
| (int, slice, int) idict_get_prev?(cell dict, int key_len, int pivot) pure asm(pivot dict key_len -> 1 0 2) "DICTIGETPREV" "NULLSWAPIFNOT2";
 | |
| (int, slice, int) idict_get_preveq?(cell dict, int key_len, int pivot) pure asm(pivot dict key_len -> 1 0 2) "DICTIGETPREVEQ" "NULLSWAPIFNOT2";
 | |
| cell new_dict() pure asm "NEWDICT";
 | |
| int dict_empty?(cell c) pure asm "DICTEMPTY";
 | |
| 
 | |
| (slice, slice, slice, int) pfxdict_get?(cell dict, int key_len, slice key) pure asm(key dict key_len) "PFXDICTGETQ" "NULLSWAPIFNOT2";
 | |
| (cell, int) pfxdict_set?(cell dict, int key_len, slice key, slice value) pure asm(value key dict key_len) "PFXDICTSET";
 | |
| (cell, int) pfxdict_delete?(cell dict, int key_len, slice key) pure asm(key dict key_len) "PFXDICTDEL";
 | |
| 
 | |
| cell config_param(int x) pure asm "CONFIGOPTPARAM";
 | |
| int cell_null?(cell c) pure asm "ISNULL";
 | |
| 
 | |
| () raw_reserve(int amount, int mode) asm "RAWRESERVE";
 | |
| () raw_reserve_extra(int amount, cell extra_amount, int mode) asm "RAWRESERVEX";
 | |
| () send_raw_message(cell msg, int mode) asm "SENDRAWMSG";
 | |
| () set_code(cell new_code) asm "SETCODE";
 | |
| 
 | |
| int random() asm "RANDU256";
 | |
| int rand(int range) asm "RAND";
 | |
| int get_seed() asm "RANDSEED";
 | |
| int set_seed() asm "SETRAND";
 | |
| () randomize(int x) asm "ADDRAND";
 | |
| () randomize_lt() asm "LTIME" "ADDRAND";
 |