U
    •uÄcƒ  ã                   @   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t‚t |ƒtkr0|dks4t‚|dksTt |ƒtkrP|dksTt‚|dkstt |ƒtkrp|dkstt‚|dkr„|dk	s˜|dk	r”|dks˜t‚|dks¬t|ƒs¬t‚|| _|| _|| _|| _	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ÚAssertionErrorÚintÚcallableÚ_api_idZ_priceZ	_intervalÚ_countÚ_count_currentÚ
_on_rotateÚ_idÚ_keyÚ_boxÚ_archive)ÚselfÚapi_idÚpriceÚintervalÚcountÚ	on_rotate© r&   úW/var/www/html/VPFITNESS/school/venv/lib/python3.8/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
        )r   ©r    r&   r&   r'   Úkey_id\   s    	zKeySeries.key_idc                 Ã   sZ   t  |¡}| jdk	rB|  jd7  _| j| jkrB|  ¡ 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t‚t |ƒtkr4t|ƒdks8t‚| 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   é    )Úencoder)r   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   s
   t ƒ ‚d S ©N©ÚNotImplementedErrorr)   r&   r&   r'   Ústart—   s    zKeySeries.startc                 C   s
   t ƒ ‚d S r;   r<   r)   r&   r&   r'   Ústopš   s    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r’|  | ¡I d H  d S )Nr   z4{tx_type} key "{key_id}" rotated [api_id="{api_id}"]z
XBR ROTATEÚmagenta©Zcolor©r   )Útx_typer*   r!   )ÚosÚurandomr   r4   ÚutilsÚrandomZ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.   r:   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t‚t |ƒtkr0|dks4t‚t |ƒtkrH|dksLt‚|| _|| _|| _d S )Nr   r   )r   r   r   r   r   Z_adrÚ_seqÚ_balance)r    ZadrÚseqÚbalancer&   r&   r'   r(   ¶   s    zPayingChannel.__init__N)rL   rM   rN   r(   r&   r&   r&   r'   rQ   µ   s   rQ   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&td |¡ƒ‚t |ƒtkr>t|ƒdksLtd |¡ƒ‚|dksnt |ƒtksntd |¡ƒ‚t ¡ | _t	j
| _|| _d| _|| _tj |¡| _d| _| jj ¡ | _d| _|pÈt| 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 "{}"r2   z/seller delegate must be bytes[32], but got "{}"Nz0provider_id must be None or string, but got "{}"r   )!r   r   r   r   ÚformatÚstrÚtxaioZmake_loggerrH   rV   Ú
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Ú_channelrS   rR   Ú_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
        )rd   re   r)   r&   r&   r'   re     s    zSimpleSeller.public_keyc           	         s(  t ˆ ƒtkr"tˆ ƒdkr"ˆ ˆjks&t‚t ˆƒtkr:ˆdks>t‚|dks^t |ƒtkrZ|dks^t‚|dks~t |ƒtkrz|dks~t‚|dkrŽ|dk	s¢|dk	rž|dks¢t‚ˆdksât ˆƒtkrÚdd„ ˆ ¡ D ƒrÚdd„ ˆ ¡ D ƒsât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   s   | ]}t |ƒtkV  qd S r;   ©r   r[   )Ú.0Úkr&   r&   r'   Ú	<genexpr>+  s     z#SimpleSeller.add.<locals>.<genexpr>c                 s   s   | ]}t |ƒtkV  qd S r;   rq   )rr   Úvr&   r&   r'   rt   +  s     zZinvalid categories type (must be dict) or category key or value type (must both be string)c           	      “   s¼  | j }| ˆj|< d}|�r¸zætƒ d }ˆj}t d¡}ˆj}ˆjjd|ˆ ˆ|||d ˆd k	rbt	ˆƒ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 k	r¾tˆd ƒndƒd dd	�tt |¡ ¡ ƒtˆƒd� ˆj
