o
    èó·iÇœ  ã                   @   sÒ  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 d dlmZ d dl	Z	e	 
dd¡ d dlmZ d dlmZ d dlmZ e ¡  d dlZe ¡  d d	lmZ d d
lmZ d dlm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"m#Z#m$Z$ d dl%m&Z& d dl'm(Z( d dl)m*Z* d dl+m,Z, d dl+m-Z-m.Z.m/Z/ d dl0m1Z1 d dl2m3Z3m4Z4 e 5dd¡Z6e7e6e j8 9e6¡ƒ G dd„ dej:ƒZ;G dd„ de1ƒZ<G dd„ de=ƒZ>dd„ Z?dd „ Z@eAd!krçe@ƒ  dS dS )"é    N)Úpprint)Útime_nsÚGtkz3.0)r   )ÚColor)Úgtk3reactor)Úreact)ÚinlineCallbacks)Úreactor)ÚnaturaldeltaÚnaturaltime)Úparse_activation_codeÚhltypeÚhlidÚhlval)ÚCBORSerializer)Úsleep)ÚApplicationRunner)Úunpack_uint256)Úaccount_from_seedphraseÚgenerate_seedphraseÚaccount_from_ethkey)ÚClient)Ú
UserConfigÚProfileZautobahnzasset/xbr_gray.svgc                   @   sl   e Zd ZdZe ¡ ZdZdZdZ	dZ
dd„ Zedd	„ ƒZd
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚApplicationWindowa  
    Main application window which provides UI for the following functions:

    * N) New account
    * R) Recover account:
       - R1) Backup cloud device in account enabled => download encrypted account data
           from cloud backup device, requires email (and 2FA) verification and password
       - R2) At least one device left in account and at hand => synchronize with existing device,
           direct device-to-device encrypted account data transfer
       - R3) Only cold storage recovery seed phrase left => account from seed-phrase full
           recovery, including new email and 2FA verification.

    See also:
    * https://python-gtk-3-tutorial.readthedocs.io/en/latest/
    * https://twistedmatrix.com/documents/current/core/howto/choosing-reactor.html
    r   é   é   é   c                 C   s¾   t j | ¡ || _|| _|| _|| _|| _|| _d | _	d | _
d | _d | _d | _d | _d | _tjdd�| _|  d¡ |  dd¡ |  d¡ |  d¡ |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  d S )Ns                   ©ÚbyteszXBR NetworkiX  é2   F)r   Ú	AssistantÚ__init__r	   ÚsessionÚconfigÚconfig_pathÚprofileÚprofile_nameÚinput_seedphraseÚinput_emailÚinput_passwordÚoutput_accountÚoutput_ethadrÚoutput_ethadr_rawÚoutput_member_dataÚuuidÚUUIDZoutput_member_data_oidÚ	set_titleZset_default_sizeZset_border_widthZset_resizableÚ_setup_page1Ú_setup_page2Ú_setup_page3Ú_setup_page4Ú_setup_page5)Úselfr	   r#   r$   r%   r&   r'   © r8   úWC:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\autobahn/xbr/_gui.pyr"   `   s0   


zApplicationWindow.__init__c                 c   sø  � | j �r;t| j jƒ| _tj | jj¡| _t	 
| jdd … ¡| _| j ¡ V }|r“tt t |d d d¡d¡ƒ}| j |¡ | j t|d d ƒ¡ | j t|d d ƒ¡ | j t|d d d	 ƒ¡ | j t|d d d
 ƒ¡ | j dt	 |d d d ¡ ¡  ¡ | j t|d d d ƒ¡ t|ƒ | j | j¡V }|sÇ| jjd| jd� | j jrµ|   d¡ d S | j jrÀ|   d¡ d S |   d¡ d S | jjd| j|d� || _!t"t t#ƒ d¡| j!d  d ƒ}t$t | j!d d¡ƒ}| j% t| j!d ƒ¡ | j& t| j!d ƒ¡ | j' d (||¡¡ | j) t| j!d ƒ¡ | j* t| j!d d ƒ¡ | j+ t| j!d d ƒ¡ |   d¡ d S t,ƒ }| j-|_.d |_d |_/d |_0d |_1d|_2d	|_3d |_4d |_d |_5d |_6d |_7d |_8d |_9d |_:d |_;d |_<|| _ |   d ¡ d S )!Nr   ÚstatusÚnowÚnsÚsÚchainr$   Z	contractsÚ
