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
		
			
				
	
	
		
			229 lines
		
	
	
	
		
			7 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			229 lines
		
	
	
	
		
			7 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
#include "stdlib.fc";
 | 
						|
 | 
						|
forall X -> X __tact_not_null(X x) { throw_if(128, null?(x)); return x; }
 | 
						|
 | 
						|
global (int, slice, int, slice) __tact_context;
 | 
						|
global cell __tact_context_sys;
 | 
						|
 | 
						|
(int, slice, int, slice) __tact_context_get() inline { return __tact_context; }
 | 
						|
 | 
						|
() __tact_verify_address(slice address) inline {
 | 
						|
    throw_unless(136, address.slice_bits() != 267);
 | 
						|
}
 | 
						|
 | 
						|
builder __tact_store_bool(builder b, int v) inline {
 | 
						|
    b = b.store_int(v, 1);
 | 
						|
    return b;
 | 
						|
}
 | 
						|
 | 
						|
(slice, slice) __tact_load_address(slice cs) inline {
 | 
						|
    slice raw = cs~load_msg_addr();
 | 
						|
    __tact_verify_address(raw);
 | 
						|
    return (cs, raw);
 | 
						|
}
 | 
						|
 | 
						|
builder __tact_store_address(builder b, slice address) inline {
 | 
						|
    __tact_verify_address(address);
 | 
						|
    b = b.store_slice(address);
 | 
						|
    return b;
 | 
						|
}
 | 
						|
 | 
						|
int __tact_address_eq(slice a, slice b) inline {
 | 
						|
    return equal_slice_bits(a, b);
 | 
						|
}
 | 
						|
 | 
						|