jd|d� W �q¸W nŒ tk
�rR } z2|jdk�r.ˆj
 d¡ nˆj
 ¡  W Y ¢�q¸W 5 d }~X Y n< tk
�rx   ˆj
 d¡ Y �q¸Y n   ˆj
 ¡  Y nX |d8 }ˆj
jd|d� t d¡I d H  qd S )Né   l    d(	 éA   zxbr.marketmaker.place_offer)Zprivkeyr"   Ú
categoriesZexpiresZcopiesrp   zh{tx_type} key "{key_id}" offered for {price} [api_id={api_id}, prefix="{prefix}", delegate="{delegate}"]z
XBR OFFER r@   rA   rB   ì     ÈNÎZor   ú XBR)rC   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*   rl   r
   rf   rD   rE   rh   rm   Úcallr	   rH   rI   r   rJ   rK   r[   r   ÚbinasciiÚb2a_hexÚdecoder   ÚerrorÚwarnÚfailurer   ÚasyncioÚsleep)	Ú
key_seriesr*   r~   Z
valid_fromr{   Ú	signaturerp   r}   Úe©r!   rx   r|   r"   r    r&   r'   r%   -  s^    


ô
&ù	


z#SimpleSeller.add.<locals>.on_rotate)r#   r$   r%   z#Created new key series {key_series})rˆ   )r   r   r   rk   r   r   Údictrc   Úvaluesr   rH   rI   )	r    r!   r|   r"   r#   r$   rx   r%   rˆ   r&   r‹   r'   Úadd  s    &  $@=
zSimpleSeller.addc                 Ã   sd  t |tƒstd |¡ƒ‚| jtjtjfks2tdƒ‚tj| _|| _	g | _
| jjdt| jƒt | jjdd… ¡ ¡ d� | d| j¡I dH | _| js˜tdƒ‚| jd	 }t|ƒtkrºt|ƒd
ks¾t‚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  �qn| 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ƒt0| j-ƒt0| 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é
   )Úaddressre   z)xbr.marketmaker.get_active_paying_channelzno active paying channel foundÚchannel_oidr   rB   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 channelrT   zvOk, seller delegate started [active paying channel {channel_oid} with remaining balance {remaining} at sequence {seq}])r‘   r–   rT   )1Ú
isinstancer   r   rZ   r^   rV   r]   ÚSTATE_STOPPEDÚSTATE_STARTINGrm   rn   rH   rI   r   rg   r€   r�   rd   re   r‚   r   rf   rj   Ú	Exceptionr   r   r   rJ   rK   Z_channel_oidrh   ÚregisterÚsellr   Úappendr”   Úclose_channelrk   r�   r>   r`   r   rQ   ri   ÚSTATE_STARTEDrS   rR   Úinfor   )r    Úsessionr‘   r”   Úregrˆ   Úpaying_balancer&   r&   r'   r>   p  sV    þ


  ÿzSimpleSeller.startc                 Ã   sÔ   | j tjfkstdƒ‚tj| _ g }| j ¡ D ]}| ¡ }| |¡ q,| j	r~| j
rx| j
 ¡ rx| j	D ]}| ¡ }| |¡ q`d| _	t |¡}z*z|I dH  W n   | j ¡  Y nX W 5 tj| _ d| _
X | j d¡ dS )zF
        Stop rotating/offering keys to the XBR market maker.
        úseller not runningNzOk, seller delegate stopped.)r^   rV   rŸ   r   ÚSTATE_STOPPINGrk   r�   r?   r�   rn   rm   Úis_attachedÚ
unregisterr\   Úgatherr˜   rH   r…   r    )r    Zdlrˆ   Údr¢   r&   r&   r'   r?   ±  s(    

