ConsenSysMesh / py-eip712-structs

EIP712 data structure management for python
MIT License
34 stars 26 forks source link

.to_message() fails on Arrays #16

Open jvinet opened 2 years ago

jvinet commented 2 years ago

Test code:

import os
from eip712_structs import Bytes, Array, EIP712Struct, make_domain

class TestStruct(EIP712Struct):
    byte_array = Array(Bytes(32), 4)

byte_array = [os.urandom(32) for _ in range(4)]

domain = make_domain(name='hello')
s = TestStruct(byte_array=byte_array)
print(s.to_message(domain))

This code will raise:

Traceback (most recent call last):
  File "test.py", line 11, in <module>
    print(s.to_message(domain))
  File "site-packages/eip712_structs/struct.py", line 165, in to_message
    structs = {domain, self}
  File "site-packages/eip712_structs/struct.py", line 315, in __hash__
    value_hashes = [hash(k) ^ hash(v) for k, v in self.values.items()]
  File "site-packages/eip712_structs/struct.py", line 315, in <listcomp>
    value_hashes = [hash(k) ^ hash(v) for k, v in self.values.items()]
TypeError: unhashable type: 'list'
numpde commented 2 years ago

Same problem here. How about changing to structs = [domain, self] in that line?

gqoew commented 2 years ago

I have the same error when I used .to_message() on Arrays

and when I use .signable_bytes(domain) I get:

AttributeError: 'bytes' object has no attribute 'version'

PierreMkt commented 2 years ago

Same error. Any workaround found ?

jvinet commented 2 years ago

This project appears to be dormant. I used a custom solution instead: https://github.com/jvinet/eip712

Perhaps it can work for you, too.

josh-davis-vicinft commented 1 year ago

This is fixed in my branch at https://github.com/ViciNFT/py-eip712-structs. The answer posted by @numpde is part of the solution, and there were a few other changes required.

hao0707 commented 1 year ago

Array should pass variables of type tuple.Like this: byte_array = tuple([os.urandom(32) for _ in range(4)])