mirror of
				https://github.com/ton-blockchain/ton
				synced 2025-03-09 15:40:10 +00:00 
			
		
		
		
	* Add legacy_tester for existing funC contracts * Add storage-contracts and pragma options
		
			
				
	
	
		
			185 lines
		
	
	
		
			No EOL
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			185 lines
		
	
	
		
			No EOL
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
;;
 | 
						|
;; Basic workchain addresses
 | 
						|
;;
 | 
						|
 | 
						|
int parse_work_addr(slice cs) {
 | 
						|
  (int sender_wc, slice sender_addr) = parse_var_addr(cs);
 | 
						|
  throw_unless(error::invalid_address(), 0 == sender_wc);
 | 
						|
  return sender_addr~load_uint(256);
 | 
						|
}
 | 
						|
 | 
						|
(slice) serialize_work_addr(int addr) {
 | 
						|
   return (begin_cell()
 | 
						|
     .store_uint(2, 2)  ;; Is std address
 | 
						|
     .store_uint(0, 1)  ;; Non-unicast
 | 
						|
     .store_uint(0, 8)  ;; Basic workchain
 | 
						|
     .store_uint(addr, 256) ;; Address hash
 | 
						|
   ).end_cell().begin_parse();
 | 
						|
}
 | 
						|
 | 
						|
;;
 | 
						|
;; Custom Commands
 | 
						|
;;
 | 
						|
 | 
						|
(int) equal_slices (slice s1, slice s2) asm "SDEQ";
 | 
						|
builder store_builder(builder to, builder what) asm(what to) "STB";
 | 
						|
builder store_builder_ref(builder to, builder what) asm(what to) "STBREFR";
 | 
						|
(slice, cell) load_maybe_cell(slice s) asm( -> 1 0) "LDDICT";
 | 
						|
(int) mod (int x, int y) asm "MOD";
 | 
						|
builder store_coins(builder b, int x) asm "STGRAMS";
 | 
						|
(slice, int) load_coins(slice s) asm( -> 1 0) "LDGRAMS";
 | 
						|
 | 
						|
 | 
						|
;;
 | 
						|
;; Events
 | 
						|
;;
 | 
						|
 | 
						|
() send_std_message(
 | 
						|
  slice to_addr,
 | 
						|
  int value,
 | 
						|
  int mode, 
 | 
						|
  int op, 
 | 
						|
  int query_id,
 | 
						|
  builder content
 | 
						|
) impure {
 | 
						|
 | 
						|
  var body = begin_cell()
 | 
						|
      .store_uint(op, 32)
 | 
						|
      .store_uint(query_id, 64)
 | 
						|
      .store_builder(content)
 | 
						|
  .end_cell();
 | 
						|
 | 
						|
  var msg = begin_cell()
 | 
						|
    .store_uint(0x10, 6)
 | 
						|
    .store_slice(to_addr)
 | 
						|
    .store_coins(value)
 | 
						|
    .store_uint(1, 1 + 4 + 4 + 64 + 32 + 1 + 1)
 | 
						|
    .store_ref(body)
 | 
						|
  .end_cell();
 | 
						|
 | 
						|
  send_raw_message(msg, mode);
 | 
						|
}
 | 
						|
 | 
						|
() send_empty_std_message(
 | 
						|
  slice to_addr,
 | 
						|
  int value,
 | 
						|
  int mode, 
 | 
						|
  int op, 
 | 
						|
  int query_id
 | 
						|
) impure {
 | 
						|
 | 
						|
  var body = begin_cell()
 | 
						|
      .store_uint(op, 32)
 | 
						|
      .store_uint(query_id, 64)
 | 
						|
  .end_cell();
 | 
						|
 | 
						|
  var msg = begin_cell()
 | 
						|
    .store_uint(0x10, 6)
 | 
						|
    .store_slice(to_addr)
 | 
						|
    .store_coins(value)
 | 
						|
    .store_uint(1, 1 + 4 + 4 + 64 + 32 + 1 + 1)
 | 
						|
    .store_ref(body)
 | 
						|
  .end_cell();
 | 
						|
 | 
						|
  send_raw_message(msg, mode);
 | 
						|
}
 | 
						|
 | 
						|
