1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
//! Error handling types and utilities for contract execution.
//!
//! This module provides a lightweight error type based on integer error codes,
//! suitable for `no_std` environments. Contracts return error codes to the runtime,
//! which can be interpreted by clients.
//!
//! # Error Codes
//!
//! Error codes are `i32` values where:
//! - `0` = Success (OK)
//! - `1-99` = SDK/runtime errors
//! - `100+` = Contract-specific errors
//!
//! # Custom Errors
//!
//! Use the `#[error_code]` macro to define custom error enums:
//!
//! ```ignore
//! #[error_code(base = 1000)]
//! enum TokenError {
//! InsufficientBalance, // 1000
//! Unauthorized, // 1001
//! InvalidAmount, // 1002
//! }
//! ```
//!
//! # Guards
//!
//! Use the `#[require]` macro for precondition checks:
//!
//! ```ignore
//! #[require(amount > 0, TokenError::InvalidAmount)]
//! fn transfer(amount: u64) -> Result<()> {
//! // amount is guaranteed to be > 0
//! }
//! ```
/// Lightweight error type wrapping an `i32` error code.
///
/// This type is designed for `no_std` environments and minimal overhead.
/// Contracts return error codes to the runtime, which propagates them to clients.
///
/// # Error Code Ranges
///
/// - `0`: Success (OK)
/// - `1-9`: Core SDK errors
/// - `10-19`: ABI/calldata errors
/// - `20-29`: Codec/serialization errors
/// - `30-39`: Storage errors
/// - `40-49`: Validation errors (require)
/// - `100+`: Contract-specific errors
;
/// Error code for failed `#[require]` guards without custom error.
pub const ERR_REQUIRE: i32 = 40;
/// Result type alias using `Error` as the error type.
///
/// This is the standard result type for all SDK and contract functions.
///
/// # Example
///
/// ```ignore
/// fn transfer(to: AccountId, amount: u64) -> Result<()> {
/// if amount == 0 {
/// return Err(Error::new(ERR_INVALID_AMOUNT));
/// }
/// // ... perform transfer
/// Ok(())
/// }
/// ```
pub type Result<T> = Result;