
    Lfǜ                        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	j                  dd       d dlmZ d dlmZ d dlmZ  ej"                          d dlZ ej&                          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jj                  dd      Z6 e7e6e jp                  js                  e6              G d dejt                        Z; G d de1      Z< G d de=      Z>d Z?d Z@eAdk(  r e@        yy)     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                   |    e Zd ZdZ ej
                         ZdZdZdZ	dZ
d Zed        Zd Zd	 Zd
 Zd Zd Zd Zy)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                 X   t         j                  j                  |        || _        || _        || _        || _        || _        || _        d | _	        d | _
        d | _        d | _        d | _        d | _        d | _        t!        j"                  d      | _        | j'                  d       | j)                  dd       | j+                  d       | j-                  d       | j/                          | j1                          | j3                          | j5                          | j7                          y )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+   s          L/var/www/cs2snipe.com/venv/lib/python3.12/site-packages/autobahn/xbr/_gui.pyr&   zApplicationWindow.__init__`   s   t$&( $""!!%"&&*iil&C# 	}%c3'b!5! 	    c              #   
  K   | j                   rt        | j                   j                        | _        t        j
                  j                  | j                  j                        | _        t        j                  | j                  dd        | _        | j                  j                         }|rwt        t        j                   t        j                   |d   d   d      d            }| j"                  j%                  |       | j&                  j%                  t        |d   d                | j(                  j%                  t        |d   d                | j*                  j%                  t        |d   d   d	                | j,                  j%                  t        |d   d   d
                | j.                  j%                  dt        j0                  |d   d   d         j3                         z          | j4                  j%                  t        |d   d   d                t7        |       | j                  j9                  | j                        }|s| j:                  j=                  d| j                         | j                   j>                  r| jA                  d       y | j                   j                  r| jA                  d       y | jA                  d       y | j:                  j=                  d| j                  |       || _!        tE        t        j                   tG               d      | jB                  d   z
  dz        }tI        t        j                   | jB                  d   d            }| jJ                  j%                  t        | jB                  d                | jL                  j%                  t        | jB                  d                | jN                  j%                  djQ                  ||             | jR                  j%                  t        | jB                  d                | jT                  j%                  t        | jB                  d   d                | jV                  j%                  t        | jB                  d   d                | jA                  d       y tY               }| jZ                  |_.        d |_        d |_/        d |_0        d |_1        d|_2        d	|_3        d |_4        d |_        d |_5        d |_6        d |_7        d |_8        d |_9        d |_:        d |_;        d |_<        || _         | jA                  d        y w)!Nr   statusnownsschainr(   	contracts
xbrnetworkxbrtoken0xblockhashnumber*ethadr {output_ethadr} is NOT yet a memberr0   r    r   =ok, ethadr {output_ethadr} already is a member: {member_data}r0   member_datacreatedg    eAoidaddressz{} ({} ago)levelbalanceethxbr   ws://localhost:8090/wsr   )=r*   r   ethkeyr/   web3Web3toChecksumAddressrV   r0   binasciia2b_hexr1   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_pager2   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?   rs   rD   rS   created_agorT   r*   s          r@   startzApplicationWindow.start   sL     <<"5dll6I6I"JD!%!<!<T=P=P=X=X!YD%-%5%5d6H6H6L%MD"0022D"--d8nU6KT(RTWXY  **3/"",,Sh1H-IJ##--c$x.2J.KL''11#d8n[6QR^6_2`a%%//DN;4OPZ4[0\]&&008H8HhX_I`agIh8i8p8p8r1rs((223tH~g7Nx7X3YZ4L $ 7 78N8N OOKJ,0,>,>  @<<++))!,||**--a0 --a0],0,>,>K  Y*5'*BMM')T,JTMdMdenMo,os~+~%bmmD4K4KI4VX[&\]&&s4+B+B5+I'JK&&s4+B+B9+M'NO&&}';';G['QR&&s4+B+B7+K'LM''D,C,CI,Nu,U(VW''D,C,CI,Nu,U(VW %%a(iG++GL!GN GM#G GM":G$0G!!%G"&G(,G%'+G$#G!%G!%G%)G"!%G$(G!"DL !!!$s   UUc                 X    | j                  | j                  |j                                y N)set_page_completecomplete
get_active)r?   checkbuttons     r@   on_complete_toggledz%ApplicationWindow.on_complete_toggled   s    t}}k.D.D.FGrA   c                     t        j                         }|j                  d       |j                  d       |j	                  d       |j                  d       |j                  d       |j                  d       t        j                         }|j                  t               |j                  |dddd       t        j                  d      }|j                  dd       |j                  |dddd       t        j                  d      }|j                  dd       |j                  t         j                  j                          |j                  |dddd       t         j"                  j%                  d	      } fd
}|j'                  d|       |j                  |dddd       t        j                  d      }|j                  dd       |j                  |dddd       t        j                  d      }|j                  dd       |j                  t         j                  j                          |j)                  d       |j+                  d       |j                  |dddd       t         j"                  j%                  d      }	 fd}
|	j'                  d|
       |j                  |	dddd       t        j                  d      }|j                  dd       |j                  t         j                  j                          |j)                  d       |j+                  d       |j                  |dddd       t         j"                  j%                  d      } fd}|j'                  d|       |j                  |dddd       t        j                  d      }|j                  dd       |j                  t         j                  j                          |j)                  d       |j+                  d       |j                  |dddd       t         j"                  j%                  d      } fd}|j'                  d|       |j                  |dddd        j-                  |       y)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                 b    j                   j                  d|        j                  d       y )NzSELECTED_NEW: {res}resr   rr   rs   ru   r   r?   s    r@   
