o
    ¼>hÇœ  ã                   @   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Ú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ÚUUIDÚoutput_member_data_oidÚ	set_titleÚset_default_sizeÚset_border_widthÚset_resizableÚ_setup_page1Ú_setup_page2Ú_setup_page3Ú_setup_page4Ú_setup_page5)Úselfr	   r$   r%   r&   r'   r(   © r=   úq/var/www/vedio/testing/chatpythonscript.ninositsolution.com/env/lib/python3.10/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%   Ú	contractsÚ
xbrnetworkÚ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ÚtoChecksumAddressrR   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_verifiedÚdata_urlÚ
data_realmÚ
infura_urlÚinfura_networkÚ
infura_keyÚinfura_secret)r<   ro   r@   rO   Úcreated_agorP   r'   r=   r=   r>   Ústart   sv   € &ÿÿ zApplicationWindow.startc                 C   s   |   | j| ¡ ¡ d S ©N)Úset_page_completeÚcompleteÚ
get_active)r<   Úcheckbuttonr=   r=   r>   Ú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   ©rn   ro   rq   r•   ©r<   r=   r>   Ú
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é   rW   zRestore accountc                    r”   )NzSELECTED_RESTORE: {res}r•   r   r—   r•   r˜   r=   r>   Úon_button22  rš   z3ApplicationWindow._setup_page1.<locals>.on_button22zSynchronize 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˜   r=   r>   Ú
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˜   r=   r>   Ú
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ÚconnectÚset_line_wrapÚset_width_charsÚappend_page)r<   Úgrid1Úimage1Úlabel0Úlabel1Úbutton1r™   Úlabel12Úlabel22Úbutton22r   Úlabel2Úbutton2rŸ   Úlabel3Úbutton3r¡   r=   r˜   r>   r7   Í   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)ÚstrengthÚlanguageT)r   r)   Úset_textÚset_sensitive©Ú_)Úcheckbutton2_1r<   Útextbuffer2_1r=   r>   Ú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_2r=   r>   Ú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}")ÚethadrÚ
seedphraserK   rL   rM   rN   r   r   r|   r{   rQ   rW   )(r   r)   r,   rZ   r[   r\   rR   r-   r]   r^   r.   r    Úkeyr'   rY   r$   Ú
_cskey_rawrz   Úset_ethkey_from_profiler%   Úprofilesr(   Úsaver+   rn   ro   rm   r   rq   r0   r1   r   Ú
member_adrr|   r{   r/   rr   rd   r`   Ú_member_data)rË   rO   r˜   r=   r>   Ú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   ©rn   ro   r   r	   Ú	callLater©râ   )rÞ   Úrun_on_button2_2r<   r=   r>   ræ     ó   z8ApplicationWindow._setup_page2.<locals>.run_on_button2_2N)r   ÚVBoxÚHBoxr©   rª   r«   Úaddr²   r³   r´   r­   r®   r¯   r°   r±   ÚTextViewÚ
get_bufferrÈ   Úset_editableÚset_justificationÚCENTERÚset_monospaceÚset_wrap_modeÚWrapModeÚWORDÚCheckButtonÚ
set_activerÉ   r   r·   )
r<   Úbox2_1Úbox2_2Úimage2_1Ú	button2_1rÎ   Úlabel2_1Útextview2_1Úbox2_3rÑ   r=   )rÐ   rÌ   rÞ   ræ   r<   rÍ   r>   r8   .  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)r|   Ú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Ã   Úchecksr=   r>   r  ½  s   

ýz1ApplicationWindow._setup_page3.<locals>.check_allc                 S   s   d| v r| S d S )Nú@r=   )r|   r=   r=   r>   Úcheck_emailÆ  s   z3ApplicationWindow._setup_page3.<locals>.check_emailc                 S   ó   dS rÏ   r=   )r   r=   r=   r>   Ú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 )Nr|   éPÃ  r   ©Úget_textÚ	modify_fgr   Ú
StateFlagsÚNORMALr   )Úentry)r  r  r  Úentry1r=   r>   Ú	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Ë   Úpw1_okÚpw2_ok)r  r	  r  Úentry2Úentry3r=   r>   Ú
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  r=   r>   r™     s   

z2ApplicationWindow._setup_page3.<locals>.on_button1rÒ   zCloud backup:rW   z5Yes, enable encrypted cloud backup of my private keysc                    s
   ˆ ƒ  d S rŠ   r=   r  )r  r=   r>   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 )Nr|   r   Ú	anonymousz{}{}r   i'  zinput_email: {input_email})r*   z input_username: {input_username})Úinput_usernamez input_password: {input_password})r+   rp   r   Ú	timestamprA   r   )r*   r+   r   Úinput_backup_enabledr  ru   ÚrandomÚrandintr$   rÙ   r'   rn   ro   Ú_do_onboard_memberr   r|   r{   r`   r0   r1   rp   ra   rb   r€   r%   rÚ   r(   rÛ   rq   )rË   Úresult)rÁ   r  r<   r=   r>   r¡   (  s&   €




z2ApplicationWindow._setup_page3.<locals>.on_button3c                    rß   rà   rã   rå   )r¡   Úrun_on_button3r<   r=   r>   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´   Úset_visibilityrô   rõ   rÉ   r²   r³   r   r·   )r<   Úbox1Úbox2r¹   r¸   r»   r  rÀ   r  rÂ   r¼   r™   rŸ   r=   )rÁ   rÃ   r  r  r	  r  r  r  r  r¡   r$  r<   r>   r9   ™  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  r=   r>   r  o  s   z1ApplicationWindow._setup_page4.<locals>.on_entry1r  Ú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ú-rP   rA   rG   Útransactionr   r   )r   r  ÚjoinÚgroupsÚtyper'   rp   r`   r0   r1   r$   Ú_do_onboard_member_verifyr   ra   rb   r   r]   rj   rk   Úvaction_transactionr   r%   rÚ   r(   rÛ   r+   )rË   r+  rp   r#  )r  r<   r=   r>   r™   ~  s   €z2ApplicationWindow._setup_page4.<locals>.on_button1c                    rß   rà   rã   rå   )r™   Úrun_on_button1r<   r=   r>   r4    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·   )	r<   r)  r*  r¹   Úbox3r»   rÀ   rÂ   r  r=   )r¼   r  r™   r4  r<   r>   r:   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:rW   zXBR Balance:rž   N) r   rè   ré   r©   rª   r«   rê   r¢   r£   r¤   r¥   r¦   r§   r¨   r­   r®   r¬   rc   Úset_selectablere   rf   rg   rh   ri   rl   rr   rs   rt   rv   rw   rx   r·   )r<   r)  r*  r¹   Úgrid2Úgrid2_yÚlabel5_now_titleÚlabel5_chain_titleÚlabel5_status_titleÚlabel5_xbrnetwork_titleÚlabel5_xbrtoken_titleÚlabel5_blockhash_titleÚlabel5_blocknumber_titler¸   r»   rÂ   Úlabel5Úlabel7Úlabel9Úlabel11r=   r=   r>   r;   š  sì   





























