1#![deny(unused_extern_crates)]
2#![warn(
3 missing_debug_implementations,
4 missing_docs,
5 rust_2018_idioms,
6 unreachable_pub
7)]
8
9pub const TRYTE_ALPHABET: [char; 27] = [
14 '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',
15 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
16];
17
18pub const DEFAULT_MWM: usize = 14;
20
21pub const MIN_TRIT_VALUE: i8 = -1;
23pub const MAX_TRIT_VALUE: i8 = 1;
25pub const MIN_TRYTE_VALUE: i8 = -13;
27pub const MAX_TRYTE_VALUE: i8 = 13;
29
30pub const TRINARY_RADIX: usize = 3;
32
33pub const HASH_TRINARY_SIZE: usize = 243;
35pub const HASH_TRYTES_SIZE: usize = HASH_TRINARY_SIZE / 3;
37pub const HASH_BYTES_SIZE: usize = 48;
39pub const KEY_SEGMENTS_PER_FRAGMENT: usize = 27;
41pub const KEY_SEGMENT_HASH_ROUNDS: usize = 26;
43pub const KEY_FRAGMENT_LENGTH: usize = HASH_TRINARY_SIZE * KEY_SEGMENTS_PER_FRAGMENT;
45
46pub const ADDRESS_CHECKSUM_TRYTES_SIZE: usize = 9;
48pub const ADDRESS_WITH_CHECKSUM_TRYTES_SIZE: usize =
50 HASH_TRYTES_SIZE + ADDRESS_CHECKSUM_TRYTES_SIZE;
51pub const MIN_CHECKSUM_TRYTES_SIZE: usize = 3;
53
54pub const UPPER_BOUND_ATTACHMENT_TIMESTAMP: usize = (3 ^ 27 - 1) / 2;
56pub const LOWER_BOUND_ATTACHMENT_TIMESTAMP: usize = 0;
58
59pub const TRITS_PER_BYTE: usize = 5;
61pub const TRITS_PER_TRYTE: usize = 3;
63pub const SEED_LENGTH_MAX: usize = 81;
65pub const ADDRESS_LENGTH_WITHOUT_CHECKSUM: usize = 81;
67pub const ADDRESS_LENGTH_WITH_CHECKSUM: usize = 90;
69pub const MESSAGE_LENGTH: usize = 2187;
71pub const TAG_LENGTH: usize = 27;
73
74pub const SIGNATURE_MESSAGE_FRAGMENT_TRINARY_SIZE: usize = 6561;
76pub const ADDRESS_TRINARY_SIZE: usize = 243;
78pub const VALUE_SIZE_TRINARY: usize = 81;
80pub const OBSOLETE_TAG_TRINARY_SIZE: usize = 81;
82pub const TIMESTAMP_TRINARY_SIZE: usize = 27;
84pub const CURRENT_INDEX_TRINARY_SIZE: usize = 27;
86pub const LAST_INDEX_TRINARY_SIZE: usize = 27;
88pub const BUNDLE_TRINARY_SIZE: usize = 243;
90pub const TRUNK_TRANSACTION_TRINARY_SIZE: usize = 243;
92pub const BRANCH_TRANSACTION_TRINARY_SIZE: usize = 243;
94pub const TAG_TRINARY_SIZE: usize = 81;
96pub const ATTACHMENT_TIMESTAMP_TRINARY_SIZE: usize = 27;
98pub const ATTACHMENT_TIMESTAMP_LOWER_BOUND_TRINARY_SIZE: usize = 27;
100pub const ATTACHMENT_TIMESTAMP_UPPER_BOUND_TRINARY_SIZE: usize = 27;
102pub const NONCE_TRINARY_SIZE: usize = 81;
104
105pub const TRANSACTION_TRINARY_SIZE: usize = SIGNATURE_MESSAGE_FRAGMENT_TRINARY_SIZE
107 + ADDRESS_TRINARY_SIZE
108 + VALUE_SIZE_TRINARY
109 + OBSOLETE_TAG_TRINARY_SIZE
110 + TIMESTAMP_TRINARY_SIZE
111 + CURRENT_INDEX_TRINARY_SIZE
112 + LAST_INDEX_TRINARY_SIZE
113 + BUNDLE_TRINARY_SIZE
114 + TRUNK_TRANSACTION_TRINARY_SIZE
115 + BRANCH_TRANSACTION_TRINARY_SIZE
116 + TAG_TRINARY_SIZE
117 + ATTACHMENT_TIMESTAMP_TRINARY_SIZE
118 + ATTACHMENT_TIMESTAMP_LOWER_BOUND_TRINARY_SIZE
119 + ATTACHMENT_TIMESTAMP_UPPER_BOUND_TRINARY_SIZE
120 + NONCE_TRINARY_SIZE;
121
122pub const INVALID_TRYTES_INPUT_ERROR: &str = "Invalid trytes provided.";
124pub const INVALID_HASHES_INPUT_ERROR: &str = "Invalid hashes provided.";
126pub const INVALID_TAIL_HASH_INPUT_ERROR: &str = "Invalid tail hash provided.";
128pub const INVALID_SEED_INPUT_ERROR: &str = "Invalid seed provided.";
130pub const INVALID_SECURITY_LEVEL_INPUT_ERROR: &str = "Invalid security level provided.";
132pub const INVALID_ATTACHED_TRYTES_INPUT_ERROR: &str = "Invalid attached trytes provided.";
134pub const INVALID_TRANSFERS_INPUT_ERROR: &str = "Invalid transfers provided.";
136pub const INVALID_ADDRESSES_INPUT_ERROR: &str = "Invalid addresses provided.";
138pub const INVALID_INPUT_ERROR: &str = "Invalid input provided.";
140
141pub const INVALID_BUNDLE_ERROR: &str = "Invalid bundle.";
143pub const INVALID_BUNDLE_SUM_ERROR: &str = "Invalid bundle sum.";
145pub const INVALID_BUNDLE_HASH_ERROR: &str = "Invalid bundle hash.";
147pub const INVALID_SIGNATURES_ERROR: &str = "Invalid signatures.";
149pub const INVALID_VALUE_TRANSFER_ERROR: &str =
151 "Invalid value transfer: the transfer does not require a signature.";
152
153pub const NOT_ENOUGH_BALANCE_ERROR: &str = "Not enough balance.";
155pub const NO_REMAINDER_ADDRESS_ERROR: &str = "No remainder address defined.";
157
158pub const GET_TRYTES_RESPONSE_ERROR: &str = "Get trytes response was null.";
160pub const GET_BUNDLE_RESPONSE_ERROR: &str = "Get bundle response was null.";
162pub const GET_INCLUSION_STATE_RESPONSE_ERROR: &str = "Get inclusion state response was null.";
164
165pub const SENDING_TO_USED_ADDRESS_ERROR: &str = "Sending to a used address.";
167pub const PRIVATE_KEY_REUSE_ERROR: &str = "Private key reuse detect!";
169pub const SEND_TO_INPUTS_ERROR: &str = "Send to inputs!";
171
172#[derive(Copy, Clone, Debug, PartialEq)]
176pub enum SecurityLevel {
177 Low = 1,
179 Medium = 2,
181 High = 3,
183}
184
185pub const ISS_FRAGMENTS: usize = 27;
187pub const ISS_KEY_LENGTH: usize = HASH_TRINARY_SIZE * ISS_FRAGMENTS;
189pub const ISS_CHUNK_LENGTH: usize = HASH_TRINARY_SIZE / TRINARY_RADIX;