xbrnetworkZxbrtokenÚ0xÚblockÚhashÚnumberú*ethadr {output_ethadr} is NOT yet a member©r,   r   r   ú=ok, ethadr {output_ethadr} already is a member: {member_data}©r,   Úmember_dataÚcreatedg    eÍÍAÚoidÚaddressz{} ({} ago)ÚlevelÚbalanceÚethÚxbré   úws://localhost:8090/wsr   )=r&   r   Úethkeyr+   Úweb3ÚWeb3ÚtoChecksumAddressrK   r,   ÚbinasciiÚa2b_hexr-   r#   Ú
get_statusÚstrÚnpÚ
datetime64Ú_label5_nowÚ	set_labelÚ_label5_chainÚ_label5_statusÚ_label5_xbrnetworkÚ_label5_xbrtokenÚ_label5_blockhashÚb2a_hexÚdecodeÚ_label5_blocknumberr   Ú
get_memberÚlogÚinfoÚvaction_oidÚset_current_pager.   r
   r   r   Ú_label2Ú_label4Ú_label6ÚformatÚ_label8Ú_label10Ú_label12r   r%   ÚpathÚcskeyÚusernameÚemailÚnetwork_urlÚnetwork_realmÚ
member_oidÚvaction_requestedÚvaction_verifiedZdata_urlZ
data_realmZ
infura_urlZinfura_networkZ
infura_keyZinfura_secret)r7   rh   r;   rH   Zcreated_agorI   r&   r8   r8   r9   Ústart�   sv   € &ÿÿ zApplicationWindow.startc                 C   s   |   | j| ¡ ¡ d S ©N)Zset_page_completeZcompleteÚ
get_active)r7   Zcheckbuttonr8   r8   r9   Úon_complete_toggledÉ   s   z%ApplicationWindow.on_complete_toggledc                    s¾  t  ¡ }| d¡ | d¡ | d¡ | d¡ | d¡ | d¡ t  ¡ }| 	t
¡ | |dddd¡ t jdd�}| dd¡ | |dddd¡ t jdd�}| dd¡ | t jj¡ | |dddd¡ t j d	¡}‡ fd
d„}| d|¡ | |dddd¡ t jdd�}| dd¡ | |dddd¡ t jdd�}| dd¡ | t jj¡ | d¡ | d¡ | |dddd¡ t j d¡}	‡ fdd„}
|	 d|
¡ | |	dddd¡ t jdd�}| dd¡ | t jj¡ | d¡ | d¡ | |dddd¡ t j d¡}‡ fdd„}| d|¡ | |dddd¡ t jdd�}| dd¡ | t jj¡ | d¡ | d¡ | |dddd¡ t j d¡}‡ fdd„}| d|¡ | |dddd¡ ˆ  |¡ d S )!z®
        Setup page shown when no config/profile could be found. Allows to select from:

        * new account
        * synchronize device
        * recover account
        é   r   r   r   z+

I am new and do not have an account yet:
©Úlabelç      à?zMCreate a new account or start from fresh. You only need an email address. [N]zNew accountc                    ó   ˆ j jd| d� ˆ  d¡ d S )NzSELECTED_NEW: {res}©Úresr   ©rg   rh   rj   r„   ©r7   r8   r9   Ú
on_button1í   ó   z2ApplicationWindow._setup_page1.<locals>.on_button1Úclickedz;

I already have an existing account and want to use that:
r   zŽRestore account from cloud backup to this device. You will need access to
your account password and access to your account email address. [R1]Té   rP   zRestore accountc                    rƒ   )NzSELECTED_RESTORE: {res}r„   r   r†   r„   r‡   r8   r9   Úon_button22  r‰   z3ApplicationWindow._setup_page1.<locals>.on_button22z�Synchronize device with other device in account. You will need access to
another device currently connected to your account. [R2]é   zSynchronize accountc                    rƒ   )NzSELECTED_SYNCRONIZE: {res}r„   r   r†   r„   r‡   r8   r9   Ú
on_button2  r‰   z2ApplicationWindow._setup_page1.<locals>.on_button2ztRecover account from account seed phrase. You only need access to
your 12-24 word account recovery seed phrase. [R3]é   zRecover accountc                    rƒ   )NzSELECTED_RECOVER: {res}r„   r   r†   r„   r‡   r8   r9   Ú
on_button3$  r‰   z2ApplicationWindow._setup_page1.<locals>.on_button3N)r   ÚGridÚset_row_spacingÚset_column_spacingÚset_margin_topÚset_margin_bottomÚset_margin_startÚset_margin_endÚImageÚset_from_fileÚLOGO_RESOURCEÚattachÚLabelÚset_alignmentÚset_justifyÚJustificationÚLEFTÚButtonÚnew_with_labelÚconnectZset_line_wrapZset_width_charsÚappend_page)r7   Úgrid1Úimage1Zlabel0Úlabel1Úbutton1rˆ   Zlabel12Zlabel22Zbutton22rŒ   Úlabel2Úbutton2rŽ   Úlabel3Úbutton3r�   r8   r‡   r9   r2   Í   sn   