() send_text_message(
 | 
						|
  slice to_addr,
 | 
						|
  int value,
 | 
						|
  int mode, 
 | 
						|
  builder content
 | 
						|
) impure {
 | 
						|
 | 
						|
  var body = begin_cell()
 | 
						|
      .store_uint(0, 32)
 | 
						|
      .store_builder(content)
 | 
						|
  .end_cell();
 | 
						|
 | 
						|
  var msg = begin_cell()
 | 
						|
    .store_uint(0x10, 6)
 | 
						|
    .store_slice(to_addr)
 | 
						|
    .store_coins(value)
 | 
						|
    .store_uint(1, 1 + 4 + 4 + 64 + 32 + 1 + 1)
 | 
						|
    .store_ref(body)
 | 
						|
  .end_cell();
 | 
						|
 | 
						|
  send_raw_message(msg, mode);
 | 
						|
}
 | 
						|
 | 
						|
;;
 | 
						|
;; Generate
 | 
						|
;;
 | 
						|
 | 
						|
(int) new_query_id() inline {
 | 
						|
    return now() + mod(cur_lt(), 4294967296);
 | 
						|
}
 | 
						|
 | 
						|
;;
 | 
						|
;; Text Utils
 | 
						|
;;
 | 
						|
 | 
						|
(int, int) encode_number_to_text(int number) {
 | 
						|
  int len = 0;
 | 
						|
  int value = 0;
 | 
						|
  int mult = 1;
 | 
						|
  do {
 | 
						|
    (number, int res) = number.divmod(10);
 | 
						|
    value = value + (res + 48) * mult;
 | 
						|
    mult = mult * 256;
 | 
						|
    len = len + 1;
 | 
						|
  } until (number == 0);
 | 
						|
  return (len, value);
 | 
						|
}
 | 
						|
 | 
						|
builder store_coins_string(builder msg, int amount) {
 | 
						|
  (int ceil, int res) = divmod(amount, 1000000000);
 | 
						|
  (int cl, int cv) = encode_number_to_text(ceil);
 | 
						|
  msg = msg.store_uint(cv, cl * 8 );
 | 
						|
  msg = msg.store_uint(46, 8); ;; "."
 | 
						|
  (int rl, int rv) = encode_number_to_text(res);
 | 
						|
  ;; repeat( 9 - rl ) {
 | 
						|
  ;;  msg = msg.store_uint(48, 8); ;; " "
 | 
						|
  ;; }
 | 
						|
  return msg.store_uint(rv, rl * 8);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
;; 'Stake'
 | 
						|
builder store_text_stake(builder b) inline {
 | 
						|
    return b.store_uint(358434827109, 40);
 | 
						|
}
 | 
						|
 | 
						|
;; ' '
 | 
						|
builder store_text_space(builder b) inline {
 | 
						|
    return b.store_uint(32, 8);
 | 
						|
}
 | 
						|
 | 
						|
;; 'accepted'
 | 
						|
builder store_text_accepted(builder b) inline {
 | 
						|
    return b.store_uint(7017561931702887780, 64);
 | 
						|
}
 | 
						|
 | 
						|
;; Stake 123.333 accepted
 | 
						|
builder store_accepted_stake(builder b, int amount) inline {
 | 
						|
    return b.store_text_stake()
 | 
						|
            .store_text_space()
 | 
						|
            .store_coins_string(amount)
 | 
						|
            .store_text_space()
 | 
						|
            .store_text_accepted();
 | 
						|
}
 | 
						|
 | 
						|
;; 'Withdraw completed'
 | 
						|
builder store_withdraw_completed(builder b) inline {
 | 
						|
    return b.store_uint(7614653257073527469736132165096662684165476, 144);
 | 
						|
}
 | 
						|
 | 
						|
;; 'Withdraw requested. Please, retry the command when your balance is ready.'
 | 
						|
builder store_withdraw_delayed(builder b) inline {
 | 
						|
    return b
 | 
						|
      .store_uint(1949351233810823032252520485584178069312463918, 152) ;; 'Withdraw requested.'
 | 
						|
      .store_text_space()
 | 
						|
      .store_uint(555062058613674355757418046597367430905687018487295295368960255172568430, 240) ;; 'Please, retry the command when'
 | 
						|
      .store_text_space()
 | 
						|
      .store_uint(45434371896731988359547695118970428857702208118225198, 176); ;; 'your balance is ready.'
 | 
						|
} |