poanetwork / ex_abi

The Ethereum ABI Interface
GNU General Public License v3.0
61 stars 43 forks source link

cannot decode log data if the destination data size > 32 bytes? #160

Closed formingform closed 8 months ago

formingform commented 8 months ago

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 8 months ago

ex_abi version is 0.6.4 or 0.7.0

alisinabh commented 8 months ago

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 8 months ago

It worked. Thank you very much!

formingform commented 8 months ago

great!