o
    èó·iƒ  ã                   @   sì   d dl Z d dlZd dlZd dlZd dlmZmZ d dlmZm	Z	 d dl
mZ ddlmZmZ d dlmZ d dlZd dlZd dlZd dlZd dlZd dlZdd	lmZmZ dd
lmZmZ G dd„ deƒZG dd„ deƒZG dd„ deƒZ dS )é    N)ÚRegisterOptionsÚCallDetails)ÚApplicationErrorÚTransportLost)ÚApplicationSessioné   )Úunpack_uint256Úpack_uint256)Útime_nsé   )ÚhlÚhlval)Úsign_eip712_channel_closeÚrecover_eip712_channel_closec                   @   sN   e Zd ZdZddd„Zedd„ ƒZdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ ZdS )Ú	KeySeriesz}
    Data encryption key series with automatic (time-based) key rotation
    and key offering (to the XBR market maker).
    Nc                 C   sì   t |ƒtkrt|ƒdksJ ‚t |ƒtkr|dksJ ‚|du s*t |ƒtkr(|dks*J ‚|du s:t |ƒtkr8|dks:J ‚|du rB|dusL|durJ|du sLJ ‚|du sVt|ƒsVJ ‚|| _|| _|| _|| _d| _	|| _
d| _d| _d| _i | _dS )aÿ  

        :param api_id: ID of the API for which to generate keys.
        :type api_id: bytes

        :param price: Price per key in key series.
        :type price: int

        :param interval: Interval in seconds after which to auto-rotate key.
        :type interval: int

        :param count: Number of encryption operations after which to auto-rotate key.
        :type count: int

        :param on_rotate: Optional user callback fired after key was rotated.
        :type on_rotate: callable
        é   r   N)ÚtypeÚbytesÚlenÚintÚcallableÚ_api_idZ_priceZ	_intervalÚ_countÚ_count_currentÚ
_on_rotateÚ_idÚ_keyÚ_boxÚ_archive)ÚselfÚapi_idÚpriceÚintervalÚcountÚ	on_rotate© r%   úZC:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\autobahn/xbr/_seller.pyÚ__init__7   s      $
zKeySeries.__init__c                 C   s   | j S )zº
        Get current XBR data encryption key ID (of the keys being rotated
        in a series).

        :return: Current key ID in key series (16 bytes).
        :rtype: bytes
        N)r   ©r   r%   r%   r&   Úkey_id\   s   	zKeySeries.key_idc                 Ã   s\   �t  |¡}| jdur"|  jd7  _| j| jkr"|  ¡ I dH  d| _| j |¡}| jd|fS )zý
        Encrypt data with the current XBR data encryption key.

        :param payload: Application payload to encrypt.
        :type payload: object

        :return: The ciphertext for the encrypted application payload.
        :rtype: bytes
        Nr   r   Zcbor)Úcbor2Údumpsr   r   Ú_rotater   Úencryptr   )r   ÚpayloadÚdataÚ
ciphertextr%   r%   r&   r-   g   s   €


zKeySeries.encryptc                 C   sx   t |ƒtkrt|ƒdksJ ‚t |ƒtkrt|ƒdksJ ‚| j| \}}tj tjj|tjj	d�¡}|j
|tjj	d�}|S )aÚ  
        Encrypt a (previously used) XBR data encryption key with a buyer public key.

        :param key_id: ID of the data encryption key to encrypt.
        :type key_id: bytes

        :param buyer_pubkey: Buyer WAMP public key (Ed25519) to asymmetrically encrypt
            the data encryption key (selected by ``key_id``) against.
        :type buyer_pubkey: bytes

        :return: The ciphertext for the encrypted data encryption key.
        :rtype: bytes
        r   é    )ÚencoderN)r   r   r   r   ÚnaclÚpublicZ	SealedBoxZ	PublicKeyÚencodingZ
