U
    Mf{                  
   @   sx   d dl mZ d dlmZ dZeeeeeeeedddZ	eeeeeeeeed	dd	Z
eeeeeeeeed
	ddZdS )    )a2b_hex)signingA   )chainIdverifyingContractmemberloggedIn	timestampmember_emailclient_pubkeyreturnc                 C   s
  t | tkstt |tkr(t|dks,tt |tkrDt|dksHtt |tksXtt |tkshtt |tksxtt |tkrt|dkstddddddgdddd	d
ddd
dddddddddddddgddddd| ||||||dd}|S )z

    :param chainId:
    :param blockNumber:
    :param verifyingContract:
    :param member:
    :param timestamp:
    :param member_email:
    :param client_pubkey:
    :return:
           namestring)r   typeversionr   Zuint256r   addressr   r   r	   Zuint64r
   r   Zbytes32)ZEIP712DomainEIP712MemberLoginr   ZXBR1)r   r   )r   r   r   r   r	   r
   r   )typesZprimaryTypedomainmessage)r   intAssertionErrorbyteslenstr)r   r   r   r   r	   r
   r   data r   E/tmp/pip-unpacked-wheel-8dj3wjqf/autobahn/xbr/_eip712_member_login.py_create_eip712_member_login!   sf    *;r!   )	eth_privkeyr   r   r   r   r	   r
   r   r   c                 C   s   t | tkrt| dkstt |tks,tt |tkrDt|dksHtt |tkr`t|dksdtt |tksttt |tkstt |tkstt |tkrt|dkstt|||||||}t|| }	tj	|	 }
t|
t
kst|
S )z

    :param eth_privkey: Ethereum address of buyer (a raw 20 bytes Ethereum address).
    :type eth_privkey: bytes

    :return: The signature according to EIP712 (32+32+1 raw bytes).
    :rtype: bytes
    r   r   )r   r   r   r   r   r   r!   r   Zsign_typed_dataZv_r_s_to_signature_EIP712_SIG_LEN)r"   r   r   r   r   r	   r
   r   r   _args	signaturer   r   r    sign_eip712_member_logint   s    


r&   )	r   r   r   r   r	   r
   r   r%   r   c           
      C   s   t | tkstt |tkr(t|dks,tt |tkrDt|dksHtt |tksXtt |tkshtt |tksxtt |tkrt|dkstt |tkrt|tkstt| ||||||}tj	|ft
| }	t|	dd S )z
    Recover the signer address the given EIP712 signature was signed with.

    :return: The (computed) signer address the signature was signed with.
    :rtype: bytes
    r   r      N)r   r   r   r   r   r   r#   r!   r   Zrecover_typed_dataZsignature_to_v_r_sr   )
r   r   r   r   r	   r
   r   r%   r   Zsigner_addressr   r   r    recover_eip712_member_login   s    	r(   N)binasciir   Zpy_eth_sig_utilsr   r#   r   r   r   dictr!   r&   r(   r   r   r   r    <module>   s,      S    (   