zApplicationWindow._setup_page5N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚtxaioÚmake_loggerrn   ÚSELECTED_NONEÚSELECTED_NEWÚSELECTED_SYNCRONIZEÚSELECTED_RECOVERr#   r   r‰   r   r7   r8   r9   r:   r;   r=   r=   r=   r>   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)rn   ro   r   rO  r$   rP  rQ  r%   ÚextrarH  Úresolve)r<   rR  r=   r=   r>   Ú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Úcallrn   Úwarn)r<   r%   r?   r=   r=   r>   r_   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_walletrR   rQ   r   rT   rU   ÚetherrV   rP   rA   rS   ÚACTIVEÚVERIFIEDÚRETIREDÚPENALTYÚBLOCKED)r   r   r   rW   rž   zZMember {member_oid} found for address 0x{member_adr} - current member level {member_level})Úmember_levelr   rÜ   z:Address {output_ethadr} is not a member in the XBR networkrL   zInot connected: could not retrieve member data for address {output_ethadr})rW  rX  rZ   r[   r\   r0   r1   ÚfromWeir   ra   rb   Úgetrn   ro   r   r   rY  )r<   Ú
ethadr_rawÚ	is_memberrO   r`  r=   r=   r>   rm   T  sH   €ÿÿöõ


ü
ÿ
ÿzApplicationClient.get_memberN)rD  rE  rF  rV  r   r_   rm   r=   r=   r=   r>   rN  @  s    

rN  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:
        ro   )rS   z5ok, application starting for user profile "{profile}")r'   zdotdir created: "{dotdir}")ÚdotdirÚdefaultz%no config exist under "{config_path}")r&   Nc                   S   r  )NÚ	123secretr=   r=   r=   r=   r>   Úgetpw¦  r
  z Application.start.<locals>.getpw)Úcb_get_passwordz4no such profile "{}" in config "{}" with {} profilesz<user profile "{profile_name}" loaded from "{config_path}":

)r&   r(   z

T)rS  ÚdoneÚrunningr%   r&   r'   r(   rX   rE   )ÚurlrO  rT  ÚserializerszIok, now connecting to "{network_url}", joining realm "{network_realm}" ..)r}   r~   F)r	   Úauto_reconnectÚstart_reactorz!ok, application client connected!rS  z)ok, application session joined: {details})rR  c                    s(   ˆj  d¡ dˆ d< t ˆ d d ¡ d S )Nzexiting application ..Frl  rk  )rn   ro   rH  rU  rÊ   ©rT  r<   r=   r>   Úon_exitÓ  s   z"Application.start.<locals>.on_exitÚcancelÚdestroyr   rl  r   z7ok, application main task still running at tick {ticks})Úticksrž   z ok, application main task ended!)&rH  Ústart_loggingrn   ro   Úosry   ÚisdirÚDOTDIRÚmkdirr/  ÚDOTFILEÚ_config_pathÚ_profile_nameÚisfiler   Ú_configÚ_profileÚloadrÚ   ÚclickÚClickExceptionru   Úlenr   Úmarshalr  Úcreate_futurer}   r~   r   r   ÚrunrN  r   r´   Úshow_allr‰   r   )r<   r	   rm  rO  r'   r&   ri  r}   r~   Úrunnerr$   rR  rr  Úwinru  r=   rq  r>   r‰   ‰  s~   €
ÿù
ýþý

ýzApplication.start)NNN)rD  rE  rF  rG  rH  rI  rn   rw  ry   ÚabspathÚ
expanduserry  r{  r‰   r=   r=   r=   r>   re  €  s    re  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``)
    )rm  rO  r'   N)re  r‰   )r	   rm  rO  r'   Úappr=   r=   r>   Ú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--urlrm  Nz;The router URL to connect to, e.g. "ws://localhost:8090/ws")Údestr1  rg  Úhelpz--realmrO  z$The realm to join, e.g. "xbrnetwork"z	--profiler'   rg  z'The user profile to use, e.g. "default")
ÚargparseÚArgumentParserÚadd_argumentr`   Ú
parse_argsr   rŽ  rm  rO  r'   )ÚparserÚargsr=   r=   r>   Ú_mainú  s*   üüür—  Ú__main__)Brw  r‘  r0   r]   r   Úpkg_resourcesr   Útimer   ÚgiÚrequire_versionÚgi.repositoryr   Úgi.repository.Gdkr   Útwisted.internetr   ÚinstallrH  Úuse_twistedÚtwisted.internet.taskr   Útwisted.internet.deferr   r	   rZ   Únumpyra   r‚  Úhumanizer
   r   Úautobahn.utilr   r   r   r   Úautobahn.wamp.serializerr   Úautobahn.twisted.utilr   Úautobahn.twisted.wampr   Úautobahn.xbrr   r   r   r   Úautobahn.xbr._clir   Úautobahn.xbr._configr   r   Úresource_filenamer«   r  ry   r~  r"   r   rN  Úobjectre  rŽ  r—  rD  r=   r=   r=   r>   Ú<module>   s\        }@h'
ÿ