zApplicationWindow._setup_page1c           
         sš  t  ¡ }t  ¡ }t  ¡ }| t¡ | |¡ | |¡ t j d¡}‡‡‡fdd„}| 	d|¡ | |¡ t j
dd�}| dd¡ | t jj¡ | |¡ t  ¡ }| ¡ ‰ˆ d	¡ | d
¡ | t jj¡ | d¡ | t jj¡ | |¡ t  ¡ }t jdd�‰ˆ d
¡ ˆ d
¡ ‡ fdd„}	ˆ 	d|	¡ | ˆ¡ t j d¡‰ ˆ  d
¡ t‡fdd„ƒ‰‡‡‡fdd„‰ˆ  	dˆ¡ | ˆ ¡ | |¡ ˆ |¡ dS )zA
        Setup page shown to generate a new seed phrase.
        zGenerate seedphrasec                    s(   t ddd�ˆ_ˆ ˆj¡ ˆ  d¡ d S )Né   Úenglish)ZstrengthÚlanguageT)r   r(   Úset_textÚset_sensitive©Ú_)Úcheckbutton2_1r7   Útextbuffer2_1r8   r9   Úon_button2_1<  s   z4ApplicationWindow._setup_page2.<locals>.on_button2_1rŠ   zQBackup your new seed phrase in a secure offline location (e.g. on printed paper):r€   r   r‚   z




FTzI have backed up my seed phrasec                    s   ˆ   d¡ d S ©NT)r±   r²   )Ú	button2_2r8   r9   Úon_checkbutton2_1X  s   z9ApplicationWindow._setup_page2.<locals>.on_checkbutton2_1ÚtoggledÚContinuec                 3   sj  � t ˆ jdd�ˆ _tj ˆ jj¡ˆ _t 	ˆ jdd … ¡ˆ _
tˆ jjƒˆ j_tˆ jjƒˆ j_ˆ j ˆ j¡ ˆ jˆ jjˆ j< ˆ j ˆ j¡ ˆ jjdˆ jˆ jd� ˆ j ˆ j
¡V }t|ƒ |slˆ jjdˆ jd� ˆ  d¡ d S ˆ jjdˆ j|d	� tj|d
 d�ˆ j_ˆ jˆ j_ |d ˆ j_!|d ˆ j_"ˆ jˆ jjˆ j< ˆ j ˆ j¡ |ˆ _#ˆ j$ %t&ˆ j'd ƒ¡ ˆ  d¡ d S )Nr   )Úindexr   zVXBR ETH key at address {ethadr} set from seed phrase (BIP39 account 0): "{seedphrase}")ZethadrZ
seedphraserD   rE   rF   rG   rx   r   ru   rt   rJ   rP   )(r   r(   r+   rS   rT   rU   rK   r,   rV   rW   r-   r   Úkeyr&   rR   r#   Z
_cskey_rawrs   Úset_ethkey_from_profiler$   Úprofilesr'   Úsaver*   rg   rh   rf   r   rj   r/   r0   rx   Ú
member_adrru   rt   r.   rk   r]   rY   Z_member_data)r³   rH   r‡   r8   r9   Úon_button2_2a  s@   €þÿÿ
z4ApplicationWindow._setup_page2.<locals>.on_button2_2c                    ó(   ˆj jdtˆƒ| d� t dˆ | ¡ d S ©Nz{func}({widget}))ÚfuncÚwidgetr   ©rg   rh   r   r	   Z	callLater©rÆ   )rÂ   Úrun_on_button2_2r7   r8   r9   rÉ   �  ó   z8ApplicationWindow._setup_page2.<locals>.run_on_button2_2N)r   ÚVBoxÚHBoxr˜   r™   rš   Úaddr¡   r¢   r£   rœ   r�   rž   rŸ   r    ZTextViewÚ
get_bufferr°   Zset_editableZset_justificationZCENTERZset_monospaceZset_wrap_modeZWrapModeÚWORDÚCheckButtonÚ
set_activer±   r   r¤   )
r7   Zbox2_1Zbox2_2Zimage2_1Z	button2_1r¶   Zlabel2_1Ztextview2_1Zbox2_3r¹   r8   )r¸   r´   rÂ   rÉ   r7   rµ   r9   r3   .  sL   












