Ton

Форк
0
110 строк · 2.9 Кб
1
;; NFT marketplace smart contract v2
2
;; Extends wallet v3r2 & adds ability to deploy sales
3

4
#include "stdlib.fc";
5

6
;;
7
;; storage scheme
8
;;
9
;; storage#_ seqno:uint32 subwallet:uint32 public_key:uint25
10
;;           = Storage;
11
;;
12
_ load_data() {
13
    var ds = get_data().begin_parse();
14
    return (
15
        ds~load_uint(32),   ;; seqno
16
        ds~load_uint(32),   ;; subwallet
17
        ds~load_uint(256)   ;; public_key
18
    );
19
}
20

21
() store_data(var data) impure {
22
    (
23
        int seqno,
24
        int subwallet,
25
        int public_key
26
    ) = data;
27

28
    set_data(
29
        begin_cell()
30
            .store_uint(seqno, 32)
31
            .store_uint(subwallet, 32)
32
            .store_uint(public_key, 256)
33
            .end_cell()
34
    );
35
}
36

37
() recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure {
38
    if (in_msg_body.slice_empty?()) { ;; ignore empty messages
39
        return ();
40
    }
41

42
    slice cs = in_msg_full.begin_parse();
43
    int flags = cs~load_uint(4);
44

45
    if (flags & 1) { ;; ignore all bounced messages
46
        return ();
47
    }
48
    slice sender_address = cs~load_msg_addr();
49
    var (seqno, subwallet, public_key) = load_data();
50

51
    int op = in_msg_body~load_uint(32);
52

53
    if (op == 1) { ;; deploy new signed sale
54
        var signature = in_msg_body~load_bits(512);
55
        throw_unless(35, check_signature(slice_hash(in_msg_body), signature, public_key));
56

57
        (cell state_init, cell body) = (in_msg_body~load_ref(), in_msg_body~load_ref());
58

59
        int state_init_hash = cell_hash(state_init);
60
        slice dest_address = begin_cell().store_int(0, 8).store_uint(state_init_hash, 256).end_cell().begin_parse();
61

62
        var msg = begin_cell()
63
            .store_uint(0x18, 6)
64
            .store_uint(4, 3).store_slice(dest_address)
65
            .store_grams(0)
66
            .store_uint(4 + 2 + 1, 1 + 4 + 4 + 64 + 32 + 1 + 1 + 1)
67
            .store_ref(state_init)
68
            .store_ref(body);
69

70
        send_raw_message(msg.end_cell(), 64); ;; carry remaining value of message
71
        return ();
72
    }
73

74
    return ();
75
}
76

77
() recv_external(slice in_msg) impure {
78
    var signature = in_msg~load_bits(512);
79
    var cs = in_msg;
80
    var (subwallet_id, valid_until, msg_seqno) = (cs~load_uint(32), cs~load_uint(32), cs~load_uint(32));
81
    throw_if(35, valid_until <= now());
82
    var (seqno, subwallet, public_key) = load_data();
83
    throw_unless(33, msg_seqno == seqno);
84
    throw_unless(34, subwallet_id == subwallet);
85
    throw_unless(35, check_signature(slice_hash(in_msg), signature, public_key));
86
    accept_message();
87
    cs~touch();
88
    while (cs.slice_refs()) {
89
        var mode = cs~load_uint(8);
90
        send_raw_message(cs~load_ref(), mode);
91
    }
92

93
    store_data(
94
        seqno + 1,
95
        subwallet,
96
        public_key
97
    );
98
}
99

100
;; Get methods
101

102
int seqno() method_id {
103
    return get_data().begin_parse().preload_uint(32);
104
}
105

106
int get_public_key() method_id {
107
    var cs = get_data().begin_parse();
108
    cs~load_uint(64);
109
    return cs.preload_uint(256);
110
}
111

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.