Ton
110 строк · 3.4 Кб
1const int one_month = 2592000; ;; 1 month in seconds = 60 * 60 * 24 * 30
2const int one_year = 31622400; ;; 1 year in seconds = 60 * 60 * 24 * 366
3const int auction_start_time = 1659171600; ;; GMT: Monday, 30 July 2022 г., 09:00:00
4const int one_ton = 1000000000;
5const int dns_next_resolver_prefix = 0xba93; ;; dns_next_resolver prefix - https://github.com/ton-blockchain/ton/blob/7e3df93ca2ab336716a230fceb1726d81bac0a06/crypto/block/block.tlb#L819
6
7const int dns_config_id = 80; ;; dns black list config param; in testnet -80
8
9const int op::fill_up = 0x370fec51;
10const int op::outbid_notification = 0x557cea20;
11const int op::change_dns_record = 0x4eb1f0f9;
12const int op::process_governance_decision = 0x44beae41;
13const int op::dns_balance_release = 0x4ed14b65;
14
15int mod(int x, int y) asm "MOD";
16
17slice zero_address() {
18return begin_cell().store_uint(0, 2).end_cell().begin_parse();
19}
20
21;; "ton\0test\0" -> "ton"
22int get_top_domain_bits(slice domain) {
23int i = 0;
24int need_break = 0;
25do {
26int char = domain~load_uint(8); ;; we do not check domain.length because it MUST contains \0 character
27need_break = char == 0;
28if (~ need_break) {
29i += 8;
30}
31} until (need_break);
32throw_if(201, i == 0); ;; starts with \0
33return i;
34}
35
36slice read_domain_from_comment(slice in_msg_body) {
37int need_break = 0;
38builder result = begin_cell();
39do {
40result = result.store_slice(in_msg_body~load_bits(in_msg_body.slice_bits()));
41int refs_len = in_msg_body.slice_refs();
42need_break = refs_len == 0;
43if (~ need_break) {
44throw_unless(202, refs_len == 1);
45in_msg_body = in_msg_body~load_ref().begin_parse();
46}
47} until (need_break);
48return result.end_cell().begin_parse();
49}
50
51int check_domain_string(slice domain) {
52int i = 0;
53int len = slice_bits(domain);
54int need_break = 0;
55do {
56need_break = i == len;
57if (~ need_break) {
58int char = domain~load_uint(8);
59;; we can do it because additional UTF-8 character's octets >= 128 -- https://www.ietf.org/rfc/rfc3629.txt
60int is_hyphen = (char == 45);
61int valid_char = (is_hyphen & (i > 0) & (i < len - 8)) | ((char >= 48) & (char <= 57)) | ((char >= 97) & (char <= 122)); ;; '-' or 0-9 or a-z
62
63need_break = ~ valid_char;
64if (~ need_break) {
65i += 8;
66}
67}
68} until (need_break);
69return i == len;
70}
71
72(int, int) get_min_price_config(int domain_char_count) {
73if (domain_char_count == 4) {
74return (1000, 100);
75}
76if (domain_char_count == 5) {
77return (500, 50);
78}
79if (domain_char_count == 6) {
80return (400, 40);
81}
82if (domain_char_count == 7) {
83return (300, 30);
84}
85if (domain_char_count == 8) {
86return (200, 20);
87}
88if (domain_char_count == 9) {
89return (100, 10);
90}
91if (domain_char_count == 10) {
92return (50, 5);
93}
94return (10, 1);
95}
96
97int get_min_price(int domain_bits_length, int now_time) {
98(int start_min_price, int end_min_price) = get_min_price_config(domain_bits_length / 8);
99start_min_price *= one_ton;
100end_min_price *= one_ton;
101int seconds = now_time - auction_start_time;
102int months = seconds / one_month;
103if (months > 21) {
104return end_min_price;
105}
106repeat (months) {
107start_min_price = start_min_price * 90 / 100;
108}
109return start_min_price;
110}