U
    YùâcM=  ã                   @   s¸   d dl Z d dlmZ d dlmZmZmZmZ d dlZd dl	m
Z
 d dl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mZmZ G dd„ deƒZG dd„ deƒZdS )é    N)Úb2a_hex)ÚOptionalÚDictÚAnyÚList)ÚContract)ÚENS)ÚDeferredÚinlineCallbacks)ÚdeferToThread)ÚICryptosignKeyÚIEthereumKey)Úidentify_realm_name_category)Úmake_w3ÚEIP712AuthorityCertificatec                   @   sF  e Zd ZdZdZddee ee ee ee ee ee ee dœdd„Ze	ee
ee
ee
e
e
e
e
edœd	d
„ƒZed eeeee
 ee edœdd„ƒZeddœdd„ƒZeee dœdd„ƒZeee dœdd„ƒZeee dœdd„ƒZeee dœdd„ƒZeee dœdd„ƒZeee dœdd„ƒZeee dœdd„ƒZdS )!ÚSeederz

    ©Ú_frealmÚ	_operatorÚ_labelÚ_countryÚ_legalÚ	_endpointÚ_bandwidth_requestedÚ_bandwidth_offeredNÚFederatedRealm)ÚfrealmÚoperatorÚlabelÚcountryÚlegalÚendpointÚbandwidth_requestedÚbandwidth_offeredc	           	      C   s4   || _ || _|| _|| _|| _|| _|| _|| _dS )zÝ

        :param frealm:
        :param operator:
        :param label:
        :param country:
        :param legal:
        :param endpoint:
        :param bandwidth_requested:
        :param bandwidth_offered:
        Nr   )	Úselfr   r   r   r   r    r!   r"   r#   © r%   úX/var/www/html/CISBACKEND/school/venv/lib/python3.8/site-packages/autobahn/xbr/_frealm.pyÚ__init__:   s    zSeeder.__init__©Úchain_idÚverifying_contractÚchannel_bindingÚ
channel_idÚblock_noÚ	challengeÚpubkeyÚrealmÚdelegateÚseederÚ	bandwidthc                 C   s  |pd}|pd}| st ‚|s t ‚|d k	s,t ‚|d k	s8t ‚|s@t ‚|sHt ‚|sPt ‚|sXt ‚|s`t ‚|
sht ‚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œdd
dœdd
dœdd
dœdddœgdœddddœ| |||||||||	|
dœdœ}|S )NÚ ó    ÚnameÚstring)r6   ÚtypeÚversionÚchainIdZuint256ÚverifyingContractÚaddressr+   r,   Zbytes32r-   r.   r/   r0   r1   r2   r3   Zuint32)ZEIP712DomainÚEIP712SeederConnectr=   ZXBRÚ1)r6   r9   )r:   r;   r+   r,   r-   r.   r/   r0   r1   r2   r3   )ÚtypesZprimaryTypeÚdomainÚmessage)ÚAssertionError)r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   Údatar%   r%   r&   Ú_create_eip712_connectX   s�    þþûþþþþþþþþþþþ×õ:þõÀOzSeeder._create_eip712_connect)Ú
client_keyÚdelegate_keyr"   r,   r+   Úreturnc                 c   sŒ   d}d}d}t  d¡}	tj||||||	|jdd�d|jdd�d|d	�}
| |
¡V }|jdd�|	||d
|||jdd�| j|t|ƒ 	¡ dœ}|S )z²

        :param client_key:
        :param delegate_key:
        :param bandwidth_requested:
        :param channel_id:
        :param channel_binding:
        :return:
        é   s   é    T)Úbinarys   Fs   r(   Z(7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f)r/   r.   r+   r,   r0   r)   r-   r1   r2   r3   Ú	signature)
ÚosÚurandomr   rD   Z
public_keyr<   Zsign_typed_datar   r   Údecode)r$   rE   rF   r"   r,   r+   r)   r*   r-   r.   Zeip712_datarK   Z	authextrar%   r%   r&   Úcreate_authextraÂ   s<    


ò


ß#zSeeder.create_authextra©rG   c                 C   s   | j S ©ú

        :return:
        )r   ©r$   r%   r%   r&   r     s    zSeeder.frealmc                 C   s   | j S )z›
        Operator address, e.g. ``"0xe59C7418403CF1D973485B36660728a5f4A8fF9c"``.

        :return: The Ethereum address of the endpoint operator.
        )r   rS   r%   r%   r&   r     s    zSeeder.operatorc                 C   s   | j S )zƒ
        Operator endpoint label.

        :return: A human readable label for the operator or specific operator endpoint.
        )r   rS   r%   r%   r&   r     s    zSeeder.labelc                 C   s   | j S )zz
        Operator country (ISO 3166-1 alpha-2), e.g. ``"US"``.

        :return: ISO 3166-1 alpha-2 country code.
        )r   rS   r%   r%   r&   r   &  s    zSeeder.countryc                 C   s   | j S rQ   )r   rS   r%   r%   r&   r    /  s    zSeeder.legalc                 C   s   | j S )a  
        Public WAMP endpoint of seeder. Secure WebSocket URL resolving to a public IPv4
        or IPv6 listening url accepting incoming WAMP-WebSocket connections,
        e.g. ``wss://service1.example.com/ws``.

        :return: The endpoint URL.
        )r   rS   r%   r%   r&   r!   7  s    	zSeeder.endpointc                 C   s   | j S rQ   )r   rS   r%   r%   r&   r"   B  s    zSeeder.bandwidth_requestedc                 C   s   | j S rQ   )r   rS   r%   r%   r&   r#   J  s    zSeeder.bandwidth_offered)NNNNNNN)NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r   ÚstrÚintr'   ÚstaticmethodÚbytesrD   r
   r   r   r	   rO   Úpropertyr   r   r   r   r    r!   r"   r#   r%   r%   r%   r&   r   +   sv          øøöi  û ûI
r   c                   @   sä   e Zd ZU dZdZej d¡ZdZ	e
ed< de
eee
ef  dœdd	„Zee
d
œdd„ƒZee
d
œdd„ƒZeeee
ef  d
œdd„ƒZeee
 d
œdd„ƒZedd„ ƒZed
œdd„Zeee d
œdd„ƒZdd„ Zdd„ ZdS )r   aä  
    A federated realm is a WAMP application realm with a trust anchor rooted in Ethereum, and
    which can be shared between multiple parties.

    A federated realm is globally identified on an Ethereum chain (e.g. on Mainnet or Rinkeby)
    by an Ethereum address associated to a federated realm owner by an on-chain record stored
    in the WAMP Network contract. The federated realm address thus only needs to exist as an
    identifier of the federated realm-owner record.
    )Ú_name_or_addressÚ_gateway_configÚ_statusÚ_name_categoryÚ_w3Ú_ensÚ_addressÚ	_contractÚ_seedersÚ_root_caÚ_catalogZ_metaZ*0xF7acf1C4CB4a9550B8969576573C2688B48988C2r4   ÚCONTRACT_ABIN)Úname_or_addressÚgateway_configc                 C   s`   || _ || _d| _t| j ƒ| _| jdkr8td | j ¡ƒ‚d| _d| _d| _	d| _
