Skip to content

Commit fa13b54

Browse files
committed
Rename Nested to Cause to better encapsulate meaning
Signed-off-by: Dave Crighton <dave.crighton@kaleido.io>
1 parent 107a207 commit fa13b54

2 files changed

Lines changed: 53 additions & 53 deletions

File tree

pkg/abi/reverterror.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,13 @@ const maxRevertErrorDepth = 10
3434

3535
// RevertError represents a decoded Solidity revert error. For nested errors
3636
// (where a contract catches a revert and re-throws with the original error
37-
// embedded in the string), the Nested field links to the inner decoded error,
37+
// embedded in the string), the Cause field links to the inner decoded error,
3838
// forming a recursive chain.
3939
type RevertError struct {
40-
ErrorEntry *Entry // the matched ABI error entry at this level
40+
ErrorEntry *Entry // the matched ABI error entry at this level
4141
cv *ComponentValue // decoded ABI data for this level
42-
Prefix string // readable text before a nested error
43-
Nested *RevertError // recursively decoded inner error, nil if none
42+
Prefix string // readable text before a nested error
43+
Cause *RevertError // recursively decoded inner error, nil if none
4444
}
4545

4646
// DecodeRevertError decodes raw EVM revert data into a RevertError,
@@ -115,14 +115,14 @@ func (r *RevertError) unwrapNested(ctx context.Context, selectors map[selectorKe
115115
return
116116
}
117117

118-
nested := &RevertError{ErrorEntry: entry, cv: cv}
118+
cause := &RevertError{ErrorEntry: entry, cv: cv}
119119
r.Prefix = SanitizeBinaryString(raw[:idx])
120-
r.Nested = nested
120+
r.Cause = cause
121121

122122
// If the nested error is also Error(string), keep unwrapping
123123
if entry.Name == "Error" && len(cv.Children) == 1 {
124124
if strVal, ok := cv.Children[0].Value.(string); ok {
125-
nested.unwrapNested(ctx, selectors, strVal, depth+1)
125+
cause.unwrapNested(ctx, selectors, strVal, depth+1)
126126
}
127127
}
128128
}
@@ -162,8 +162,8 @@ func (r *RevertError) String() string {
162162
}
163163
var b strings.Builder
164164
b.WriteString(r.Prefix)
165-
if r.Nested != nil {
166-
b.WriteString(r.Nested.String())
165+
if r.Cause != nil {
166+
b.WriteString(r.Cause.String())
167167
} else {
168168
b.WriteString(FormatErrorStringCtx(context.Background(), r.ErrorEntry, r.cv))
169169
}
@@ -205,11 +205,11 @@ func (r *RevertError) SerializeJSON(ctx context.Context, s *Serializer) ([]byte,
205205

206206
// Cause returns the next error in the chain (one level deeper), or nil
207207
// at the leaf. Analogous to Java's Throwable.getCause().
208-
func (r *RevertError) Cause() *RevertError {
208+
func (r *RevertError) GetCause() *RevertError {
209209
if r == nil {
210210
return nil
211211
}
212-
return r.Nested
212+
return r.Cause
213213
}
214214

215215
// Innermost walks the chain to return the deepest RevertError — the
@@ -219,8 +219,8 @@ func (r *RevertError) Innermost() *RevertError {
219219
return nil
220220
}
221221
cur := r
222-
for cur.Nested != nil {
223-
cur = cur.Nested
222+
for cur.Cause != nil {
223+
cur = cur.Cause
224224
}
225225
return cur
226226
}
@@ -232,7 +232,7 @@ func (r *RevertError) Errors() []*RevertError {
232232
return nil
233233
}
234234
var result []*RevertError
235-
for cur := r; cur != nil; cur = cur.Nested {
235+
for cur := r; cur != nil; cur = cur.Cause {
236236
result = append(result, cur)
237237
}
238238
return result

pkg/abi/reverterror_test.go

Lines changed: 39 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ func TestRevertErrorNilSerializeJSON(t *testing.T) {
5858

5959
func TestRevertErrorNilCause(t *testing.T) {
6060
var r *RevertError
61-
assert.Nil(t, r.Cause())
61+
assert.Nil(t, r.GetCause())
6262
}
6363

6464
func TestRevertErrorNilInnermost(t *testing.T) {
@@ -110,7 +110,7 @@ func TestRevertErrorSingleCause(t *testing.T) {
110110
entry := &Entry{Type: Error, Name: "AnError", Inputs: ParameterArray{{Name: "message", Type: "string"}}}
111111
cv := decodeTestError(t, entry, `{"message":"something went wrong"}`)
112112
r := &RevertError{ErrorEntry: entry, cv: cv}
113-
assert.Nil(t, r.Cause())
113+
assert.Nil(t, r.GetCause())
114114
}
115115

116116
func TestRevertErrorSingleInnermost(t *testing.T) {
@@ -146,7 +146,7 @@ func TestRevertErrorMultipleParams(t *testing.T) {
146146
assert.Equal(t, `ExampleError("test1","12345")`, r.String())
147147
}
148148

149-
// --- Two-level nested error ---
149+
// --- Two-levelCause error ---
150150

151151
func TestRevertErrorNestedTwoLevelString(t *testing.T) {
152152
innerEntry := &Entry{Type: Error, Name: "AnError", Inputs: ParameterArray{{Name: "message", Type: "string"}}}
@@ -159,7 +159,7 @@ func TestRevertErrorNestedTwoLevelString(t *testing.T) {
159159
ErrorEntry: outerEntry,
160160
cv: outerCV,
161161
Prefix: "[404]caught bytes",
162-
Nested: inner,
162+
Cause: inner,
163163
}
164164
assert.Equal(t, `[404]caught bytesAnError("I am an error")`, outer.String())
165165
}
@@ -173,7 +173,7 @@ func TestRevertErrorNestedTwoLevelSignatures(t *testing.T) {
173173
outer := &RevertError{
174174
ErrorEntry: outerEntry,
175175
Prefix: "[404]caught bytes",
176-
Nested: inner,
176+
Cause: inner,
177177
}
178178

179179
outerSig, err := outer.Signature()
@@ -191,10 +191,10 @@ func TestRevertErrorNestedTwoLevelCause(t *testing.T) {
191191
inner := &RevertError{ErrorEntry: innerEntry, cv: innerCV}
192192

193193
outerEntry := &Entry{Type: Error, Name: "Error", Inputs: ParameterArray{{Name: "reason", Type: "string"}}}
194-
outer := &RevertError{ErrorEntry: outerEntry, Prefix: "[404]caught bytes", Nested: inner}
194+
outer := &RevertError{ErrorEntry: outerEntry, Prefix: "[404]caught bytes", Cause: inner}
195195

196-
assert.Equal(t, inner, outer.Cause())
197-
assert.Nil(t, inner.Cause())
196+
assert.Equal(t, inner, outer.GetCause())
197+
assert.Nil(t, inner.GetCause())
198198
}
199199

200200
func TestRevertErrorNestedTwoLevelInnermost(t *testing.T) {
@@ -203,7 +203,7 @@ func TestRevertErrorNestedTwoLevelInnermost(t *testing.T) {
203203
inner := &RevertError{ErrorEntry: innerEntry, cv: innerCV}
204204

205205
outerEntry := &Entry{Type: Error, Name: "Error", Inputs: ParameterArray{{Name: "reason", Type: "string"}}}
206-
outer := &RevertError{ErrorEntry: outerEntry, Prefix: "[404]caught bytes", Nested: inner}
206+
outer := &RevertError{ErrorEntry: outerEntry, Prefix: "[404]caught bytes", Cause: inner}
207207

208208
assert.Equal(t, inner, outer.Innermost())
209209
assert.Equal(t, inner, inner.Innermost())
@@ -215,7 +215,7 @@ func TestRevertErrorNestedTwoLevelErrors(t *testing.T) {
215215
inner := &RevertError{ErrorEntry: innerEntry, cv: innerCV}
216216

217217
outerEntry := &Entry{Type: Error, Name: "Error", Inputs: ParameterArray{{Name: "reason", Type: "string"}}}
218-
outer := &RevertError{ErrorEntry: outerEntry, Prefix: "[404]caught bytes", Nested: inner}
218+
outer := &RevertError{ErrorEntry: outerEntry, Prefix: "[404]caught bytes", Cause: inner}
219219

220220
errs := outer.Errors()
221221
require.Len(t, errs, 2)
@@ -230,25 +230,25 @@ func TestRevertErrorNestedTwoLevelSerializeJSONInnermost(t *testing.T) {
230230

231231
outerEntry := &Entry{Type: Error, Name: "Error", Inputs: ParameterArray{{Name: "reason", Type: "string"}}}
232232
outerCV := decodeTestError(t, outerEntry, `{"reason":"raw bytes here"}`)
233-
outer := &RevertError{ErrorEntry: outerEntry, cv: outerCV, Prefix: "[404]caught bytes", Nested: inner}
233+
outer := &RevertError{ErrorEntry: outerEntry, cv: outerCV, Prefix: "[404]caught bytes", Cause: inner}
234234

235235
b, err := outer.Innermost().SerializeJSON(context.Background(), nil)
236236
assert.NoError(t, err)
237237
assert.Contains(t, string(b), "I am an error")
238238
}
239239

240-
// --- Three-level nested error ---
240+
// --- Three-levelCause error ---
241241

242242
func TestRevertErrorNestedThreeLevelString(t *testing.T) {
243243
leafEntry := &Entry{Type: Error, Name: "RootCause", Inputs: ParameterArray{{Name: "detail", Type: "string"}}}
244244
leafCV := decodeTestError(t, leafEntry, `{"detail":"the real problem"}`)
245245
leaf := &RevertError{ErrorEntry: leafEntry, cv: leafCV}
246246

247247
middleEntry := &Entry{Type: Error, Name: "Error", Inputs: ParameterArray{{Name: "reason", Type: "string"}}}
248-
middle := &RevertError{ErrorEntry: middleEntry, Prefix: "middleware: ", Nested: leaf}
248+
middle := &RevertError{ErrorEntry: middleEntry, Prefix: "middleware: ", Cause: leaf}
249249

250250
outerEntry := &Entry{Type: Error, Name: "Error", Inputs: ParameterArray{{Name: "reason", Type: "string"}}}
251-
outer := &RevertError{ErrorEntry: outerEntry, Prefix: "gateway: ", Nested: middle}
251+
outer := &RevertError{ErrorEntry: outerEntry, Prefix: "gateway: ", Cause: middle}
252252

253253
assert.Equal(t, `gateway: middleware: RootCause("the real problem")`, outer.String())
254254
}
@@ -258,8 +258,8 @@ func TestRevertErrorNestedThreeLevelInnermost(t *testing.T) {
258258
leafCV := decodeTestError(t, leafEntry, `{"detail":"the real problem"}`)
259259
leaf := &RevertError{ErrorEntry: leafEntry, cv: leafCV}
260260

261-
middle := &RevertError{ErrorEntry: &Entry{Type: Error, Name: "Error"}, Prefix: "middleware: ", Nested: leaf}
262-
outer := &RevertError{ErrorEntry: &Entry{Type: Error, Name: "Error"}, Prefix: "gateway: ", Nested: middle}
261+
middle := &RevertError{ErrorEntry: &Entry{Type: Error, Name: "Error"}, Prefix: "middleware: ", Cause: leaf}
262+
outer := &RevertError{ErrorEntry: &Entry{Type: Error, Name: "Error"}, Prefix: "gateway: ", Cause: middle}
263263

264264
assert.Equal(t, leaf, outer.Innermost())
265265
}
@@ -269,8 +269,8 @@ func TestRevertErrorNestedThreeLevelErrors(t *testing.T) {
269269
leafCV := decodeTestError(t, leafEntry, `{"detail":"the real problem"}`)
270270
leaf := &RevertError{ErrorEntry: leafEntry, cv: leafCV}
271271

272-
middle := &RevertError{ErrorEntry: &Entry{Type: Error, Name: "Error"}, Prefix: "middleware: ", Nested: leaf}
273-
outer := &RevertError{ErrorEntry: &Entry{Type: Error, Name: "Error"}, Prefix: "gateway: ", Nested: middle}
272+
middle := &RevertError{ErrorEntry: &Entry{Type: Error, Name: "Error"}, Prefix: "middleware: ", Cause: leaf}
273+
outer := &RevertError{ErrorEntry: &Entry{Type: Error, Name: "Error"}, Prefix: "gateway: ", Cause: middle}
274274

275275
errs := outer.Errors()
276276
require.Len(t, errs, 3)
@@ -284,12 +284,12 @@ func TestRevertErrorNestedThreeLevelCauseChain(t *testing.T) {
284284
leafCV := decodeTestError(t, leafEntry, `{"detail":"the real problem"}`)
285285
leaf := &RevertError{ErrorEntry: leafEntry, cv: leafCV}
286286

287-
middle := &RevertError{ErrorEntry: &Entry{Type: Error, Name: "Error"}, Nested: leaf}
288-
outer := &RevertError{ErrorEntry: &Entry{Type: Error, Name: "Error"}, Nested: middle}
287+
middle := &RevertError{ErrorEntry: &Entry{Type: Error, Name: "Error"}, Cause: leaf}
288+
outer := &RevertError{ErrorEntry: &Entry{Type: Error, Name: "Error"}, Cause: middle}
289289

290-
assert.Equal(t, middle, outer.Cause())
291-
assert.Equal(t, leaf, outer.Cause().Cause())
292-
assert.Nil(t, outer.Cause().Cause().Cause())
290+
assert.Equal(t, middle, outer.GetCause())
291+
assert.Equal(t, leaf, outer.GetCause().GetCause())
292+
assert.Nil(t, outer.GetCause().GetCause().GetCause())
293293
}
294294

295295
// --- SerializeJSON with custom serializer ---
@@ -315,7 +315,7 @@ func TestRevertErrorEmptyPrefix(t *testing.T) {
315315
outer := &RevertError{
316316
ErrorEntry: &Entry{Type: Error, Name: "Error", Inputs: ParameterArray{{Name: "reason", Type: "string"}}},
317317
Prefix: "",
318-
Nested: inner,
318+
Cause: inner,
319319
}
320320
assert.Equal(t, `AnError("direct")`, outer.String())
321321
}
@@ -338,7 +338,7 @@ func TestDecodeRevertErrorDefaultErrorString(t *testing.T) {
338338
require.NotNil(t, r)
339339
assert.Equal(t, "Error", r.ErrorEntry.Name)
340340
assert.Equal(t, `Error("Not enough Ether provided.")`, r.String())
341-
assert.Nil(t, r.Cause())
341+
assert.Nil(t, r.GetCause())
342342
}
343343

344344
func TestDecodeRevertErrorDefaultPanic(t *testing.T) {
@@ -445,7 +445,7 @@ func testEncodeError(t *testing.T, entry *Entry, jsonArgs string) []byte {
445445
return encoded
446446
}
447447

448-
// --- Nested unwrapping (DecodeRevertError with nesting) ---
448+
// ---Cause unwrapping (DecodeRevertError with nesting) ---
449449

450450
func TestDecodeRevertErrorSingleNested(t *testing.T) {
451451
innerABI := buildErrorStringABI([]byte("inner error message"))
@@ -456,9 +456,9 @@ func TestDecodeRevertErrorSingleNested(t *testing.T) {
456456
assert.Equal(t, "Error", r.ErrorEntry.Name)
457457
assert.Equal(t, "outer: ", r.Prefix)
458458

459-
require.NotNil(t, r.Cause())
460-
assert.Equal(t, "Error", r.Cause().ErrorEntry.Name)
461-
assert.Nil(t, r.Cause().Cause())
459+
require.NotNil(t, r.GetCause())
460+
assert.Equal(t, "Error", r.GetCause().ErrorEntry.Name)
461+
assert.Nil(t, r.GetCause().GetCause())
462462

463463
assert.Equal(t, `outer: Error("inner error message")`, r.String())
464464
}
@@ -472,13 +472,13 @@ func TestDecodeRevertErrorDoubleNested(t *testing.T) {
472472
require.NotNil(t, r)
473473
assert.Equal(t, "level1: ", r.Prefix)
474474

475-
mid := r.Cause()
475+
mid := r.GetCause()
476476
require.NotNil(t, mid)
477477
assert.Equal(t, "level2: ", mid.Prefix)
478478

479-
leaf := mid.Cause()
479+
leaf := mid.GetCause()
480480
require.NotNil(t, leaf)
481-
assert.Nil(t, leaf.Cause())
481+
assert.Nil(t, leaf.GetCause())
482482

483483
assert.Equal(t, `level1: level2: Error("deepest error")`, r.String())
484484
assert.Equal(t, leaf, r.Innermost())
@@ -498,10 +498,10 @@ func TestDecodeRevertErrorNestedCustomError(t *testing.T) {
498498
assert.Equal(t, "Error", r.ErrorEntry.Name)
499499
assert.Equal(t, "[404]01d - caught bytes:", r.Prefix)
500500

501-
inner := r.Cause()
501+
inner := r.GetCause()
502502
require.NotNil(t, inner)
503503
assert.Equal(t, "MyCustomError", inner.ErrorEntry.Name)
504-
assert.Nil(t, inner.Cause())
504+
assert.Nil(t, inner.GetCause())
505505

506506
sig, err := inner.Signature()
507507
assert.NoError(t, err)
@@ -525,7 +525,7 @@ func TestDecodeRevertErrorCustomBeforeDefaultNested(t *testing.T) {
525525
require.NotNil(t, r)
526526
assert.Equal(t, "head:", r.Prefix)
527527

528-
inner := r.Cause()
528+
inner := r.GetCause()
529529
require.NotNil(t, inner)
530530
assert.Equal(t, "EarlyErr", inner.ErrorEntry.Name, "first matching selector wins")
531531
}
@@ -536,7 +536,7 @@ func TestDecodeRevertErrorNoNesting(t *testing.T) {
536536
r := ABI{}.DecodeRevertError(outerABI)
537537
require.NotNil(t, r)
538538
assert.Equal(t, "", r.Prefix)
539-
assert.Nil(t, r.Cause())
539+
assert.Nil(t, r.GetCause())
540540
assert.Equal(t, `Error("plain error with no nesting")`, r.String())
541541
}
542542

@@ -550,7 +550,7 @@ func TestDecodeRevertErrorMalformedNested(t *testing.T) {
550550

551551
r := ABI{}.DecodeRevertError(outerABI)
552552
require.NotNil(t, r)
553-
assert.Nil(t, r.Cause(), "malformed nested data should not produce a nested error")
553+
assert.Nil(t, r.GetCause(), "malformedCause data should not produce aCause error")
554554
assert.Equal(t, "", r.Prefix)
555555
}
556556

@@ -565,7 +565,7 @@ func TestDecodeRevertErrorDepthLimit(t *testing.T) {
565565
require.NotNil(t, r)
566566

567567
depth := 0
568-
for cur := r; cur != nil; cur = cur.Cause() {
568+
for cur := r; cur != nil; cur = cur.GetCause() {
569569
depth++
570570
}
571571
assert.LessOrEqual(t, depth, maxRevertErrorDepth+1, "chain should be capped by depth limit")
@@ -596,7 +596,7 @@ func TestDecodeRevertErrorNestedSignatures(t *testing.T) {
596596
assert.NoError(t, err)
597597
assert.Equal(t, "Error(string)", outerSig)
598598

599-
innerSig, err := r.Cause().Signature()
599+
innerSig, err := r.GetCause().Signature()
600600
assert.NoError(t, err)
601601
assert.Equal(t, "Error(string)", innerSig)
602602
}

0 commit comments

Comments
 (0)