1
0
Fork 0
mirror of https://github.com/ton-blockchain/ton synced 2025-02-15 04:32:21 +00:00
ton/crypto/func/auto-tests/legacy_tests/gg-marketplace/nft-marketplace-v2.fc
EmelyanenkoK 6b49d6a382
Add legacy_tester for existing funC contracts (#588)
* Add legacy_tester for existing funC contracts

* Add storage-contracts and pragma options
2023-01-12 12:33:15 +03:00

110 lines
2.9 KiB
Text

;; NFT marketplace smart contract v2
;; Extends wallet v3r2 & adds ability to deploy sales
#include "stdlib.fc";
;;
;; storage scheme
;;
;; storage#_ seqno:uint32 subwallet:uint32 public_key:uint25
;; = Storage;
;;
_ load_data() {
var ds = get_data().begin_parse();
return (
ds~load_uint(32), ;; seqno
ds~load_uint(32), ;; subwallet
ds~load_uint(256) ;; public_key
);
}
() store_data(var data) impure {
(
int seqno,
int subwallet,
int public_key
) = data;
set_data(
begin_cell()
.store_uint(seqno, 32)
.store_uint(subwallet, 32)
.store_uint(public_key, 256)
.end_cell()
);
}
() recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure {
if (in_msg_body.slice_empty?()) { ;; ignore empty messages
return ();
}
slice cs = in_msg_full.begin_parse();
int flags = cs~load_uint(4);
if (flags & 1) { ;; ignore all bounced messages
return ();
}
slice sender_address = cs~load_msg_addr();
var (seqno, subwallet, public_key) = load_data();
int op = in_msg_body~load_uint(32);
if (op == 1) { ;; deploy new signed sale
var signature = in_msg_body~load_bits(512);
throw_unless(35, check_signature(slice_hash(in_msg_body), signature, public_key));
(cell state_init, cell body) = (in_msg_body~load_ref(), in_msg_body~load_ref());
int state_init_hash = cell_hash(state_init);
slice dest_address = begin_cell().store_int(0, 8).store_uint(state_init_hash, 256).end_cell().begin_parse();
var msg = begin_cell()
.store_uint(0x18, 6)
.store_uint(4, 3).store_slice(dest_address)
.store_grams(0)
.store_uint(4 + 2 + 1, 1 + 4 + 4 + 64 + 32 + 1 + 1 + 1)
.store_ref(state_init)
.store_ref(body);
send_raw_message(msg.end_cell(), 64); ;; carry remaining value of message
return ();
}
return ();
}
() recv_external(slice in_msg) impure {
var signature = in_msg~load_bits(512);
var cs = in_msg;
var (subwallet_id, valid_until, msg_seqno) = (cs~load_uint(32), cs~load_uint(32), cs~load_uint(32));
throw_if(35, valid_until <= now());
var (seqno, subwallet, public_key) = load_data();
throw_unless(33, msg_seqno == seqno);
throw_unless(34, subwallet_id == subwallet);
throw_unless(35, check_signature(slice_hash(in_msg), signature, public_key));
accept_message();
cs~touch();
while (cs.slice_refs()) {
var mode = cs~load_uint(8);
send_raw_message(cs~load_ref(), mode);
}
store_data(
seqno + 1,
subwallet,
public_key
);
}
;; Get methods
int seqno() method_id {
return get_data().begin_parse().preload_uint(32);
}
int get_public_key() method_id {
var cs = get_data().begin_parse();
cs~load_uint(64);
return cs.preload_uint(256);
}