RawEncoderr-   )r   r)   Úbuyer_pubkeyÚkeyÚ_Zsendkey_boxZencrypted_keyr%   r%   r&   Úencrypt_key}   s   ÿzKeySeries.encrypt_keyc                 C   ó   t ƒ ‚©N©ÚNotImplementedErrorr(   r%   r%   r&   Ústart—   ó   zKeySeries.startc                 C   r:   r;   r<   r(   r%   r%   r&   Ústopš   r?   zKeySeries.stopc                 Ã   sœ   �t  d¡| _tj tjjj¡| _	tj | j	¡| _
| j	| j
f| j| j< | jjdtddd�ttj| jd�ƒttj| jd�ƒd� | jrL|  | ¡I d H  d S d S )Nr   z4{tx_type} key "{key_id}" rotated [api_id="{api_id}"]z
XBR ROTATEÚmagenta©Úcolor©r   )Útx_typer)   r    )ÚosÚurandomr   r3   ÚutilsÚrandomÚsecretZ	SecretBoxZKEY_SIZEr   r   r   ÚlogÚdebugr   ÚuuidÚUUIDr   r   r(   r%   r%   r&   r,   �   s   €
üÿzKeySeries._rotate©NNN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r'   Úpropertyr)   r-   r9   r>   r@   r,   r%   r%   r%   r&   r   1   s    
%

r   c                   @   s   e Zd Zdd„ ZdS )ÚPayingChannelc                 C   sb   t |ƒtkrt|ƒdksJ ‚t |ƒtkr|dksJ ‚t |ƒtkr$|dks&J ‚|| _|| _|| _d S )Nr   r   )r   r   r   r   Z_adrÚ_seqÚ_balance)r   ZadrÚseqÚbalancer%   r%   r&   r'   ¶   s   
zPayingChannel.__init__N)rP   rQ   rR   r'   r%   r%   r%   r&   rU   µ   s    rU   c                   @   s~   e Zd ZdZdZdZdZdZdZdZ	ddd„Z
ed	d
„ ƒZddd„Zdd„ Zdd„ Zdd„ Zdd„ Z	ddd„Zddd„ZdS )ÚSimpleSellerNr   r   r   é   é   c                 C   s   t |ƒtkrt|ƒdksJ d |¡ƒ‚t |ƒtkrt|ƒdks&J d |¡ƒ‚|du s7t |ƒtks7J d |¡ƒ‚t ¡ | _tj	| _
|| _d| _|| _tj |¡| _d| _| jj ¡ | _d| _|pdt| jjƒ| _i | _d| _d| _d| _i | _i | _d| _d| _dS )aå  

        :param market_maker_adr: Market maker public Ethereum address (20 bytes).
        :type market_maker_adr: bytes

        :param seller_key: Seller (delegate) private Ethereum key (32 bytes).
        :type seller_key: bytes

        :param provider_id: Optional explicit data provider ID. When not given, the seller delegate
            public WAMP key (Ed25519 in Hex) is used as the provider ID. This must be a valid WAMP URI part.
        :type provider_id: string
        é   z0market_maker_adr must be bytes[20], but got "{}"r1   z/seller delegate must be bytes[32], but got "{}"Nz0provider_id must be None or string, but got "{}"r   ) r   r   r   ÚformatÚstrÚtxaioZmake_loggerrK   rZ   Ú
STATE_NONEÚ_stateÚ_market_maker_adrÚ_xbrmm_configÚ	_pkey_rawÚeth_keysÚkeysZ
PrivateKeyÚ_pkeyZ_acctÚ
public_keyZto_canonical_addressÚ_addrÚ_caddrÚ_provider_idÚ	_channelsÚ_channelrW   rV   Ú_keysÚ	_keys_mapÚ_sessionÚ_session_regs)r   Úmarket_maker_adrZ
seller_keyÚprovider_idr%   r%   r&   r'   Ê   s*   &&"

zSimpleSeller.__init__c                 C   s   | j jS )z�
        This seller delegate public Ethereum key.

        :return: Ethereum public key of this seller delegate.
        :rtype: bytes
        N)rh   ri   r(   r%   r%   r&   ri     s   zSimpleSeller.public_keyc           	         s(  t ˆ ƒtkrtˆ ƒdkrˆ ˆjvsJ ‚t ˆƒtkrˆdksJ ‚|du s/t |ƒtkr-|dks/J ‚|du s?t |ƒtkr=|dks?J ‚|du rG|dusQ|durO|du sQJ ‚ˆdu sqt ˆƒtkrmdd„ ˆ ¡ D ƒrmdd„ ˆ ¡ D ƒsqJ dƒ‚‡ ‡‡‡‡fdd	„}ˆjˆ ˆ|||d
�}|ˆjˆ < ˆj	j
d|d� |S )a  
        Add a new (rotating) private encryption key for encrypting data on the given API.

        :param api_id: API for which to create a new series of rotating encryption keys.
        :type api_id: bytes

        :param price: Price in XBR token per key.
        :type price: int

        :param interval: Interval (in seconds) after which to auto-rotate the encryption key.
        :type interval: int

        :param count: Number of encryption operations after which to auto-rotate the encryption key.
        :type count: int
        r   r   Nc                 s   ó   � | ]	}t |ƒtkV  qd S r;   ©r   r_   )Ú.0Úkr%   r%   r&   Ú	<genexpr>+  ó   € z#SimpleSeller.add.<locals>.<genexpr>c                 s   ru   r;   rv   )rw   Úvr%   r%   r&   ry   +  rz   zZinvalid categories type (must be dict) or category key or value type (must both be string)c           	      “   s´  �| j }| ˆj|< d}|rØzqtƒ d }ˆj}t d¡}ˆj}ˆjjd|ˆ ˆ|||d ˆd ur1t	ˆƒnd ˆd d |d�I d H }ˆj