+

zApplicationWindow._setup_page2c                    sF  t  ¡ }t  ¡ }t  ¡ }| t¡ | |¡ | |¡ t  ¡ }| d¡ | 	d¡ | 
d¡ | d¡ | d¡ | d¡ t jdd�}| |dddd¡ t  ¡ ‰ˆ d¡ ˆ d¡ ˆ d¡ | ˆdddd¡ d	d	d	d
œ‰‡‡fdd„‰dd„ ‰dd„ ‰‡‡‡‡fdd„}ˆ d|¡ t jdd�}| |dddd¡ t  ¡ ‰ˆ d¡ ˆ d¡ ˆ d¡ ˆ d¡ | ˆdddd¡ t jdd�}| |dddd¡ t  ¡ ‰ˆ d¡ ˆ d¡ ˆ d¡ ˆ d¡ | ˆdddd¡ ‡‡‡‡‡fdd„}ˆ d|¡ ˆ d|¡ t jdd�}	| |	dddd¡ t jdd�}
|
 d¡ |
 d¡ ‡‡fdd„}|
 d |¡ | |
dddd¡ t jd!d�}	| |	dd"dd¡ t jd#d�‰ ˆ  d¡ ˆ  d¡ ‡fd$d%„}ˆ  d |¡ | ˆ dd"dd¡ t j d&¡‰ˆ d¡ t‡ ‡‡fd'd(„ƒ‰	‡	‡
‡fd)d*„‰
ˆ d+ˆ
¡ | ˆdd"dd¡ | |¡ ˆ |¡ d	S ),z

        :return:
        r   zYour email address:r€   r   r   Ú éÿ   é(   N)ru   ÚpasswordÚeulac                     sF   t dƒ ˆD ]} ˆ|  d u rt d| ƒ ˆ  d¡  d S qˆ  d¡ d S )NÚ	check_allzcheck failedFT)Úprintr±   )Úc)r¬   Úchecksr8   r9   r×   ½  s   

ýz1ApplicationWindow._setup_page3.<locals>.check_allc                 S   s   d| v r| S d S )Nú@r8   )ru   r8   r8   r9   Úcheck_emailÆ  s   z3ApplicationWindow._setup_page3.<locals>.check_emailc                 S   ó   dS r·   r8   )rÕ   r8   r8   r9   Úcheck_passwordÌ  ó   z6ApplicationWindow._setup_page3.<locals>.check_passwordc                    sL   ˆ|   ¡ ƒˆd< ˆd rˆ tjjd ¡ nˆ tjjtdddƒ¡ ˆ ƒ  d S )Nru   éPÃ  r   ©Úget_textÚ	modify_fgr   Ú
StateFlagsÚNORMALr   )Úentry)r×   rÜ   rÚ   Úentry1r8   r9   Ú	on_entry1Ï  s
   
z1ApplicationWindow._setup_page3.<locals>.on_entry1ÚchangedzNew password:FzRepeat new password:r   c                    sÀ   d}ˆˆ  ¡ ƒrd}ˆ tjjd ¡ nˆ tjjtdddƒ¡ d}ˆˆ  ¡ ƒr2d}ˆ tjjd ¡ nˆ tjjtdddƒ¡ |rW|rWˆ  ¡ ˆ  ¡ krWˆˆ  ¡ ƒrWˆ  ¡ ˆd< nd ˆd< ˆ ƒ  d S )NFTrà   r   rÕ   rá   )r³   Zpw1_okZpw2_ok)r×   rÞ   rÚ   Úentry2Úentry3r8   r9   Ú
on_entry23î  s   $
z2ApplicationWindow._setup_page3.<locals>.on_entry23zEULA:r   z"I accept the EULA and terms of useTc                    s$   |   ¡ r	dˆd< ndˆd< ˆ ƒ  d S )NTrÖ   F)r}   ©Úbutton)r×   rÚ   r8   r9   rˆ     s   