on_button1z2ApplicationWindow._setup_page1.<locals>.on_button1   s&    HHMM/SM9!!!$rA   clickedz;

I already have an existing account and want to use that:
r    zRestore account from cloud backup to this device. You will need access to
your account password and access to your account email address. [R1]T   r[   zRestore accountc                 b    j                   j                  d|        j                  d       y )NzSELECTED_RESTORE: {res}r   r   r   r   s    r@   on_button22z3ApplicationWindow._setup_page1.<locals>.on_button22  &    HHMM3M=!!!$rA   zSynchronize device with other device in account. You will need access to
another device currently connected to your account. [R2]   zSynchronize accountc                 b    j                   j                  d|        j                  d       y )NzSELECTED_SYNCRONIZE: {res}r   r   r   r   s    r@   
on_button2z2ApplicationWindow._setup_page1.<locals>.on_button2  s&    HHMM6CM@!!!$rA   ztRecover account from account seed phrase. You only need access to
your 12-24 word account recovery seed phrase. [R3]   zRecover accountc                 b    j                   j                  d|        j                  d       y )NzSELECTED_RECOVER: {res}r   r    r   r   s    r@   
on_button3z2ApplicationWindow._setup_page1.<locals>.on_button3$  r   rA   N)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   s   `                r@   r:   zApplicationWindow._setup_page1   s    
b!  $R #r"R ]+VQ1a(!QRQ$VQ1a(!pqQ$3,,112VQ1a(**++M:	% 		:.WaAq)))"bca%WaAq))) #i ja%C--223d##WaAq)::,,->?	% 	K0Xq!Q* "\ ]Q$3,,112T"r"VQ1a(**++,AB	% 		:.WaAq) "V WQ$3,,112T"r"VQ1a(**++,=>	% 		:.WaAq)rA   c                    
 t        j                         }t        j                         }t        j                         }|j	                  t
               |j                  |       |j                  |       t         j                  j                  d      } fd}|j                  d|       |j                  |       t        j                  d      }|j                  dd       |j                  t         j                  j                         |j                  |       t        j                         }|j!                         j#                  d       |j%                  d	       |j'                  t         j                  j(                         |j+                  d
       |j-                  t         j.                  j0                         |j                  |       t        j                         }t        j2                  d      j5                  d	       j7                  d	       
fd}	j                  d|	       |j                         t         j                  j                  d      

j7                  d	       t8         fd        fd
j                  d       |j                  
       |j                  |        j;                  |       y)zA
        Setup page shown to generate a new seed phrase.
        zGenerate seedphrasec                     t        dd      _        j                  j                         j                  d       y )N   english)strengthlanguageT)r   r,   set_textset_sensitive)_checkbutton2_1r?   textbuffer2_1s    r@   on_button2_1z4ApplicationWindow._setup_page2.<locals>.on_button2_1<  s4    $7y$YD!""4#8#89((.rA   r   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                 (    j                  d       y NT)r   )r   	button2_2s    r@   on_checkbutton2_1z9ApplicationWindow._setup_page2.<locals>.on_checkbutton2_1X  s    ##D)rA   toggledContinuec              3   D  K   t        j                  d      _        t        j                  j                  j                  j                        _        t        j                  j                  dd        _
        t        j                  j                        j                  _        t        j                  j                         j                  _        j                  j%                  j                         j                  j&                  j(                  j*                  <   j&                  j-                  j.                         j0                  j3                  dj                  j                         j                  j5                  j                        }t7        |       |s9j0                  j3                  dj                         j9                  d       y j0                  j3                  dj                  |	       t;        j<                  |d
         j                  _        j                  j                  _         |d   j                  _!        |d   j                  _"        j                  j&                  j(                  j*                  <   j&                  j-                  j.                         |_#        jH                  jK                  tM        jN                  d                j9                  d       y w)Nr   )indexr   zVXBR ETH key at address {ethadr} set from seed phrase (BIP39 account 0): "{seedphrase}")ethadr
seedphraserO   rP   rQ   rR   r   r"   r   r   rU   r[   )(r   r,   r/   r^   r_   r`   rV   r0   ra   rb   r1   r#   keyr*   r]   r'   
_cskey_rawr~   set_ethkey_from_profiler(   profilesr+   saver.   rr   rs   rq   r   ru   r3   r4   r   
member_adrr   r   r2   rv   rh   rd   _member_data)r   rS   r?   s     r@   on_button2_2z4ApplicationWindow._setup_page2.<locals>.on_button2_2a  sR    "9$:O:OWX"YD!%!<!<T=P=P=X=X!YD%-%5%5d6H6H6L%MD" #((;(;(?(?"@DLL!&t||'>'>!?DLL LL00> 7;llDKK  !2!23KKT001HHMMr!%!3!3%)%:%:  < !% 7 78N8N OOK;J,0,>,>  @%%a(],0,>,>K  Y +/))+l:S*T'*.*<*<'%0%9"(3J(?% ;?,,$$T%6%67  !4!45*5'&&s4+<+<U+C'DE%%a(s   LL c                     j                   j                  dt              |        t        j                  d|        y Nz{func}({widget}))funcwidgetr   rr   rs   r   r
   	callLater)r   r   run_on_button2_2r?   s    r@   r   z8ApplicationWindow._setup_page2.<locals>.run_on_button2_2  s3    HHMM,6:J3KTZM[av6rA   N)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   s   `         @@@@@r@   r;   zApplicationWindow._setup_page2.  s    99;}-

8

6JJ--.CD		/
 	)\2

999#vwq#&S..334

8lln#..0x(  '%%c&7&7&>&>?!!$'!!#,,"3"34

;/PQ!!%($$U+	* 	y*;<

>"JJ--j9	&	)	) 
)	)V	7 	)%56

9

6 rA   c                 t	    t        j                         }t        j                         }t        j                         }|j	                  t
               |j                  |       |j                  |       t        j                         }|j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       t        j                  d      }|j                  |dddd       t        j                          j#                  d       j%                  d       j'                  d       |j                  dddd       d	d	d	d
fdd d fd}j)                  d|       t        j                  d      }|j                  |dddd       t        j                          j#                  d       j%                  d       j'                  d       j+                  d       |j                  dddd       t        j                  d      }|j                  |dddd       t        j                          j#                  d       j%                  d       j'                  d       j+                  d       |j                  dddd       fd}j)                  d|       j)                  d|       t        j                  d      }	|j                  |	dddd       t        j,                  d      }
|
j/                  d       |
j1                  d       fd}|
j)                  d|       |j                  |
dddd       t        j                  d      }	|j                  |	dddd       t        j,                  d      j/                  d       j1                  d       fd}j)                  d|       |j                  dddd       t         j2                  j5                  d      j1                  d       t6         fd         fd!j)                  d"       |j                  dddd       |j                  |        j9                  |       y	)#z

        :return:
        r   zYour email address:r   r   r       (   N)r   passwordeulac                      t        d       D ]&  } |    	t        d|        j                  d        y  j                  d       y )N	check_allzcheck failedFT)printr   )cr   checkss    r@   r  z1ApplicationWindow._setup_page3.<locals>.check_all  sO    + !9$.!,))%0	
 !!$'rA   c                     d| v r| S y )N@ )r   s    r@   check_emailz3ApplicationWindow._setup_page3.<locals>.check_email  s    e|rA   c                      yr   r  )r  s    r@   check_passwordz6ApplicationWindow._setup_page3.<locals>.check_password  s    rA   c                     | j                               d<   d   r+j                  t        j                  j                  d        n5j                  t        j                  j                  t        ddd                      y )Nr   P  r   get_text	modify_fgr   
StateFlagsNORMALr   )entryr  r  r  entry1s    r@   	on_entry1z1ApplicationWindow._setup_page3.<locals>.on_entry1  sa    )%..*:;F7Og  !6!6=  !6!6eQ8JKKrA   changedzNew password:FzRepeat new password:r   c                    d} j                               r-d}j                  t        j                  j                  d        n5j                  t        j                  j                  t        ddd             d} j                               r-d}j                  t        j                  j                  d        n5j                  t        j                  j                  t        ddd             |rM|rKj                         j                         k(  r* j                               rj                         d<   nd d<            y )NFTr  r   r  r  )r   pw1_okpw2_okr  r  r  entry2entry3s      r@   
on_entry23z2ApplicationWindow._setup_page3.<locals>.on_entry23  s    Ffoo/0  !6!6=  !6!6eQ8JKFfoo/0  !6!6=  !6!6eQ8JK&V__%6&//:K%KP^_e_n_n_pPq%+__%6z"%)z"KrA   zEULA:r    z"I accept the EULA and terms of useTc                 J    | j                         rdd<   ndd<            y )NTr  F)r   )buttonr  r  s    r@   r   z2ApplicationWindow._setup_page3.<locals>.on_button1  s&      "!%v!&vKrA   r   zCloud backup:r[   z5Yes, enable encrypted cloud backup of my private keysc                              y r   r  )r*  r  s    r@   r   z2ApplicationWindow._setup_page3.<locals>.on_button2  s    KrA   zRegister accountc              3   |  K   d   _         d   _        j                         _        d_        dj                  j                  t        j                  dd            _        j                  j                  j                         j                  j                  dj                          j                  j                  d	j                  
       j                  j                  dj                         j                  j                  j                  j                         }t        |       j                   j                  _        j                  j                  _        t#        t%        j&                  |d               j                  _        t#        t+        j,                  |d   d            j                  _        j                  j0                  j2                  j4                  <   j0                  j7                  j                         j9                  d       y w)Nr   r  	anonymousz{}{}r   i'  zinput_email: {input_email})r-   z input_username: {input_username})input_usernamez input_password: {input_password})r.   rt   r"   	timestamprE   r    )r-   r.   r   input_backup_enabledr.  ry   randomrandintr'   r   r*   rr   rs   _do_onboard_memberr   r   r   rd   r3   r4   rt   re   rf   r   r(   r   r+   r   ru   )r   resultr   r  r?   s     r@   r   z2ApplicationWindow._setup_page3.<locals>.on_button3(  s    %gD"("4D(/(:(:(<D%"-D"(--0C0CV^^TUW\E]"^DLL00>HHMM6DDTDTMUHHMM<TM`M`MaHHMM<TM`M`Ma<<::4;N;NPTP`P`aaF6N!%!1!1DLL$($7$7DLL!'*4996-;P+Q'RDLL$-0vk?RTX1Y-ZDLL*6:llDKK  !2!23KKT001!!!$s   H9H<c                     j                   j                  dt              |        t        j                  d|        y r   r   )r   r   run_on_button3r?   s    r@   r6  z6ApplicationWindow._setup_page3.<locals>.run_on_button3B  2    HHMM,6.3IRXMYaV4rA   r   )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   r6  s   `            @@@@@@@@@@@r@   r<   zApplicationWindow._setup_page3  s   
 xxzxxz]+
