abi decoding of custom error fails on trailing bytes
This commit is contained in:
parent
6d6777e8c3
commit
955ac2d58f
|
@ -29,6 +29,8 @@ func decode*[E: SolidityError](_: type E, data: seq[byte]): ?!(ref E) =
|
||||||
return failure "unable to decode " & $E & ": " & error.msg
|
return failure "unable to decode " & $E & ": " & error.msg
|
||||||
success (ref E)(arguments: arguments)
|
success (ref E)(arguments: arguments)
|
||||||
else:
|
else:
|
||||||
|
if data.len > 4:
|
||||||
|
return failure "unable to decode " & $E & ": unread trailing bytes found"
|
||||||
success (ref E)()
|
success (ref E)()
|
||||||
|
|
||||||
func encode*[E: SolidityError](_: type AbiEncoder, error: ref E): seq[byte] =
|
func encode*[E: SolidityError](_: type AbiEncoder, error: ref E): seq[byte] =
|
||||||
|
|
|
@ -34,6 +34,18 @@ suite "Decoding of custom errors":
|
||||||
let decoded = SimpleError.decode(invalid)
|
let decoded = SimpleError.decode(invalid)
|
||||||
check decoded.isFailure
|
check decoded.isFailure
|
||||||
|
|
||||||
|
test "returns failure when there are trailing bytes":
|
||||||
|
let invalid = @[0xc2'u8, 0xbb, 0x94, 0x7c, 0x0] # one byte too many
|
||||||
|
let decoded = SimpleError.decode(invalid)
|
||||||
|
check decoded.isFailure
|
||||||
|
|
||||||
|
test "returns failure when there are trailing bytes after arguments":
|
||||||
|
let error = (ref ErrorWithArguments)(arguments: (1.u256, true))
|
||||||
|
let encoded = AbiEncoder.encode(error)
|
||||||
|
let invalid = encoded & @[0x0'u8] # one byte too many
|
||||||
|
let decoded = ErrorWithArguments.decode(invalid)
|
||||||
|
check decoded.isFailure
|
||||||
|
|
||||||
test "decoding only works for SolidityErrors":
|
test "decoding only works for SolidityErrors":
|
||||||
type InvalidError = ref object of CatchableError
|
type InvalidError = ref object of CatchableError
|
||||||
const works = compiles:
|
const works = compiles:
|
||||||
|
|
Loading…
Reference in New Issue