z2ApplicationWindow._setup_page3.<locals>.on_button1rº   zCloud backup:rP   z5Yes, enable encrypted cloud backup of my private keysc                    s
   ˆ ƒ  d S r|   r8   rí   )r×   r8   r9   rŽ     s   
z2ApplicationWindow._setup_page3.<locals>.on_button2zRegister accountc                 3   s  � ˆd ˆ_ ˆd ˆ_ˆ  ¡ ˆ_dˆ_d ˆjt dd¡¡ˆ_ˆj 	ˆj
¡ ˆjjdˆj d� ˆjjd	ˆjd
� ˆjjdˆjd� ˆj ˆjˆj ¡V }t|ƒ ˆj ˆj
_ˆjˆj
_ttj|d d�ƒˆj
_tt |d d¡ƒˆj
_ˆj
ˆjjˆj< ˆj ˆj¡ ˆ d¡ d S )Nru   rÕ   Z	anonymousz{}{}r   i'  zinput_email: {input_email})r)   z input_username: {input_username})Úinput_usernamez input_password: {input_password})r*   ri   r   Ú	timestampr<   r   )r)   r*   r}   Zinput_backup_enabledrï   rn   ÚrandomÚrandintr#   r¾   r&   rg   rh   Z_do_onboard_memberr   ru   rt   rY   r/   r0   ri   rZ   r[   ry   r$   r¿   r'   rÀ   rj   )r³   Úresult)rª   rÚ   r7   r8   r9   r�   (  s&   €




z2ApplicationWindow._setup_page3.<locals>.on_button3c                    rÃ   rÄ   rÇ   rÈ   )r�   Úrun_on_button3r7   r8   r9   rô   B  rÊ   z6ApplicationWindow._setup_page3.<locals>.run_on_button3rŠ   )r   rË   rÌ   r˜   r™   rš   rÍ   r‘   r’   r“   r”   r•   r–   r—   rœ   r›   ÚEntryr°   Úset_max_lengthÚset_max_width_charsr£   Zset_visibilityrÐ   rÑ   r±   r¡   r¢   r   r¤   )r7   Úbox1Úbox2r¦   r¥   r§   rè   r©   rì   r«   r¨   rˆ   rŽ   r8   )rª   r¬   r×   rÜ   rÞ   rÚ   rç   rê   rë   r�   rô   r7   r9   r4   ™  s’   











ý		













zApplicationWindow._setup_page3c           	         s0  t  ¡ }t  ¡ }t  ¡ }| t¡ | |¡ | |¡ t  ¡ }t jdd�}t jdd�}| |¡ | |¡ | |¡ t jdd�}| |¡ t  ¡ ‰ˆ 	d¡ ˆ 
d¡ ˆ d¡ | ˆ¡ ‡ ‡fdd	„}ˆ d
|¡ t j d¡‰ ˆ  d¡ t‡‡fdd„ƒ‰‡‡‡fdd„‰ˆ  dˆ¡ | ˆ ¡ ˆ |¡ dS )a*  
        Page shown when member registration request was submitted, a verification email
        sent, and the verification request ID returned.
        The user now should check the email inbox for the received verification code,
        and continue verifying the code.

        :return:
        z4Member registration submitted, verification request:r€   z$8d5d7ffd-23d9-45a0-a686-00a49f29d3cdzMPlease check your email inbox, and enter the verification code received here:rÒ   rÓ   rÔ   c                    sT   t |  ¡ ƒ}|rˆ tjjd ¡ ˆ  d¡ d S ˆ tjjtdddƒ¡ ˆ  d¡ d S )NTrà   r   F)r   râ   rã   r   rä   rå   r±   r   )ræ   Úvaction_code)r¨   rç   r8   r9   rè   o  s   z1ApplicationWindow._setup_page4.<locals>.on_entry1ré   ZVerifyFc                 3   sÐ   � t ˆ  ¡ ƒ}|rd | ¡ ¡}tˆjjƒtkr t 	ˆjj¡}nˆjj}ˆj
 ||¡V }t|ƒ tt |d d¡ƒˆj_dtt |d ¡ ¡ ƒ ˆj_ttj	|d d�ƒˆj_ˆjˆjjˆj< ˆj ˆj¡ d S )Nú-rI   r<   r@   Ztransactionrx   r   )r   râ   ÚjoinÚgroupsÚtyper&   ri   rY   r/   r0   r#   Z_do_onboard_member_verifyr   rZ   r[   rz   rV   rc   rd   Zvaction_transactionrx   r$   r¿   r'   rÀ   r*   )r³   rú   ri   ró   )rç   r7   r8   r9   rˆ   ~  s   €z2ApplicationWindow._setup_page4.<locals>.on_button1c                    rÃ   rÄ   rÇ   rÈ   )rˆ   Úrun_on_button1r7   r8   r9   rÿ   �  rÊ   z6ApplicationWindow._setup_page4.<locals>.run_on_button1rŠ   N)r   rË   rÌ   r˜   r™   rš   rÍ   rœ   rõ   r°   rö   r÷   r£   r¡   r¢   r±   r   r¤   )	r7   rø   rù   r¦   Zbox3r§   r©   r«   rè   r8   )r¨   rç   rˆ   rÿ   r7   r9   r5   N  s:   	