b!  $R #r"R !67VQ1a(c"""2&VQ1a( 
	(			 	y),1VQ1a(b!""2&e$VQ1a(!78VQ1a(b!""2&e$VQ1a(	 	, 	y*-y*-)VQ1a(//(LM5!d#	 		:.WaAq)1VQ1a(//(_`5!d#	 		:.WaAq)**++,>?e$		% 
	%2	5 		>2WaAq)rA   c                    	
 t        j                         }t        j                         }t        j                         }|j	                  t
               |j                  |       |j                  |       t        j                         }t        j                  d      }t        j                  d      }|j                  |       |j                  |       |j                  |       t        j                  d      }|j                  |       t        j                         

j                  d       
j                  d       
j                  d       |j                  
       	
fd}
j                  d	|       t         j                  j                  d
      		j                  d       t         
 fd        fd	j                  d       |j                  	        j#                  |       y)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                 @   t        | j                               }|r<j                  t        j                  j
                  d        j                  d       y j                  t        j                  j
                  t        ddd             j                  d       y )NTr  r   F)r   r  r  r   r  r  r   r   )r  vaction_coder   r   s     r@   r!  z1ApplicationWindow._setup_page4.<locals>.on_entry1o  sp    01ABL  !6!6=%%d+  !6!6eQ8JK%%e,rA   r"  VerifyFc              3     K   t        j                               }|rdj                  |j                               }t	        j
                  j                        t        k(  r*t        j                  j
                  j                        }nj
                  j                  }j                  j                  ||      }t        |       t        t        j                  |d   d            j
                  _        dt        t!        j"                  |d         j%                               z   j
                  _        t        t        j                  |d               j
                  _        j
                  j*                  j,                  j.                  <   j*                  j1                  j2                         y w)N-rT   rE   rK   transactionr   r"   )r   r  joingroupstyper*   rt   rd   r3   r4   r'   _do_onboard_member_verifyr   re   rf   r   ra   rn   ro   vaction_transactionr   r(   r   r+   r   r.   )r   r@  rt   r4  r   r?   s       r@   r   z2ApplicationWindow._setup_page4.<locals>.on_button1~  s7    01BCL"xx(;(;(=>DLL,,-4"ii(@(@A"ll66<<AA+|\\F6N,/fY>OQU0V,WDLL)/3c(:J:J6R_K`:a:h:h:j6k/kDLL,&)$))&:N*O&PDLL#6:llDKK  !2!23KKT001s   G Gc                     j                   j                  dt              |        t        j                  d|        y r   r   )r   r   run_on_button1r?   s    r@   rK  z6ApplicationWindow._setup_page4.<locals>.run_on_button1  r7  rA   r   N)r   r   r   r   r   r   r   r   r8  r   r9  r:  r   r   r   r   r	   r   )r?   r<  r=  r   box3r   r   r   r!  r   r   r   rK  s   `        @@@@r@   r=   zApplicationWindow._setup_page4N  si    xxzxxz]+xxz!WX!GH!pqc"""2&	- 	y),**++H5e$		2 
	2"	5 		>2rA   c                 "   t        j                         }t        j                         }t        j                         }|j	                  t
               |j                  |       |j                  |       t        j                         }|j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       d}t        j                  d      }|j                  dd       |j!                  |d|dd       t        j                         | _        | j"                  j                  dd       | j"                  j%                  d       |j!                  | j"                  d|dd       |dz  }t        j                  d      }|j                  dd       |j!                  |d|dd       t        j                         | _        | j&                  j                  dd       | j&                  j%                  d	       |j!                  | j&                  d|dd       |dz  }t        j                  d
      }|j                  dd       |j!                  |d|dd       t        j                         | _        | j(                  j                  dd       | j(                  j%                  d       |j!                  | j(                  d|dd       |dz  }t        j                  d      }	|	j                  dd       |j!                  |	d|dd       t        j                         | _        | j*                  j                  dd       | j*                  j%                  d	       |j!                  | j*                  d|dd       |dz  }t        j                  d      }
|
j                  dd       |j!                  |
d|dd       t        j                         | _        | j,                  j                  dd       | j,                  j%                  d	       |j!                  | j,                  d|dd       |dz  }t        j                  d      }|j                  dd       |j!                  |d|dd       t        j                         | _        | j.                  j                  dd       | j.                  j%                  d	       |j!                  | j.                  d|dd       |dz  }t        j                  d      }|j                  dd       |j!                  |d|dd       t        j                         | _        | j0                  j                  dd       | j0                  j%                  d	       |j!                  | j0                  d|dd       |dz  }|j                  |       t        j                         }|j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       t        j                  d      }|j                  dd       |j!                  |dddd       t        j                         | _        | j2                  j                  dd       | j2                  j%                  d	       |j!                  | j2                  dddd       t        j                  d      }|j                  dd       |j!                  |dddd       t        j                         | _        | j4                  j                  dd       | j4                  j%                  d	       |j!                  | j4                  dddd       t        j                  d      }|j                  dd       |j!                  |dddd       t        j                         | _        | j6                  j                  dd       |j!                  | j6                  dddd       t        j                  d      }|j                  dd       |j!                  |dddd       t        j                         | _        | j8                  j                  dd       |j!                  | j8                  dddd       t        j                  d      }|j                  dd       |j!                  |dddd       t        j                         | _        | j:                  j                  dd       |j!                  | j:                  dddd       t        j                  d      }|j                  dd       |j!                  |dddd       t        j                         | _        | j<                  j                  dd       |j!                  | j<                  dddd       |j                  |       | j?                  |       y)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:r[   zXBR Balance:r   N) r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rg   set_selectableri   rj   rk   rl   rm   rp   rv   rw   rx   rz   r{   r|   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label11s                       r@   r>   zApplicationWindow._setup_page5  s    xxzxxz]+
b!  $R #r"R  99+AB&&q#.%q'1a899;&&q#.''.T%%q'1a81 !YY-=>((C0'GQ: YY[((C0))$/T''GQ:1 "ii.?@))!S1(!Wa;!iik))!S1**51T((!Wa;1 #&))2H"I--a5,a!Q?"%))+--a5..t4T,,a!Q?1 !$		0D E++As3*Aw1= #		++As3,,T2T**Aw1=1 "%1F!G,,Q4+QA>!$,,Q4--d3T++QA>1 $'993J#K  ..q#6-q'1a@#&99;   ..q#6  //5T--q'1a@1
b!  $R #r"R ,Q$VQ1a(yy{""1c*##D)T\\1aA.0Q$VQ1a(yy{""1c*##D)T\\1aA.!34Q$VQ1a(yy{""1c*T\\1aA./Q$VQ1a(yy{""1c*T\\1aA.0Q$VQ1a(		##As+T]]Aq!Q/)).1a%WaAq)		##As+T]]Aq!Q/rA   N)__name__
__module____qualname____doc__txaiomake_loggerrr   SELECTED_NONESELECTED_NEWSELECTED_SYNCRONIZESELECTED_RECOVERr&   r	   r   r   r:   r;   r<   r=   r>   r  rA   r@   r   r   H   st      %


CMLB E% E%NH^ Bh!VrjIXcrA   r   c                   2    e Zd Zd Zed        Zed        Zy)ApplicationClientc           	      v  K   | j                   j                  dt        |j                        t        |j                        t        |j
                        t        |j                        |       d| j                  j                  v r0t        j                  | j                  j                  d   | |f       y y w)NzbOk, client joined on realm "{realm}" [session={session}, authid="{authid}", authrole="{authrole}"])realmr'   authidauthroledetailsready)rr   rs   r   ri  r'   rj  rk  r(   extrar`  resolve)r?   rl  s     r@   onJoinzApplicationClient.onJoinA  s     z /"7??3!'..1#G$4$45% 	 	' dkk'''MM$++++G4tWoF (s   B7B9c              #      K   | j                         r+| j                  d      }| j                  d      }||dS | j                  j                  d       y w)Nzxbr.network.get_configzxbr.network.get_status)r(   rC   z(not connected: could not retrieve status)is_attachedcallrr   warn)r?   r(   rC   s      r@   rc   zApplicationClient.get_statusK  sR     99%=>>F99%=>>F$77HHMMDEs   AAc           	   #   R  K   | j                         ru| j                  d|      }|r@| j                  d|      }t        j                  j	                  |d         |d<   t        j                  |d         |d<   t        j                  j                  t        |d   d         d      |d   d<   t        j                  j                  t        |d   d	         d      |d   d	<   t        j                  |d
   d      |d
<   |d   }ddddddj                  |d       |d<   | j                  j                  dt        |d         t        |d         t        |d                |S | j                  j!                  d|       y | j                  j!                  d|       y w)Nzxbr.network.is_memberz xbr.network.get_member_by_walletrV   rU   r"   rX   rY   etherrZ   rT   rE   rW   ACTIVEVERIFIEDRETIREDPENALTYBLOCKED)r   r   r    r[   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 networkrP   zInot connected: could not retrieve member data for address {output_ethadr})rr  rs  r^   r_   r`   r3   r4   fromWeir   re   rf   getrr   rs   r   r   rt  )r?   
ethadr_raw	is_memberrS   r|  s        r@   rq   zApplicationClient.get_memberT  s    "ii(?LLI$(II.PR\$]])-)D)D[QZE[)\I&%)YY[5G%HE"04		0A0A.Q\]fQghmQnBoBI1KI&u-04		0A0A.Q\]fQghmQnBoBI1KI&u-)+{97Mt)TI&*73  !   ( #lD) G$ p!&{7';!<#K$67$[%;<	  > #"Z,6  8 HHMMe(2  4s   F%F'N)r\  r]  r^  rp  r	   rc   rq   r  rA   r@   rg  rg  @  s2    G F F (4 (4rA   rg  c                       e Zd ZdZ ej
                         Zej                  j                  ej                  j                  d            ZdZddZy)Applicationz&
    Main XBR member application.
    z~/.xbrnetworkz
config.iniNc           	      	   K   t        j                  d        j                  j                  d|       t        j
                  j                   j                        sFt	        j                   j                          j                  j                  d j                         t        j
                  j                   j                   j                        x _        }|xs d _        t        j
                  j                   j                        sJ j                  j                  d j                  	       t         j                         _        d
 _        n0t         j                         _        d } j                  j#                  |        j                   j                  j$                  vrMt'        j(                  dj+                   j                  |t-         j                  j$                                     j                  j$                   j                      _         j                  j                  d j                   j                         t/         j                   j1                                t3        d       t        j4                         t        j4                         d j                   j                   j                    j                  d|xs:  j                   r, j                   j6                  r j                   j6                  nd}|xs:  j                   r, j                   j8                  r j                   j8                  nd}t;        ||t=               g      }	 j                  j                  d||       |	j?                  t@        |dd       d
{     j                  j                  d       d    d
{   \  }
} j                  j                  d|        fd}tC        ||
 j                   j                   j                    j                        }|jE                  d|       |jE                  d |       |jG                          |jI                          d
{    d!}d"   r;|d#z  } j                  j                  d$|%       tK        d&       d
{    d"   r; j                  j                  d'       y
7 57 7 h7 .w)(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:
        rs   )rW   z5ok, application starting for user profile "{profile}")r*   zdotdir created: "{dotdir}")dotdirdefaultz%no config exist under "{config_path}")r)   Nc                       y)N	123secretr  r  rA   r@   getpwz Application.start.<locals>.getpw  s    "rA   )cb_get_passwordz4no such profile "{}" in config "{}" with {} profilesz<user profile "{profile_name}" loaded from "{config_path}":

)r)   r+   z

T)rm  donerunningr(   r)   r*   r+   r\   rI   )urlri  rn  serializerszIok, now connecting to "{network_url}", joining realm "{network_realm}" ..)r   r   F)r
   auto_reconnectstart_reactorz!ok, application client connected!rm  z)ok, application session joined: {details})rl  c                 x    j                   j                  d       dd<   t        j                  d   d        y )Nzexiting application ..Fr  r  )rr   rs   r`  ro  )r   rn  r?   s    r@   on_exitz"Application.start.<locals>.on_exit  s0    HHMM23$E)MM%-.rA   canceldestroyr   r  r   z7ok, application main task still running at tick {ticks})ticksr   z ok, application main task ended!)&r`  start_loggingrr   rs   osr}   isdirDOTDIRmkdirrE  DOTFILE_config_path_profile_nameisfiler   _config_profileloadr   clickClickExceptionry   lenr   marshalr  create_futurer   r   r   r   runrg  r   r   show_allr   r   )r?   r
   r  ri  r*   r)   r  r   r   runnerr'   rl  r  winr  rn  s   `              @r@   r   zApplication.start  s     	&)MW^_ww}}T[[)HHT[[!HHMM6t{{MK*,'',,t{{DLL*QQK$1	ww~~d//0HHMMAtO`O`Ma%d&7&78DL DM%d&7&78DL# LLe4!!)>)>>**+a+h+himi{i{  ~I  KN  OS  O[  O[  Od  Od  Ke  ,f  g  g $ 5 5d6H6H I^*.*;*;$J\J\  ^t}},,./f ((*'')ll,,}} ..
   F4==T]]MfMfdmm77  mE   BSWS`S`SnSn$--"="=  uA"{)6).0>0@/AC
 	a"-$1 	 	3 jj*!((,',  . 	. 	. 	9:!&w/A7S	/
  $,,@Q@QSWS`S`bfbtbtuHg&Iw'iikIQJEHHMMS[`Ma(NN I
 	897	. 0 	 sO   N0S34S)5'S3S,B)S3S/;S3S1	S3S3,S3/S31S3)NNN)r\  r]  r^  r_  r`  ra  rr   r  r}   abspath
expanduserr  r  r   r  rA   r@   r  r    sE     %


CWW__RWW//@AFG\:rA   r  c                 ^   K   t               }|j                  | |||       d{    y7 w)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  ri  r*   N)r  r   )r
   r  ri  r*   apps        r@   mainr    s)      -C
))GE7)
CCCs   #-+-c                  J   t        j                         } | j                  ddt        dd       | j                  ddt        dd       | j                  d	d
t        dd       | j	                         }t        t        |j                  |j                  |j                  f       y)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")destrG  r  helpz--realmri  z$The realm to join, e.g. "xbrnetwork"z	--profiler*   r  z'The user profile to use, e.g. "default")
argparseArgumentParseradd_argumentrd   
parse_argsr   r  r  ri  r*   )parserargss     r@   _mainr    s     $$&F
"  $Z	  \ 	$  $C	  E &  )F	  H D	$4::t||56rA   __main__)Br  r  r3   ra   r1  pkg_resourcesr   timer   girequire_versiongi.repositoryr   gi.repository.Gdkr   twisted.internetr   installr`  use_twistedtwisted.internet.taskr   twisted.internet.deferr	   r
   r^   numpyre   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  r}   r  r%   r   rg  objectr  r  r  r\  r  rA   r@   <module>r     s
  6 
        	   5%    # (          ' 2 $    . D D 3 ' 3 ' Z Z $ 4///
<PQ mRWW^^M2 3u up=4 =4@e:& e:PD$$7N z	G rA   