(slice, ((slice))) __gen_read_ChangeOwner(slice sc_0) inline_ref {
 | 
						|
    throw_unless(129, sc_0~load_uint(32) == 256331011);
 | 
						|
    var v'newOwner = sc_0~__tact_load_address();
 | 
						|
    return (sc_0, (v'newOwner));
 | 
						|
}
 | 
						|
 | 
						|
(slice, ((int, int))) __gen_read_Withdraw(slice sc_0) inline_ref {
 | 
						|
    throw_unless(129, sc_0~load_uint(32) == 1672521544);
 | 
						|
    var v'amount = sc_0~load_coins();
 | 
						|
    var v'mode = sc_0~load_uint(8);
 | 
						|
    return (sc_0, (v'amount, v'mode));
 | 
						|
}
 | 
						|
 | 
						|
builder __gen_write_Treasure(builder build_0, (slice) v) inline_ref {
 | 
						|
    var (v'owner) = v;
 | 
						|
    build_0 = __tact_store_address(build_0, v'owner);
 | 
						|
    return build_0;
 | 
						|
}
 | 
						|
 | 
						|
(slice, ((slice))) __gen_read_Treasure(slice sc_0) inline_ref {
 | 
						|
    var v'owner = sc_0~__tact_load_address();
 | 
						|
    return (sc_0, (v'owner));
 | 
						|
}
 | 
						|
 | 
						|
_ __gen_Context_get_sender((int, slice, int, slice) v) inline {
 | 
						|
    var (v'bounced, v'sender, v'value, v'raw) = v;
 | 
						|
    return v'sender;
 | 
						|
}
 | 
						|
 | 
						|
(slice) __gen_load_Treasure() inline_ref {
 | 
						|
    slice sc = get_data().begin_parse();
 | 
						|
    __tact_context_sys = sc~load_ref();
 | 
						|
    return sc~__gen_read_Treasure();
 | 
						|
}
 | 
						|
 | 
						|
() __gen_store_Treasure((slice) v) impure inline_ref {
 | 
						|
    builder b = begin_cell();
 | 
						|
    b = b.store_ref(__tact_context_sys);
 | 
						|
    b = __gen_write_Treasure(b, v);
 | 
						|
    set_data(b.end_cell());
 | 
						|
}
 | 
						|
 | 
						|
() $send((int, slice, int, int, cell, cell, cell) $params) impure {
 | 
						|
    var (($params'bounce, $params'to, $params'value, $params'mode, $params'body, $params'code, $params'data)) = $params;
 | 
						|
    builder $b = begin_cell();
 | 
						|
    $b = store_int($b, 1, 2);
 | 
						|
    $b = __tact_store_bool($b, $params'bounce);
 | 
						|
    $b = store_int($b, 0, 3);
 | 
						|
    $b = __tact_store_address($b, $params'to);
 | 
						|
    $b = store_coins($b, $params'value);
 | 
						|
    $b = store_int($b, 0, ((((1 + 4) + 4) + 64) + 32));
 | 
						|
    if (((~ null?($params'code)) | (~ null?($params'data)))) {
 | 
						|
        $b = __tact_store_bool($b, true);
 | 
						|
        builder $bc = begin_cell();
 | 
						|
        $bc = __tact_store_bool($bc, false);
 | 
						|
        $bc = __tact_store_bool($bc, false);
 | 
						|
        if ((~ null?($params'code))) {
 | 
						|
            $bc = __tact_store_bool($bc, true);
 | 
						|
            $bc = store_ref($bc, __tact_not_null($params'code));
 | 
						|
        } else {
 | 
						|
            $bc = __tact_store_bool($bc, false);
 | 
						|
        }
 | 
						|
        if ((~ null?($params'data))) {
 | 
						|
            $bc = __tact_store_bool($bc, true);
 | 
						|
            $bc = store_ref($bc, __tact_not_null($params'data));
 | 
						|
        } else {
 | 
						|
            $bc = __tact_store_bool($bc, false);
 | 
						|
        }
 | 
						|
        $bc = __tact_store_bool($bc, false);
 | 
						|
        $b = __tact_store_bool($b, true);
 | 
						|
        $b = store_ref($b, end_cell($bc));
 | 
						|
    } else {
 | 
						|
        $b = __tact_store_bool($b, false);
 | 
						|
    }
 | 
						|
    cell $body = $params'body;
 | 
						|
    if ((~ null?($body))) {
 | 
						|
        $b = __tact_store_bool($b, true);
 | 
						|
        $b = store_ref($b, __tact_not_null($body));
 | 
						|
    } else {
 | 
						|
        $b = __tact_store_bool($b, false);
 | 
						|
    }
 | 
						|
    cell $c = end_cell($b);
 | 
						|
    send_raw_message($c, $params'mode);
 | 
						|
}
 | 
						|
 | 
						|
((slice), ()) $__gen_Treasure_requireOwner((slice) $self) impure {
 | 
						|
    var (($self'owner)) = $self;
 | 
						|
    throw_unless(132, __tact_address_eq(__gen_Context_get_sender(__tact_context_get()), $self'owner));
 | 
						|
    return (($self'owner), ());
 | 
						|
}
 | 
						|
 | 
						|
((slice), ()) $__gen_Treasure_doWithdraw((slice) $self, int $amount, int $mode) impure {
 | 
						|
    var (($self'owner)) = $self;
 | 
						|
    ($self'owner)~$__gen_Treasure_requireOwner();
 | 
						|
    $send((true, $self'owner, $amount, $mode, end_cell(begin_cell()), null(), null()));
 | 
						|
    return (($self'owner), ());
 | 
						|
}
 | 
						|
 | 
						|
slice $__gen_Treasure_owner((slice) $self) impure {
 | 
						|
    var (($self'owner)) = $self;
 | 
						|
    return $self'owner;
 | 
						|
}
 | 
						|
 | 
						|
_ $__gen_get_owner() method_id(83229) {
 | 
						|
    var self = __gen_load_Treasure();
 | 
						|
    var res = $__gen_Treasure_owner(self);
 | 
						|
    return res;
 | 
						|
}
 | 
						|
 | 
						|
(((slice)), ()) $__gen_Treasure_receive_Withdraw((slice) $self, (int, int) $msg) impure {
 | 
						|
    var ($self'owner) = $self;
 | 
						|
    var ($msg'amount, $msg'mode) = $msg;
 | 
						|
    ($self'owner)~$__gen_Treasure_doWithdraw($msg'amount, $msg'mode);
 | 
						|
    return (($self'owner), ());
 | 
						|
}
 | 
						|
 | 
						|
((slice), ()) $__gen_Treasure_receive_comment_986c2ba124bb9287eb4a0bd8d3104e1c0067a3c93952d889c74d08185bd30d4d((slice) $self) impure {
 | 
						|
    var ($self'owner) = $self;
 | 
						|
    ($self'owner)~$__gen_Treasure_doWithdraw(0, (32 + 128));
 | 
						|
    return (($self'owner), ());
 | 
						|
}
 | 
						|
 | 
						|
(((slice)), ()) $__gen_Treasure_receive_ChangeOwner((slice) $self, (slice) $msg) impure {
 | 
						|
    var ($self'owner) = $self;
 | 
						|
    var ($msg'newOwner) = $msg;
 | 
						|
    ($self'owner)~$__gen_Treasure_requireOwner();
 | 
						|
    $self'owner = $msg'newOwner;
 | 
						|
    return (($self'owner), ());
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
() recv_internal(int msg_value, cell in_msg_cell, slice in_msg) impure {
 | 
						|
    
 | 
						|
    ;; Parse incoming message
 | 
						|
    int op = 0;
 | 
						|
    if (slice_bits(in_msg) >= 32) {
 | 
						|
        op = in_msg.preload_uint(32);
 | 
						|
    }
 | 
						|
    var cs = in_msg_cell.begin_parse();
 | 
						|
    var msg_flags = cs~load_uint(4);
 | 
						|
    var msg_bounced = ((msg_flags & 1) == 1 ? true : false);
 | 
						|
    slice msg_sender_addr = cs~load_msg_addr();
 | 
						|
    __tact_context = (msg_bounced, msg_sender_addr, msg_value, cs);
 | 
						|
    
 | 
						|
    ;; Handle bounced messages
 | 
						|
    if (msg_bounced) {
 | 
						|
        return ();
 | 
						|
    }
 | 
						|
    
 | 
						|
    ;; Receive Withdraw message
 | 
						|
    if (op == 1672521544) {
 | 
						|
        var self = __gen_load_Treasure();
 | 
						|
        var msg = in_msg~__gen_read_Withdraw();
 | 
						|
        self~$__gen_Treasure_receive_Withdraw(msg);
 | 
						|
        __gen_store_Treasure(self);
 | 
						|
        return ();
 | 
						|
    }
 | 
						|
    
 | 
						|
    ;; Receive ChangeOwner message
 | 
						|
    if (op == 256331011) {
 | 
						|
        var self = __gen_load_Treasure();
 | 
						|
        var msg = in_msg~__gen_read_ChangeOwner();
 | 
						|
        self~$__gen_Treasure_receive_ChangeOwner(msg);
 | 
						|
        __gen_store_Treasure(self);
 | 
						|
        return ();
 | 
						|
    }
 | 
						|
    
 | 
						|
    ;; Text Receivers
 | 
						|
    if (op == 0) {
 | 
						|
        var text_op = slice_hash(in_msg);
 | 
						|
        
 | 
						|
        ;; Receive "Destroy" message
 | 
						|
        if (text_op == 0x986c2ba124bb9287eb4a0bd8d3104e1c0067a3c93952d889c74d08185bd30d4d) {
 | 
						|
            var self = __gen_load_Treasure();
 | 
						|
            self~$__gen_Treasure_receive_comment_986c2ba124bb9287eb4a0bd8d3104e1c0067a3c93952d889c74d08185bd30d4d();
 | 
						|
            __gen_store_Treasure(self);
 | 
						|
            return ();
 | 
						|
        }
 | 
						|
    }
 | 
						|
    
 | 
						|
    throw(130);
 | 
						|
}
 | 
						|
 | 
						|
_ supported_interfaces() method_id {
 | 
						|
    return (
 | 
						|
        "org.ton.introspection.v0"H >> 128,
 | 
						|
        "org.ton.abi.ipfs.v0"H >> 128,
 | 
						|
        "org.ton.ownable.transferable"H >> 128,
 | 
						|
        "org.ton.ownable"H >> 128
 | 
						|
    );
 | 
						|
}
 | 
						|
 | 
						|
_ get_abi_ipfs() {
 | 
						|
    return "ipfs://QmSZriPPLDUQWqjYmMRWAqKkhCeq32L339Q2PQrBaYMAqT";
 | 
						|
}
 |