@@ -90,23 +90,104 @@ const (
90
90
// RESERVED_31 ExitCode = 31
91
91
)
92
92
93
- // FvmError fvm error include error code and error message
94
- type FvmError struct {
95
- code ExitCode
93
+ // ErrorNumber When a syscall fails, it returns an `ErrorNumber` to indicate why
94
+ type ErrorNumber uint32
95
+
96
+ // Error return error message of ErrorNumber
97
+ func (e ErrorNumber ) Error () string {
98
+ return enToString (uint32 (e ))
99
+ }
100
+
101
+ func (e ErrorNumber ) String () string {
102
+ return enToString (uint32 (e ))
103
+ }
104
+
105
+ // EnToString return string message of ErrorNumber
106
+ func enToString (code uint32 ) string {
107
+ switch code {
108
+ case 1 :
109
+ return "illegal argument"
110
+ case 2 :
111
+ return "illegal operation"
112
+ case 3 :
113
+ return "limit exceeded"
114
+ case 4 :
115
+ return "filecoin assertion failed"
116
+ case 5 :
117
+ return "insufficient funds"
118
+ case 6 :
119
+ return "resource not found"
120
+ case 7 :
121
+ return "invalid ipld block handle"
122
+ case 8 :
123
+ return "illegal cid specification"
124
+ case 9 :
125
+ return "illegal ipld codec"
126
+ case 10 :
127
+ return "serialization error"
128
+ case 11 :
129
+ return "operation forbidden"
130
+ case 12 :
131
+ return "buffer too small"
132
+ }
133
+ return "other error"
134
+ }
135
+
136
+ // Is check whether error is ErrorNumber
137
+ func (e ErrorNumber ) Is (code error ) bool {
138
+ return e == code
139
+ }
140
+
141
+ // nolint
142
+ const (
143
+ // A syscall parameters was invalid.
144
+ IllegalArgument ErrorNumber = 1
145
+ // The actor is not in the correct state to perform the requested operation.
146
+ IllegalOperation ErrorNumber = 2
147
+ // This syscall would exceed some system limit (memory, lookback, call depth, etc.).
148
+ LimitExceeded ErrorNumber = 3
149
+ // A system-level assertion has failed.
150
+ //
151
+ // # Note
152
+ //
153
+ // Non-system actors should never receive this error number. A system-level assertion will
154
+ // cause the entire message to fail.
155
+ AssertionFailed ErrorNumber = 4
156
+ // There were insufficient funds to complete the requested operation.
157
+ InsufficientFunds ErrorNumber = 5
158
+ // A resource was not found.
159
+ NotFound ErrorNumber = 6
160
+ // The specified IPLD block handle was invalid.
161
+ InvalidHandle ErrorNumber = 7
162
+ // The requested CID shape (multihash codec, multihash length) isn't supported.
163
+ IllegalCid ErrorNumber = 8
164
+ // The requested IPLD codec isn't supported.
165
+ IllegalCodec ErrorNumber = 9
166
+ // The IPLD block did not match the specified IPLD codec.
167
+ Serialization ErrorNumber = 10
168
+ // The operation is forbidden.
169
+ Forbidden ErrorNumber = 11
170
+ // The passed buffer is too small.
171
+ BufferTooSmall ErrorNumber = 12
172
+ )
173
+
174
+ // SysCallError Fvm error number include error code and error message
175
+ type SysCallError struct {
176
+ code ErrorNumber
96
177
message string
97
178
}
98
179
99
- // NewFvmError new fvm error from error code and message
100
- func NewFvmError (code ExitCode , msg string ) FvmError {
101
- return FvmError {code , msg }
180
+ // NewSysCallError new fvm error number from error code and message
181
+ func NewSysCallError (code ErrorNumber , msg string ) SysCallError {
182
+ return SysCallError {code , msg }
102
183
}
103
184
104
- // Error return error message for fvm error
105
- func (fvmError FvmError ) Error () string {
106
- return fmt .Sprintf ("%s %d " , fvmError .message , fvmError .code )
185
+ // Error return error message for fvm error number
186
+ func (e SysCallError ) Error () string {
187
+ return fmt .Sprintf ("%s (%d)%s " , e .message , e . code , e .code )
107
188
}
108
189
109
190
// Unwrap return inner error code
110
- func (fvmError FvmError ) Unwrap () error {
111
- return fvmError .code
191
+ func (e SysCallError ) Unwrap () error {
192
+ return e .code
112
193
}
0 commit comments