g | _d| _dS )aÍ  
        Instantiate a federated realm from a federated realm ENS name (which is resolved to an Ethereum
        address) or Ethereum address.

        :param name_or_address: Ethereum ENS name or address.
        :param gateway_config: If provided, use this Ethereum gateway. If not provided,
            connect via Infura to Ethereum Mainnet, which requires an environment variable
            ``WEB3_INFURA_PROJECT_ID`` with your Infura project ID.
        ÚSTOPPED)ÚethÚensÚreverse_ensz8name_or_address "{}" not an Ethereum address or ENS nameN)r^   r_   r`   r   ra   Ú
ValueErrorÚformatrb   rc   rd   re   rf   rg   )r$   rj   rk   r%   r%   r&   r'   p  s    

zFederatedRealm.__init__rP   c                 C   s   | j S ©N)r`   rS   r%   r%   r&   Ústatus“  s    zFederatedRealm.statusc                 C   s   | j S rr   )r^   rS   r%   r%   r&   rj   —  s    zFederatedRealm.name_or_addressc                 C   s   | j S rr   )r_   rS   r%   r%   r&   rk   ›  s    zFederatedRealm.gateway_configc                 C   s   | j S rr   )ra   rS   r%   r%   r&   Úname_categoryŸ  s    zFederatedRealm.name_categoryc                 C   s   | j S rr   )rd   rS   r%   r%   r&   r<   £  s    zFederatedRealm.addressc                 C   s   | j dkst‚| jS )NÚRUNNING)r`   rB   rg   rS   r%   r%   r&   Úroot_ca§  s    zFederatedRealm.root_cac                 C   s   | j S rr   )rf   rS   r%   r%   r&   Úseeders«  s    zFederatedRealm.seedersc                 C   s(   | j dkrtd | j ¡ƒ‚t| jƒ}|S )rR   rl   zcannot start in status "{}")r`   ÚRuntimeErrorrq   r   Ú_initialize_background)r$   Údr%   r%   r&   Ú
initialize¯  s    

zFederatedRealm.initializec                 C   s¤   d| _ | jrt| jƒ| _ntdƒ‚t | j¡| _| jdkrr| jdkr\d 	t
| j d¡ƒ¡}n| j}| j |¡| _n(| jdkrŽ| j | j¡| _ndsštd	ƒ‚d
| _ d S )NZSTARTINGzJcannot auto-configure ethereum connection (was removed from web3.py in v6))rn   ro   ro   r4   Ú.rm   Fzshould not arrive hereru   )r`   r_   r   rb   rx   r   Z	from_web3rc   ra   ÚjoinÚreversedr^   Úsplitr<   rd   ÚtoChecksumAddressrB   )r$   r6   r%   r%   r&   ry   ¹  s    


z%FederatedRealm._initialize_background)N)rT   rU   rV   rW   rX   Úweb3ZWeb3r€   ZCONTRACT_ADDRESSri   rY   Ú__annotations__r   r   r   r'   r]   rs   rj   rk   rt   r<   r   rv   r   r   rw   r{   ry   r%   r%   r%   r&   r   S  s(   
	#

r   )rL   Úbinasciir   Útypingr   r   r   r   r�   Zweb3.contractr   rn   r   Ztwisted.internet.deferr	   r
   Ztwisted.internet.threadsr   Zautobahn.wamp.interfacesr   r   Zautobahn.wamp.messager   Zautobahn.xbrr   r   Úobjectr   r   r%   r%   r%   r&   Ú<module>   s     *