cannot decode log data if the destination data size > 32 bytes?
Closed this issue · 4 comments
formingform commented
to docode the log data,
raw_data = "00000000000000000000000097ab3d4f7f5051f127b0e9f8d10772125d94d65b0000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000407c278b7e4320528bdbf5c02db611282b431dbaec2509b1fbebe3de4be7442a4114f1c9970ffd0c589afa8ef6262692efd4edae5d77c87641f21f44b1d082c3480000000000000000000000000000000000000000000000000000000000000030b969678ef2cf458b49b8c568d95e63221efe0f30383a9b0c5eb683bf2e23d118664631ce992d81ec4b6127ec0a760f8600000000000000000000000000000000"
data_bytes = Base.decode16!(raw_data , case: :mixed)
[owner, rate, pub_key, bls_key] = TypeDecoder.decode_raw(data_bytes, [:address, {:uint, 256}, {:bytes, 64}, {:bytes, 48}])
and get this error message, pub_key size is 64 bytes and bls_key size is 48 bytes.
** (FunctionClauseError) no function clause matching in ABI.TypeDecoder.decode_type/2
The following arguments were given to ABI.TypeDecoder.decode_type/2:
# 1
{:bytes, 48}
# 2
<<0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 48, 185, 105, 103, 142, 242, 207, 69, 139, 73, 184, 197, 104,
217, 94, 99, 34, 30, 254, ...>>
Attempted function clauses (showing 7 out of 7):
defp decode_type(-{:uint, size_in_bits}-, data)
defp decode_type(-{:int, size_in_bits}-, data)
defp decode_type({:bytes, size}, data) when size > 0 and -size <= 32-
defp decode_type(-{:array, type, size}-, data)
defp decode_type(-{:tuple, types}-, data)
defp decode_type(-:address-, data)
defp decode_type(-:bool-, data)
(ex_abi 0.7.0) lib/abi/type_decoder.ex:243: ABI.TypeDecoder.decode_type/2
(ex_abi 0.7.0) lib/abi/type_decoder.ex:190: anonymous fn/3 in ABI.TypeDecoder.do_decode_raw/2
(elixir 1.14.5) lib/enum.ex:2468: Enum."-reduce/3-lists^foldl/2-0-"/3
(ex_abi 0.7.0) lib/abi/type_decoder.ex:185: ABI.TypeDecoder.do_decode_raw/2
(ex_abi 0.7.0) lib/abi/type_decoder.ex:179: ABI.TypeDecoder.decode_raw/2
formingform commented
ex_abi version is 0.6.4 or 0.7.0
alisinabh commented
AFAIK there is no bytes64
type. For byte arrays larger than 32 bytes, just use :bytes
(dynamic sized byte array).
For your example:
raw_data = "00000000000000000000000097ab3d4f7f5051f127b0e9f8d10772125d94d65b0000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000407c278b7e4320528bdbf5c02db611282b431dbaec2509b1fbebe3de4be7442a4114f1c9970ffd0c589afa8ef6262692efd4edae5d77c87641f21f44b1d082c3480000000000000000000000000000000000000000000000000000000000000030b969678ef2cf458b49b8c568d95e63221efe0f30383a9b0c5eb683bf2e23d118664631ce992d81ec4b6127ec0a760f8600000000000000000000000000000000"
data_bytes = Base.decode16!(raw_data , case: :mixed)
[owner, rate, pub_key, bls_key] = TypeDecoder.decode_raw(data_bytes, [:address, {:uint, 256}, :bytes, :bytes])
formingform commented
It worked. Thank you very much!
formingform commented
great!