jdtddd	�ttj|d
�ƒttjˆ d
�ƒttˆd ur_tˆd ƒndƒd dd	�tt |¡ ¡ ƒtˆƒd� ˆj
jd|d� W d S  ty¨ } z|jdkr’ˆj
 d¡ nˆj
 ¡  W Y d }~d S W Y d }~nd }~w ty·   ˆj
 d¡ Y d S    ˆj
 ¡  Y |d8 }ˆj
jd|d� t d¡I d H  |sd S d S )Né   l    d(	 éA   zxbr.marketmaker.place_offer)Zprivkeyr!   Ú
categoriesÚexpiresZcopiesrt   zh{tx_type} key "{key_id}" offered for {price} [api_id={api_id}, prefix="{prefix}", delegate="{delegate}"]z
XBR OFFER rA   rB   rD   ì     ÈNÎZor   ú XBR)rE   r)   r    r!   ÚdelegateÚprefixzoffer={offer})Úofferzwamp.error.no_such_procedurez-xbr.marketmaker.offer: procedure unavailable!z2TransportLost while calling xbr.marketmaker.offer!r   z6Failed to place offer for key! Retrying {retries}/5 ..)Úretries)r)   rp   r
   rj   rF   rG   rl   rq   Úcallr	   rK   rL   r   rM   rN   r_   r   ÚbinasciiÚb2a_hexÚdecoder   ÚerrorÚwarnÚfailurer   ÚasyncioÚsleep)	Ú
key_seriesr)   r…   Z
valid_fromr‚   Ú	signaturert   r„   Úe©r    r~   rƒ   r!   r   r%   r&   r$   -  sf   €


ô
&ù	

ý€Ïz#SimpleSeller.add.<locals>.on_rotate)r"   r#   r$   z#Created new key series {key_series})r�   )r   r   r   ro   r   Údictrg   Úvaluesr   rK   rL   )	r   r    rƒ   r!   r"   r#   r~   r$   r�   r%   r’   r&   Úadd  s   &  $@=
zSimpleSeller.addc                 Ã   s`  �t |tƒsJ d |¡ƒ‚| jtjtjfv sJ dƒ‚tj| _|| _g | _	| j
jdt| jƒt | jjdd… ¡ ¡ d� | d| j¡I dH | _| jsMtdƒ‚| jd	 }t|ƒtkr^t|ƒd
ks`J ‚tj|d�| _d | j¡}|j| j|t dd�d�I dH }| j	 !|¡ | j
jdt|j"ƒd� d | j¡}|j| j#|t dd�d�I dH }| j	 !|¡ | j
jdt|j"ƒd� | j$ %¡ D ]	}| &¡ I dH  q¸| d¡I dH | _'| d| jj¡I dH }t|d ƒtkræt(|d ƒ|d< |d dksðtdƒ‚t)||d |d ƒ| j*|< tj+| _|d | _,t| j,ƒtk�rt(| j,ƒ| _,|d | _-| j
j.dt| jƒt/| j,ƒt/| j-ƒd� |d S )zü
        Start rotating keys and placing key offers with the XBR market maker.

        :param session: WAMP session over which to communicate with the XBR market maker.
        :type session: :class:`autobahn.wamp.protocol.ApplicationSession`
        z/session must be an ApplicationSession, was "{}"zseller already runningzRStart selling from seller delegate address {address} (public key 0x{public_key}..)Né
   )Úaddressri   z)xbr.marketmaker.get_active_paying_channelzno active paying channel foundÚchannel_oidr   rD   zxbr.provider.{}.sellÚdetails)Zdetails_arg)Úoptionsz"Registered procedure "{procedure}")Ú	procedurezxbr.provider.{}.close_channelzxbr.marketmaker.get_configú*xbr.marketmaker.get_paying_channel_balanceÚ	remainingr   z0no off-chain balance remaining on paying channelrX   zvOk, seller delegate started [active paying channel {channel_oid} with remaining balance {remaining} at sequence {seq}])r˜   r�   rX   )0Ú