zApplicationWindow._setup_page4c                 C   sæ  t  ¡ }t  ¡ }t  ¡ }| t¡ | |¡ | |¡ t  ¡ }| d¡ | 	d¡ | 
d¡ | d¡ | d¡ | d¡ d}t jdd�}| dd¡ | |d|dd¡ t  ¡ | _| j dd¡ | j d¡ | | jd|dd¡ |d7 }t jdd�}| dd¡ | |d|dd¡ t  ¡ | _| j dd¡ | j d	¡ | | jd|dd¡ |d7 }t jd
d�}| dd¡ | |d|dd¡ t  ¡ | _| j dd¡ | j d¡ | | jd|dd¡ |d7 }t jdd�}	|	 dd¡ | |	d|dd¡ t  ¡ | _| j dd¡ | j d	¡ | | jd|dd¡ |d7 }t jdd�}
|
 dd¡ | |
d|dd¡ t  ¡ | _| j dd¡ | j d	¡ | | jd|dd¡ |d7 }t jdd�}| dd¡ | |d|dd¡ t  ¡ | _| j dd¡ | j d	¡ | | jd|dd¡ |d7 }t jdd�}| dd¡ | |d|dd¡ t  ¡ | _| j dd¡ | j d	¡ | | jd|dd¡ |d7 }| |¡ t  ¡ }| d¡ | 	d¡ | 
d¡ | d¡ | d¡ | d¡ t jdd�}| dd¡ | |dddd¡ t  ¡ | _| j dd¡ | j d	¡ | | jdddd¡ t jdd�}| dd¡ | |dddd¡ t  ¡ | _| j dd¡ | j d	¡ | | jdddd¡ t jdd�}| dd¡ | |dddd¡ t  ¡ | _| j dd¡ | | jdddd¡ t jdd�}| dd¡ | |dddd¡ t  ¡ | _| j dd¡ | | jdddd¡ t jdd�}| dd¡ | |dddd¡ t  ¡ | _| j dd¡ | | jdddd¡ t jdd�}| dd¡ | |dddd¡ t  ¡ | _| j dd¡ | | jdddd¡ | |¡ |  |¡ dS )zc
        Page shown for a user (private eth key) that already is member.

        :return:
        r   r   zCurrent server time:r€   r   r‚   FzBlockchain ID:TzService status:zXBRNetwork contract:zXBRToken contract:zCurrent block hash:zCurrent block number:zUser ID:zEth Address:zAccount Created:r   zMembership:r   zETH Balance:rP   zXBR Balance:r�   N) r   rË   rÌ   r˜   r™   rš   rÍ   r‘   r’   r“   r”   r•   r–   r—   rœ   r�   r›   r\   Zset_selectabler^   r_   r`   ra   rb   re   rk   rl   rm   ro   rp   rq   r¤   )r7   rø   rù   r¦   Zgrid2Zgrid2_yZlabel5_now_titleZlabel5_chain_titleZlabel5_status_titleZlabel5_xbrnetwork_titleZlabel5_xbrtoken_titleZlabel5_blockhash_titleZlabel5_blocknumber_titler¥   r§   r«   Zlabel5Zlabel7Zlabel9Zlabel11r8   r8   r9   r6   š  sì   





























zApplicationWindow._setup_page5N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚtxaioÚmake_loggerrg   ZSELECTED_NONEZSELECTED_NEWZSELECTED_SYNCRONIZEZSELECTED_RECOVERr"   r   r{   r~   r2   r3   r4   r5   r6   r8   r8   r8   r9   r   H   s"    !
Gak 6Lr   c                   @   s,   e Zd Zdd„ Zedd„ ƒZedd„ ƒZdS )ÚApplicationClientc                 Ã   s^   �| j jdt|jƒt|jƒt|jƒt|jƒ|d� d| jjv r-t	 
| jjd | |f¡ d S d S )NzbOk, client joined on realm "{realm}" [session={session}, authid="{authid}", authrole="{authrole}"])Úrealmr#   ÚauthidÚauthroleÚdetailsÚready)rg   rh   r   r  r#   r  r	  r$   Úextrar  Úresolve)r7   r
  r8   r8   r9   ÚonJoinA  s   €ûÿzApplicationClient.onJoinc                 c   s<   � |   ¡ r|  d¡V }|  d¡V }||dœS | j d¡ d S )Nzxbr.network.get_configzxbr.network.get_status)r$   r:   z(not connected: could not retrieve status)Úis_attachedÚcallrg   Úwarn)r7   r$   r:   r8   r8   r9   rX   K  s   €
zApplicationClient.get_statusc                 c   s&  � |   ¡ r‰|  d|¡V }|r|  d|¡V }tj |d ¡|d< tj|d d�|d< tj t|d d ƒd¡|d d< tj t|d d	 ƒd¡|d d	< t	 
|d
 d¡|d
< |d }ddddddœ |d ¡|d< | jjdt|d ƒt|d ƒt|d ƒd� |S | jjd|d� d S | jjd|d� d S )Nzxbr.network.is_memberz xbr.network.get_member_by_walletrK   rJ   r   rM   rN   ZetherrO   rI   r<   rL   ZACTIVEZVERIFIEDZRETIREDZPENALTYZBLOCKED)r   r   r   rP   r�   zZMember {member_oid} found for address 0x{member_adr} - current member level {member_level})Úmember_levelrx   rÁ   z:Address {output_ethadr} is not a member in the XBR networkrE   zInot connected: could not retrieve member data for address {output_ethadr})r  r  rS   rT   rU   r/   r0   ZfromWeir   rZ   r[   Úgetrg   rh   r   r   r  )r7   Z
ethadr_rawZ	is_memberrH   r  r8   r8   r9   rf   T  sH   €ÿÿöõ


ü
ÿ
ÿzApplicationClient.get_memberN)r   r  r  r  r   rX   rf   r8   r8   r8   r9   r  @  s    

r  c                   @   s:   e Zd ZdZe ¡ Zej 	ej 
d¡¡ZdZddd„ZdS )ÚApplicationz&
    Main XBR member application.
    z~/.xbrnetworkz
config.iniNc                 ƒ   sš  �t jdd� ˆjjd|d� tj ˆj¡s%t ˆj¡ ˆjjdˆjd� tj 	ˆjˆj
¡ ˆ_}|p4dˆ_tj ˆj¡sPˆjjdˆjd	� tˆjƒˆ_d
ˆ_nEtˆjƒˆ_dd„ }ˆjj|d� ˆjˆjjvrwt d ˆj|tˆjjƒ¡¡‚ˆjjˆj ˆ_ˆjjdˆjˆjd� tˆj ¡ ƒ tdƒ t  ¡ t  ¡ dˆjˆjˆjˆjdœ‰ |pµˆjr´ˆjjr´ˆjjnd}|pÄˆjrÃˆjjrÃˆjjnd}t||ˆ tƒ gd�}	ˆjjd||d� |	jt |ddd�I d
H  ˆj d¡ ˆ d I d
H \}
}ˆjjd|d� ‡ ‡fdd „}t!||
ˆjˆjˆjˆjƒ}| "d!|¡ | "d"|¡ | #¡  | $¡ I d
H  d#}ˆ d$ �rE|d%7 }ˆjjd&|d'� t%d(ƒI d
H  ˆ d$ �s-ˆj d)¡ d
S )*a�  
        Start main application. This will read the user configuration, potentially asking
        for a user password.

        :param reactor: Twisted reactor to use.
        :param url: Optionally override network URL as defined in profile.
        :param realm: Optionally override network URL as defined in profile.
        :param profile: User profile name to load.
        :return:
        rh   )rL   z5ok, application starting for user profile "{profile}")r&   zdotdir created: "{dotdir}")ZdotdirÚdefaultz%no config exist under "{config_path}")r%   Nc                   S   rÝ   )NZ	123secretr8   r8   r8   r8   r9   Úgetpw¦  rß   z Application.start.<locals>.getpw)Zcb_get_passwordz4no such profile "{}" in config "{}" with {} profilesz<user profile "{profile_name}" loaded from "{config_path}":

)r%   r'   z

T)r  ÚdoneÚrunningr$   r%   r&   r'   rQ   r?   )Úurlr  r  ZserializerszIok, now connecting to "{network_url}", joining realm "{network_realm}" ..)rv   rw   F)r	   Zauto_reconnectZstart_reactorz!ok, application client connected!r  z)ok, application session joined: {details})r
  c                    s(   ˆj  d¡ dˆ d< t ˆ d d ¡ d S )Nzexiting application ..Fr  r  )rg   rh   r  r  r²   ©r  r7   r8   r9   Úon_exitÓ  s   z"Application.start.<locals>.on_exitÚcancelÚdestroyr   r  r   z7ok, application main task still running at tick {ticks})Úticksr�   z ok, application main task ended!)&r  Zstart_loggingrg   rh   Úosrr   ÚisdirÚDOTDIRÚmkdirrü   ÚDOTFILEZ_config_pathZ_profile_nameÚisfiler   Ú_configZ_profileÚloadr¿   ÚclickZClickExceptionrn   Úlenr   ÚmarshalrØ   Úcreate_futurerv   rw   r   r   Úrunr  r   r£   Zshow_allr{   r   )r7   r	   r  r  r&   r%   r  rv   rw   Úrunnerr#   r
  r  Úwinr  r8   r  r9   r{   ‰  s~   €
ÿù
ýþý

ýzApplication.start)NNN)r   r  r  r  r  r  rg   r  rr   ÚabspathÚ
expanduserr!  r#  r{   r8   r8   r8   r9   r  €  s    r  c                 Ã   s$   �t ƒ }|j| |||d�I dH  dS )aG  
    Load the named user profile (or create a new one), overriding URL/realm,
    connect to a network node, and start the network member on-boarding.

    If the user credentials are already for a member, fetch member information
    and display member page.

    :param reactor: Twisted reactor to use.
    :param url: Override network URL from user profile with this value.
    :param realm: Override network realm from user profile with this value.
    :param profile: Name of user profile within user
        configuration to load (eg from ``$HOME/.xbrnetwork/config.ini``)
    )r  r  r&   N)r  r{   )r	   r  r  r&   Zappr8   r8   r9   Úmainè  s   €r0  c                  C   sf   t  ¡ } | jddtddd� | jddtddd� | jd	d
tddd� |  ¡ }tt|j|j|j	fƒ dS )a�  
    GUI entry point, parsing command line arguments and then starting the
    actual main GUI program with parsed parameters.

    To use, run:

    .. code:: console

        xbrnetwork-ui --profile default --url ws://localhost:8090/ws --realm xbrnetwork

    This will load the user profile ``"default"`` from the user configuration, but
    overriding any network URL and realm found therin.
    z--urlr  Nz;The router URL to connect to, e.g. "ws://localhost:8090/ws")Údestrþ   r  Úhelpz--realmr  z$The realm to join, e.g. "xbrnetwork"z	--profiler&   r  z'The user profile to use, e.g. "default")
ÚargparseÚArgumentParserÚadd_argumentrY   Ú
parse_argsr   r0  r  r  r&   )ÚparserÚargsr8   r8   r9   Ú_mainú  s*   üüür9  Ú__main__)Br  r3  r/   rV   rñ   Úpkg_resourcesr   Útimer   ZgiZrequire_versionZgi.repositoryr   Zgi.repository.Gdkr   Ztwisted.internetr   Úinstallr  Zuse_twistedZtwisted.internet.taskr   Ztwisted.internet.deferr   r	   rS   ZnumpyrZ   r'  Zhumanizer
   r   Zautobahn.utilr   r   r   r   Zautobahn.wamp.serializerr   Zautobahn.twisted.utilr   Zautobahn.twisted.wampr   Zautobahn.xbrr   r   r   r   Zautobahn.xbr._clir   Zautobahn.xbr._configr   r   Úresource_filenamerš   rØ   rr   r$  r!   r   r  Úobjectr  r0  r9  r   r8   r8   r8   r9   Ú<module>   s\        }@h'
ÿ