zSimpleSeller.stopc                 Ã   sL   | j tjfk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)r^   rV   rŸ   ÚRuntimeErrorrm   r¦   r   rj   )r    r£   r&   r&   r'   rU   Ò  s    zSimpleSeller.balancec                 Ã   sl   t |ƒtkr"t|ƒdkr"|| jks&t‚t |ƒtks6t‚|dk	sBt‚| 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   rk   r   r[   r.   )r    r!   Zurir/   Z	keyseriesr*   Z
serializerr1   r&   r&   r'   Úwrapæ  s    &
zSimpleSeller.wrapc              
   C   sÈ  t |ƒtkrt|ƒdks*td t |ƒ¡ƒ‚t |ƒtkrBt|ƒdksTtd t |ƒ¡ƒ‚t |ƒtksrtd t |ƒ¡ƒ‚t |ƒtkrŠt|ƒdksœtd t |ƒ¡ƒ‚t |ƒtksºtd t |ƒ¡ƒ‚t |ƒtkrÒt|ƒd	ksätd
 t |ƒ¡ƒ‚|dksþt|tƒsþtdƒ‚|| j	k�r8t
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.
        rY   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 {}r2   z-channel_balance must be bytes[32], but was {}z)channel_is_final must be bool, but was {}rw   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{   rT   rU   Z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  r@   rA   ry   rz   )rµ   rC   Úchannel_balanceÚchannel_seqr‘   ÚcallerÚcaller_authid)"r   r   r   r   rZ   r   Úboolr—   r   r_   r   Ú	__class__rL   r€   r�   r‚   rj   rm   ÚleaverR   r   rS   r   rH   r„   r   r   ra   rf   r	   rI   r[   r»   r¼   )r    ro   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 tdƒ‚t |ƒtkr8t|ƒdks@tdƒ‚t |ƒtkrXt|ƒdks`tdƒ‚t |ƒtkrxt|ƒdks€tdƒ‚t |ƒtks”tdƒ‚t |ƒtkr¬t|ƒdks¾td	 t |ƒ¡ƒ‚t |ƒtkrÖt|ƒdksètd
 t |ƒ¡ƒ‚t |ƒtk�rt|ƒdk�stdƒ‚|	dk�s*t|	tƒ�s*tdƒ‚t|ƒ}t|ƒ}|| j	k�rtt
dd | jjt | j	¡ ¡ t |¡ ¡ ¡ƒ‚|| jk�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�rHt
dd | jj| j| |¡ƒ‚d}| jd }t | jd dd… ¡}| jd }t|||||||d|ƒ	}||k�râ| 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:t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
        rY   zdelegate_adr must be bytes[20]r2   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 {}rw   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{   r7   Ú
sealed_keyrº   ÚamountrU   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  r@   rA   rB   ry   rz   )rµ   rC   r*   Zamount_earnedrU   r»   r¼   r7   )&r   r   r   r   r   rZ   r—   r   r   r_   r   r¾   rL   r€   r�   r‚   rl   rj   rm   r¿   rR   rS   r`   Úa2b_hexr   rH   r„   r   r:   r   ra   rf   r    rJ   rK   r[   r»   r¼   )r    ro   r7   r*   r‘   rº   rÇ   rU   r‰   r’   rˆ   Zcurrent_block_numberrÂ   rÃ   rÄ   r¶   rÆ   rÀ   rÁ   r&   r&   r'   rœ   B  s¤    &    **$&ÿ

*ÿÿÿ

     ÿ
ý0
    þç
÷zSimpleSeller.sell)N)NNN)N)N)rL   rM   rN   rH   r   r]   r™   rŸ   r¥   r˜   r(   rP   re   rŽ   r>   r?   rU   r«   rž   rœ   r&   r&   r&   r'   rV   ¿   s$   
B
	
ZA! ÿ
BrV   )!r†   r€   rD   rJ   Zautobahn.wamp.typesr   r   Zautobahn.wamp.exceptionr   r   Zautobahn.wamp.protocolr   Z_utilr   r	   r\   r
   r+   rb   Znacl.secretr4   Z
nacl.utilsZnacl.publicÚutilr   r   Z_eip712_channel_closer   r   Úobjectr   rQ   rV   r&   r&   r&   r'   Ú<module>   s(    