isinstancer   r^   rb   rZ   ra   ÚSTATE_STOPPEDÚSTATE_STARTINGrq   rr   rK   rL   r   rk   r‡   rˆ   rh   ri   r‰   r†   rj   rn   Ú	Exceptionr   r   r   rM   rN   Z_channel_oidrl   ÚregisterÚsellr   Úappendr›   Úclose_channelro   r”   r>   rd   r   rU   rm   ÚSTATE_STARTEDrW   rV   Úinfor   )r   Úsessionr˜   r›   Úregr�   Úpaying_balancer%   r%   r&   r>   p  sT   €þ


ÿzSimpleSeller.startc                 Ã   sà   �| j tjfv sJ dƒ‚tj| _ g }| j ¡ D ]}| ¡ }| |¡ q| jr@| j	r=| j	 
¡ r=| jD ]}| ¡ }| |¡ q1d| _t |¡}zz|I dH  W n	   | j ¡  Y W tj| _ d| _	ntj| _ d| _	w | j d¡ dS )zF
        Stop rotating/offering keys to the XBR market maker.
        úseller not runningNzOk, seller delegate stopped.)rb   rZ   r¦   ÚSTATE_STOPPINGro   r”   r@   r¤   rr   rq   Úis_attachedÚ
unregisterr`   ÚgatherrK   rŒ   rŸ   r§   )r   Údlr�   Údr©   r%   r%   r&   r@   ±  s0   €

€ÿzSimpleSeller.stopc                 Ã   sN   �| j tjfvrtdƒ‚| jr| j ¡ stdƒ‚| j d| jd ¡I dH }|S )a   
        Return current (off-chain) balance of paying channel:

        * ``amount``: The initial amount with which the paying channel was opened.
        * ``remaining``: The remaining amount of XBR in the paying channel that can be earned.
        * ``inflight``: The amount of XBR allocated to sell transactions that are currently processed.

        :return: Current paying balance.
        :rtype: dict
        r«   z!market-maker session not attachedrœ   r˜   N)rb   rZ   r¦   ÚRuntimeErrorrq   r­   r†   rn   )r   rª   r%   r%   r&   rY   Ò  s   €zSimpleSeller.balancec                 Ã   sn   �t |ƒtkrt|ƒdkr|| jv sJ ‚t |ƒtksJ ‚|dus"J ‚| j| }| |¡I dH \}}}|||fS )aG  
        Encrypt and wrap application payload for a given API and destined for a specific WAMP URI.

        :param api_id: API for which to encrypt and wrap the application payload for.
        :type api_id: bytes

        :param uri: WAMP URI the application payload is destined for (eg the procedure or topic URI).
        :type uri: str

        :param payload: Application payload to encrypt and wrap.
        :type payload: object

        :return: The encrypted and wrapped application payload: a tuple with ``(key_id, serializer, ciphertext)``.
        :rtype: tuple
        r   N)r   r   r   ro   r_   r-   )r   r    Úurir.   Z	keyseriesr)   Ú
serializerr0   r%   r%   r&   Úwrapæ  s   €&

zSimpleSeller.wrapc              
   C   sÀ  t |ƒtkrt|ƒdksJ d t |ƒ¡ƒ‚t |ƒtkr!t|ƒdks*J d t |ƒ¡ƒ‚t |ƒtks9J d t |ƒ¡ƒ‚t |ƒtkrEt|ƒdksNJ d t |ƒ¡ƒ‚t |ƒtks]J d t |ƒ¡ƒ‚t |ƒtkrit|ƒd	ksrJ d
 t |ƒ¡ƒ‚|du st|tƒsJ dƒ‚|| jkr›t	dd | j
jt | j¡ ¡ t |¡ ¡ ¡ƒ‚|| jd krÀ| j ¡  t	dd | j
jt | jd ¡ ¡ t |¡ ¡ ¡ƒ‚|| jkrÔt	dd | j
j| jd |¡ƒ‚t|ƒ}|| jkrêt	dd | j
j| j|¡ƒ‚t|||||ƒ}||k�r| jjd| j
jtt |¡ ¡ ƒtt |¡ ¡ ƒd� t	dd | j
j¡ƒ‚t| j||||ƒ}	| j|t|ƒ||	dœ}
| jjd| j
jtddd�ttt|d  ƒƒd! dd�t|ƒtt |¡ ¡ ƒt|jƒt|j ƒd"� |
S )#zI
        Called by a XBR Market Maker to close a paying channel.
        r]   z.market_maker_adr must be bytes[20], but was {}r   z)channel_oid must be bytes[16], but was {}z#channel_seq must be int, but was {}r1   z-channel_balance must be bytes[32], but was {}z)channel_is_final must be bool, but was {}r}   z3marketmaker_signature must be bytes[65], but was {}Nú/details must be autobahn.wamp.types.CallDetailsz!xbr.error.unexpected_delegate_adrzS{}.sell() - unexpected market maker (delegate) address: expected 0x{}, but got 0x{}r˜   ú xbr.error.unexpected_channel_oidúJ{}.sell() - unexpected paying channel address: expected 0x{}, but got 0x{}ú xbr.error.unexpected_channel_seqúR{}.sell() - unexpected channel (after tx) sequence number: expected {}, but got {}r   ú$xbr.error.unexpected_channel_balanceúJ{}.sell() - unexpected channel (after tx) balance: expected {}, but got {}út{klass}.sell()::XBRSIG[4/8] - EIP712 signature invalid: signer_address={signer_address}, delegate_adr={delegate_adr}©ÚklassÚsigner_addressZdelegate_adrúxbr.error.invalid_signatureúO{}.sell()::XBRSIG[4/8] - EIP712 signature invalid or not signed by market maker)r‚   rX   rY   Úis_finalr�   z·{klass}.close_channel() - {tx_type} closing channel {channel_oid}, closing balance {channel_balance}, closing sequence {channel_seq} [caller={caller}, caller_authid="{caller_authid}"]zXBR CLOSE  rA   rB   r€   r�   )r¿   rE   Úchannel_balanceÚchannel_seqr˜   ÚcallerÚcaller_authid)!r   r   r   r^   r   Úboolrž   r   rc   r   Ú	__class__rP   r‡   rˆ   r‰   rn   rq   ÚleaverV   r   rW   r   rK   r‹   r   r   re   rj   r	   rL   r_   rÆ   rÇ   )r   rs   r˜   rÅ   rÄ   Zchannel_is_finalZmarketmaker_signaturer™   rÀ   Úseller_signatureÚreceiptr%   r%   r&   r¥      sd   ****
&ÿ
*ÿ
ÿ
ÿ
ýû
ù	zSimpleSeller.close_channelc
                 C   sì  t |ƒtkrt|ƒdksJ dƒ‚t |ƒtkrt|ƒdks J dƒ‚t |ƒtkr,t|ƒdks0J dƒ‚t |ƒtkr<t|ƒdks@J dƒ‚t |ƒtksJJ dƒ‚t |ƒtkrVt|ƒdks_J d	 t |ƒ¡ƒ‚t |ƒtkrkt|ƒdkstJ d
 t |ƒ¡ƒ‚t |ƒtkr€t|ƒdks„J dƒ‚|	du s‘t|	tƒs‘J dƒ‚t|ƒ}t|ƒ}|| jkrµt	dd | j
jt | j¡ ¡ t |¡ ¡ ¡ƒ‚|| jvrÅt	dd | j
j|¡ƒ‚| j| }
|| jd krï| j ¡  t	dd | j
jt | jd ¡ ¡ t |¡ ¡ ¡ƒ‚|| jd k�rt	dd | j
j| jd |¡ƒ‚|| j| k�rt	dd | j
j| j| |¡ƒ‚d}| jd }t | jd dd… ¡}| jd }t|||||||d|ƒ	}||k�rj| jjd | j
jtt |¡ ¡ ƒtt |¡ ¡ ƒd!� t	d"d# | j
j¡ƒ‚|  jd7  _|  j|8  _|
 ||¡}t |ƒtk�rŒt|ƒd$k�s–J d% | j
j|¡ƒ‚t| j|||||| j| jdƒ	}|| j||| j|| j|d&œ}| jjd'| j
jtd(d)d*�tt j!|d+�ƒtt"t|d, ƒƒd- d)d*�tt"t| jd, ƒƒd- d)d*�t|	j#ƒt|	j$ƒtt |¡ ¡ ƒd.�	 |S )/al  
        Called by a XBR Market Maker to buy a data encyption key. The XBR Market Maker here is
        acting for (triggered by) the XBR buyer delegate.

        :param market_maker_adr: The market maker Ethereum address. The technical buyer is usually the
            XBR market maker (== the XBR delegate of the XBR market operator).
        :type market_maker_adr: bytes of length 20

        :param buyer_pubkey: The buyer delegate Ed25519 public key.
        :type buyer_pubkey: bytes of length 32

        :param key_id: The UUID of the data encryption key to buy.
        :type key_id: bytes of length 16

        :param channel_oid: The on-chain channel contract address.
        :type channel_oid: bytes of length 16

        :param channel_seq: Paying channel sequence off-chain transaction number.
        :type channel_seq: int

        :param amount: The amount paid by the XBR Buyer via the XBR Market Maker.
        :type amount: bytes

        :param balance: Balance remaining in the payment channel (from the market maker to the
            seller) after successfully buying the key.
        :type balance: bytes

        :param signature: Signature over the supplied buying information, using the Ethereum
            private key of the market maker (which is the delegate of the marker operator).
        :type signature: bytes of length 65

        :param details: Caller details. The call will come from the XBR Market Maker.
        :type details: :class:`autobahn.wamp.types.CallDetails`

        :return: The data encryption key, itself encrypted to the public key of the original buyer.
        :rtype: bytes
        r]   zdelegate_adr must be bytes[20]r1   zbuyer_pubkey must be bytes[32]r   zkey_id must be bytes[16]zchannel_oid must be bytes[16]zchannel_seq must be intz)amount_paid must be bytes[32], but was {}z*post_balance must be bytes[32], but was {}r}   zsignature must be bytes[65]Nr¶   z$xbr.error.unexpected_marketmaker_adrzH{}.sell() - unexpected market maker address: expected 0x{}, but got 0x{}zcrossbar.error.no_such_objectz{}.sell() - no key with ID "{}"r˜   r·   r¸   r   r¹   rº   r»   r¼   Úverifying_chain_idÚverifying_contract_adrr   Ú
market_oidFr½   r¾   rÁ   rÂ   éP   zC{}.sell() - unexpected sealed key computed (expected bytes[80]): {})r)   r‚   r6   Ú
sealed_keyrÅ   ÚamountrY   r�   z«{klass}.sell() - {tx_type} key "{key_id}" sold for {amount_earned} - balance is {balance} [caller={caller}, caller_authid="{caller_authid}", buyer_pubkey="{buyer_pubkey}"]z
XBR SELL  rA   rB   rD   r€   r�   )r¿   rE   r)   Zamount_earnedrY   rÆ   rÇ   r6   )%r   r   r   r   r^   rž   r   r   rc   r   rÉ   rP   r‡   rˆ   r‰   rp   rn   rq   rÊ   rV   rW   rd   Úa2b_hexr   rK   r‹   r   r9   r   re   rj   r§   rM   rN   r_   rÆ   rÇ   )r   rs   r6   r)   r˜   rÅ   rÒ   rY   r�   r™   r�   Zcurrent_block_numberrÍ   rÎ   rÏ   rÀ   rÑ   rË   rÌ   r%   r%   r&   r£   B  s’    &   ** 
&ÿ


*ÿÿÿ

ÿ
ý0

þç
÷zSimpleSeller.sellr;   rO   )rP   rQ   rR   rK   r   ra   r    r¦   r¬   rŸ   r'   rT   ri   r•   r>   r@   rY   rµ   r¥   r£   r%   r%   r%   r&   rZ   ¿   s&    
B

	ZA!
ÿBrZ   )!r�   r‡   rF   rM   Zautobahn.wamp.typesr   r   Zautobahn.wamp.exceptionr   r   Zautobahn.wamp.protocolr   Z_utilr   r	   r`   r
   r*   rf   Znacl.secretr3   Z
nacl.utilsZnacl.publicÚutilr   r   Z_eip712_channel_closer   r   Úobjectr   rU   rZ   r%   r%   r%   r&   Ú<module>   s*    
