U
    •uÄcÇœ  ã                   @   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 )"é    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ÚProfileÚ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_oidZ	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   úP/var/www/html/pearl/school/venv/lib/python3.8/site-packages/autobahn/xbr/_gui.pyr#   `   s0    


zApplicationWindow.__init__c                 c   sö  | j �rtt| 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�rl|   d¡ n | j j�r‚|   d¡ n
|   d¡ nä| 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¡ n~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                    s   ˆ j jd| d� ˆ  d¡ d S )NzSELECTED_NEW: {res}©Úresr   ©rg   rh   rj   rƒ   ©r7   r8   r9   Ú
on_button1í   s    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                    s   ˆ j jd| d� ˆ  d¡ d S )NzSELECTED_RESTORE: {res}rƒ   r   r…   rƒ   r†   r8   r9   Úon_button22  s    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                    s   ˆ j jd| d� ˆ  d¡ d S )NzSELECTED_SYNCRONIZE: {res}rƒ   r   r…   rƒ   r†   r8   r9   Ú
on_button2  s    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                    s   ˆ j jd| d� ˆ  d¡ d S )NzSELECTED_RECOVER: {res}rƒ   r   r…   rƒ   r†   r8   r9   Ú
on_button3$  s    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   sf  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|ƒ |sÔˆ jjdˆ jd� ˆ  d¡ nŽˆ 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   r0   r1   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                    s(   ˆ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Æ   �  s    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WrapModeZ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 k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| kr| S d S d S )Nú@r8   )ru   r8   r8   r9   Úcheck_emailÆ  s    z3ApplicationWindow._setup_page3.<locals>.check_emailc                 S   s   dS rµ   r8   )rÐ   r8   r8   r9   Úcheck_passwordÌ  s    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}ˆˆ  ¡ ƒrdd}ˆ tjjd ¡ nˆ tjjtdddƒ¡ |r®|r®ˆ  ¡ ˆ  ¡ kr®ˆˆ  ¡ ƒr®ˆ  ¡ ˆ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}   ©Z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Ð   Ú	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   r0   r1   ri   rZ   r[   ry   r%   r½   r(   r¾   rj   )r±   Úresult)r¨   rÕ   r7   r8   r9   rŽ   (  s$    




z2ApplicationWindow._setup_page3.<locals>.on_button3c                    s(   ˆj jdtˆƒ| d� t dˆ | ¡ d S rÁ   rÄ   rÅ   )rŽ   Úrun_on_button3r7   r8   r9   rí   B  s    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                    sR   t |  ¡ ƒ}|r,ˆ tjjd ¡ ˆ  d¡ n"ˆ 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   r0   r1   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                    s(   ˆj jdtˆƒ| d� t dˆ | ¡ d S rÁ   rÄ   rÅ   )r‡   Úrun_on_button1r7   r8   r9   rø   �  s    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                 Ã   sX   | j jdt|jƒt|jƒt|jƒt|jƒ|d� d| jjkrTt	 
| jjd | |f¡ 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� n| 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   r0   r1   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¡sHt ˆj¡ ˆjjdˆjd� tj 	ˆjˆj
¡ ˆ_}|pfdˆ_tj ˆj¡sžˆjjdˆjd	� tˆjƒˆ_d
ˆ_nŒtˆjƒˆ_dd„ }ˆjj|d� ˆjˆjjkrît d ˆj|tˆjjƒ¡¡‚n<ˆjjˆj ˆ_ˆjjdˆjˆjd� tˆj ¡ ƒ tdƒ t  ¡ t  ¡ dˆjˆjˆjˆjdœ‰ |�ppˆj�rnˆjj�rnˆ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$ �r�|d%7 }ˆjjd&|d'� t%d(ƒI d
H  �q\ˆ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   s   dS )NZ	123secretr8   r8   r8   r8   r9   Úgetpw¦  s    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ÚcancelZ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   Z_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    r'  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   r'  r  r   r'   )ÚparserÚargsr8   r8   r9   Ú_mainú  s*    üüür0  Ú__main__)Br  r*  r0   rV   rê   Úpkg_resourcesr   Útimer   ZgiZrequire_versionZgi.repositoryr   Zgi.repository.Gdkr   Útwisted.internetr   Úinstallrý   Zuse_twistedZtwisted.internet.taskr   Ztwisted.internet.deferr   r	   rS   Ú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  r'  r0  rù   r8   r8   r8   r9   Ú<module>   sX        }@h'
