U
    •uÄc*Í  ã                   @   s.  d dl Z d dlZd dlZd dlmZmZ d dlmZ d dlmZ ej	s`e
dƒ e
dƒ e d¡ d dlmZmZmZmZmZmZ d d	lmZmZmZmZmZmZ d d
lm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!Z!d dl"Z"d dl#Z#d dl$Z$d dl%Z%d dl&Z'd dl(Z(e( )¡  d dl*m+Z+ d dl,m-Z- d dl.m/Z/ d dl0m1Z1 d dl2m3Z3m4Z4 d dl5m6Z6 d dl7m8Z8 d dl9m:Z: d dlm;Z;m<Z<m=Z=m>Z> d dlm?Z?m@Z@mAZA d dlmBZBmCZC d dlDmEZE d dlFmGZGmHZHmIZI dddddddd d!d"d#d$d%d&d'gZJG d(d)„ d)e3ƒZKd*d+„ ZLd,d-„ ZMeNd.k�r*eMƒ  dS )/é    N)ÚEnvironmentÚFileSystemLoader)Úxbr)Ú__version__z3
You must install the [xbr] extra to use xbrnetworkz)For example, "pip install autobahn[xbr]".é   )ÚXBR_DEBUG_TOKEN_ADDRÚXBR_DEBUG_NETWORK_ADDRÚXBR_DEBUG_DOMAIN_ADDRÚXBR_DEBUG_CATALOG_ADDRÚXBR_DEBUG_MARKET_ADDRÚXBR_DEBUG_CHANNEL_ADDR)ÚXBR_DEBUG_TOKEN_ADDR_SRCÚXBR_DEBUG_NETWORK_ADDR_SRCÚXBR_DEBUG_DOMAIN_ADDR_SRCÚXBR_DEBUG_CATALOG_ADDR_SRCÚXBR_DEBUG_MARKET_ADDR_SRCÚXBR_DEBUG_CHANNEL_ADDR_SRC)ÚFbsRepository)Úpformat)Úreactor)ÚinlineCallbacks)ÚdeferToThread)ÚReactorNotRunning)ÚApplicationSessionÚApplicationRunner)ÚCBORSerializer)Ú
cryptosign)ÚApplicationError)Úpack_uint256Úunpack_uint256Úsign_eip712_channel_openÚmake_w3)Úsign_eip712_member_registerÚsign_eip712_market_createÚsign_eip712_market_join)Ú	ActorTypeÚChannelType)Úload_or_create_profile)ÚhltypeÚhlidÚhlvalÚversionú
get-memberúregister-memberúregister-member-verifyú
get-marketúcreate-marketúcreate-market-verifyú	get-actorújoin-marketújoin-market-verifyúget-channelúopen-channelzclose-channelúdescribe-schemaúcodegen-schemac                   @   sÎ   e Zd ZdZd0dd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zed1dd„ƒZedd„ ƒZd2dd„Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ ZdS )3ÚClientz
tls-uniqueNc                 C   sö   t  | |¡ d| _d| _|j dd ¡}|r~|jr~t|jƒtkrLt	|jƒdksPt
‚|j| _tj | j¡| _| jjd| jjd� n(t d¡| _tj | j¡| _| j d¡ |rÈ|jrÈ|  |¡ | j d¡ n$d | _d | _d | _d | _| j d	¡ d
| _d S )Ni † é   Úprofileé    z8WAMP-Cryptosign keys with public key {public_key} loaded)Ú
public_keyz)WAMP-Cryptosign keys initialized randomlyz XBR ETH keys loaded from profilezXBR ETH keys left unsetT)r   Ú__init__Ú_default_gasÚ	_chain_idÚextraÚgetÚcskeyÚtypeÚbytesÚlenÚAssertionErrorZ
_cskey_rawr   ZCryptosignKeyÚ
from_bytesÚ_keyÚlogÚinfor=   ÚosÚurandomÚethkeyÚset_ethkey_from_profileÚ_ethkey_rawÚ_ethkeyÚ_ethadrÚ_ethadr_rawÚ_running)ÚselfÚconfigr;   © rW   úS/var/www/html/NKSPORTS/school/venv/lib/python3.8/site-packages/autobahn/xbr/_cli.pyr>   `   s*    
 

zClient.__init__c                 C   sž   t |jƒtks"td t |jƒ¡ƒ‚t|jƒdksDtd t|jƒ¡ƒ‚|j| _tj 	| j¡| _
tj | j
j ¡ ¡| _t | jdd… ¡| _| jjd| jd� dS )z3

        :param profile:
        :return:
        zBset_ethkey_from_profile::profile invalid type "{}" - must be bytesr<   z?set_ethkey_from_profile::profile invalid length {} - must be 32é   Nz%ETH keys with address {ethadr} loaded)Zethadr)rD   rN   rE   rG   ÚformatrF   rP   Úeth_keysÚkeysZ
PrivateKeyrQ   Úweb3ÚWeb3ÚtoChecksumAddressr=   Úto_canonical_addressrR   ÚbinasciiÚa2b_hexrS   rJ   rK   )rU   r;   rW   rW   rX   rO      s"    ÿÿÿÿÿzClient.set_ethkey_from_profilec                 C   s|   | j jdkrR| j ¡ d d | jdœ}| jjdt| j jƒd� | j| j jdg|d� n&| jjdt| j jƒd� |  | j j¡ d S )NÚ
xbrnetwork)ZpubkeyZ	trustrootÚ	challengeZchannel_bindingzTClient connected, now joining realm "{realm}" with WAMP-cryptosign authentication ..)Úrealmr   )ZauthmethodsÚ	authextrazDClient connected, now joining realm "{realm}" (no authentication) ..)	rV   re   rI   r=   ÚCHANNEL_BINDINGrJ   rK   r)   Újoin)rU   rf   rW   rW   rX   Ú	onConnect�   s    ü
ÿ
ÿzClient.onConnectc                 C   sF   |j dkr2| jj|| jjj | jd ¡| jd�}|S td 	|j ¡ƒ‚d S )Nr   )Ú
channel_idZchannel_id_typez*unable to process authentication method {})
ÚmethodrI   Zsign_challengeÚ	transportZtransport_detailsrj   rB   rg   ÚRuntimeErrorrZ   )rU   rd   Zsigned_challengerW   rW   rX   ÚonChallenge    s    
þzClient.onChallengec              
   Ã   sÞ   | j jdt|jƒt|jƒt|jƒt|jƒ|d� d| jjkrTt	 
| jjd | |f¡ d| jjkrÚznz0|jdkr€|  |¡I d H  n|  |¡I d H  W n8 tk
rÊ } z| j  ¡  || jjd< W 5 d }~X Y nX W 5 |  ¡  X d S )NzbOk, client joined on realm "{realm}" [session={session}, authid="{authid}", authrole="{authrole}"])re   ÚsessionÚauthidÚauthroleÚdetailsÚreadyÚcommandrc   Úerror)rJ   rK   r)   re   ro   rp   rq   rV   rA   ÚtxaioÚresolveÚleaveÚ_do_xbrnetwork_realmÚ_do_market_realmÚ	ExceptionÚfailure)rU   rr   ÚerW   rW   rX   ÚonJoin©   s&    ú

"zClient.onJoinc                 C   sL   | j jdt|jƒd� d| _|jdkrH| jrH| jjrH| jj ¡  |  ¡  d S )Nz%Client left realm (reason="{reason}"))ÚreasonFzwamp.close.normal)	rJ   rK   r*   r   rT   rV   ÚrunnerÚstopZ
disconnect)rU   rr   rW   rW   rX   ÚonLeaveÀ   s    
zClient.onLeavec                 C   s2   | j  d¡ zt ¡  W n tk
r,   Y nX d S )NzClient disconnected)rJ   rK   r   r�   r   )rU   rW   rW   rX   ÚonDisconnectÊ   s
    zClient.onDisconnectc                 Ã   sô  | j jd }|jdkrÂ| j d¡ |dks.t‚|dkrJ|  | j¡I d H  nt|dkr~| j jd }| j jd }|  ||¡I d H  n@|d	kr²| j jd
 }| j jd }|  	||¡I d H  nds¾tdƒ‚�n.t
 |jdd … ¡}|dksât‚|dk�r|  | j¡I d H  �nî|dk�r.| j jd }|  ||¡I d H  �nÂ|dk�r¬d| j jk�rb| j jd �rb| j jd }nd }d| j jk�r�| j jd �r�| j jd }	n| j}	|  ||	¡I d H  �nD|dk�r:| j jd }| j jd }
| j jd }| j jd }| j jd }| j jd }| j jd }| j jd }| j|||
||||||d�	I d H  n¶|dk�rr| j jd
 }| j jd }|  |||¡I d H  n~|dk�rª| j jd }| j jd }|  |||¡I d H  nF|d k�râ| j jd
 }| j jd }|  |||¡I d H  nd�sðtdƒ‚d S )!Nrt   Ú	anonymousz#not yet a member in the XBR network)r,   r-   r.   r,   r-   ÚusernameÚemailr.   ÚvactionÚvcodeFúshould not arrive hereé   )r,   r/   r0   r1   r2   r3   r4   r/   Úmarketr2   Úactorr0   ÚmarketmakerÚmarket_titleÚmarket_labelÚmarket_homepageÚmarket_provider_securityÚmarket_consumer_securityÚ
market_fee)ÚtitleÚlabelÚhomepageÚprovider_securityÚconsumer_securityr“   r1   r3   Ú
actor_typer4   )rV   rA   rq   rJ   rK   rG   Ú_do_get_memberrS   Ú_do_onboard_memberÚ_do_onboard_member_verifyÚuuidÚUUIDrp   Ú_do_get_marketÚ_do_get_actorÚ_do_create_marketÚ_do_create_market_verifyÚ_do_join_marketÚ_do_join_market_verify)rU   rr   rt   r…   r†   Úvaction_oidÚvaction_codeÚ
member_oidÚ
market_oidrŒ   r�   rŽ   r�   r�   r—   r˜   r“   r™   rW   rW   rX   ry   Ñ   sv    




  ý


zClient._do_xbrnetwork_realmc           
      Ã   s>  | j jd }d|j|j|jdœ}t|ƒ| _t | j¡ | j jd }|dksNt	‚|dkrÄ| j jd }| j jd }| j jd	 }|t
jkr˜|  ||¡I d H  n*|t
jkr¶|  ||¡I d H  nd
sÂt	dƒ‚nv|dk�r,| j jd }| j jd pìt ¡ }| j jd	 }| j jd }| j jd }	|  |||||	¡I d H  nd
�s:t	dƒ‚d S )Nr;   Zinfura)rD   ÚnetworkÚkeyZsecretrt   )r6   r5   r5   r‹   ÚdelegateÚchannel_typeFr‰   r6   ÚchannelÚamount)rV   rA   Zinfura_networkZ
infura_keyZinfura_secretr!   Ú_w3r   ZsetProviderrG   r&   ÚPAYMENTÚ_do_get_active_payment_channelÚPAYINGÚ_do_get_active_paying_channelr�   Zuuid4Ú_do_open_channel)
rU   rr   r;   Zblockchain_gatewayrt   r¨   r«   r¬   Úchannel_oidr®   rW   rW   rX   rz     s6    ü



zClient._do_market_realmc                 Ã   s$  |   d|¡I d H }|�r|   d|¡I d H }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tt |¡ ¡ ƒd� d S )Núxbr.network.is_memberú xbr.network.get_member_by_walletÚaddressÚoid©rE   ÚbalanceÚethÚetherr   ÚcreatedÚnsÚlevelZACTIVEZVERIFIEDZRETIREDZPENALTYZBLOCKED)r   rY   é   r:   é   zZMember {member_oid} found for address 0x{member_adr} - current member level {member_level})Úmember_levelr§   Ú
member_adrú9Address 0x{member_adr} is not a member in the XBR network©rÄ   )Úcallr]   r^   r_   r�   rž   ÚfromWeir   ÚnpÚ
datetime64rB   rJ   rK   r*   r)   Úwarnra   Úb2a_hexÚdecode)rU   rÄ   Ú	is_memberÚmember_datarÃ   ZMEMBER_LEVEL_TO_STRrW   rW   rX   rš   D  s2    ""ö


ýÿzClient._do_get_memberc                 Ã   sJ  |   d|¡I d H }|�r,|   d|¡I d H }tj|d d�}tj |d ¡}|d }tj t|d d ƒd	¡}tj t|d d
 ƒd	¡}| jj	dt
|ƒt|ƒt|ƒt|ƒd� |rº|jg}	n|   d|j¡I d H }	|	�r|	D �]@}|   d||d ¡I d H }
|
D �]}tj |d ¡|d< t |d d¡|d< |d �r>t|d ƒnd |d< tj|d d�|d< |d �rztj t|d ƒd	¡nd |d< |d �r¢dt |d ¡ ¡  nd |d< |d �rÊdt |d ¡ ¡  nd |d< |d }ddddœ}| |d ¡|d< | jj	dt
tj|d�ƒt|ƒd� qúqØn| j 	d¡ n| jjd t |¡ ¡ d!� d S )"Nr¶   r·   r¹   rº   r¸   rÀ   r»   r¼   r½   r   z‚Found member with address {member_adr} (member level {member_level}, balances: {member_balance_eth} ETH, {member_balance_xbr} XBR))rÄ   rÃ   Zmember_balance_ethZmember_balance_xbrz xbr.network.get_markets_by_actorzxbr.network.get_actor_in_marketrŒ   Ú	timestampr¿   Zjoinedr‹   ZsecurityÚ	signatureÚ0xÚtidr™   ÚPROVIDERÚCONSUMERÚPROVIDER_CONSUMER)r   rY   rÁ   z1Actor is joined to market {market_oid}:

{actor}
)r¨   rŒ   z&Member is not yet actor in any market!rÅ   rÆ   )rÇ   r�   rž   r]   r^   r_   rÈ   r   rJ   rK   r)   r*   rE   rÉ   rÊ   ra   rÌ   rÍ   rB   r   rË   )rU   r¨   Z	actor_adrrÎ   rŒ   Z	actor_oidZactor_levelZactor_balance_ethZactor_balance_xbrÚmarket_oidsÚresultr™   ZACTOR_TYPE_TO_STRrW   rW   rX   r    g  sf    û


ÿÿÿÿ(ú ÿÿzClient._do_get_actorc                 c   s  t  | j ¡ ¡}d}| j}| j}|j ¡ }|  d¡V }	|  d¡V }
|	d }t  |	d dd … ¡}|
d d }|	d	 d
 }||||dœ}t 	|¡}t
 ¡ }| |¡ t t | ¡ d¡¡}t|||||||ƒ}z(|  d||||||||||||¡V }W np tk
�r> } z*| jjd|d� |  dt|ƒ¡ W Y ¢d S d }~X Y n( tk
�rd } z|‚W 5 d }~X Y nX t|ƒtk�sxt‚d|k�r¢t|d ƒtk�r¢|d dk�s¦t‚d|k�r¾|d dk�sÂt‚d|k�rðt|d ƒtk�rðt|d ƒdk�sôt‚tj|d d�}| jj d|d� |S )NZmetamaskúxbr.network.get_configúxbr.network.get_statusÚverifying_chain_idÚverifying_contract_adrrY   ÚblockÚnumberÚeulaÚhash)Úmember_usernameÚmember_emailÚclient_pubkeyÚwallet_typeúsha2-256zxbr.network.onboard_memberúApplicationError: {error}©ru   z
wamp.errorrÐ   r   ÚactionZonboard_memberr¥   é   rº   z9On-boarding member - verification "{vaction_oid}" created©r¥   )!ra   rb   rI   r=   rQ   rP   r`   rÇ   Úcbor2ÚdumpsÚhashlibÚsha256ÚupdateÚ	multihashÚto_b58_stringÚencodeÚdigestr"   r   rJ   ru   rx   Ústrr{   rD   ÚdictrG   ÚintrE   rF   r�   rž   rK   )rU   rá   râ   Zmember_passwordrã   rä   Z
wallet_keyZ
wallet_rawZ
wallet_adrrV   ÚstatusÚverifyingChainÚverifyingContractÚ
registeredrß   Zprofile_objZprofile_dataÚhr;   rÑ   rØ   r}   r¥   rW   rW   rX   r›   ž  sl    
ü

   ÿ         ý
.2zClient._do_onboard_memberc              
   c   s  | j jd||d� z|  d|j|¡V }W n6 tk
r^ } z| j jd|d� |‚W 5 d }~X Y nX t|ƒtkspt‚d|kr˜t|d ƒtkr˜t	|d ƒdksœt‚d|krÀt|d ƒt
krÀ|d d	ksÄt‚|d }| j jd
ttj|d�ƒtdt |d ¡ ¡  ƒd� |S )NzPVerifying member using vaction_oid={vaction_oid}, vaction_code={vaction_code} ..©r¥   r¦   z!xbr.network.verify_onboard_memberræ   rç   r§   ré   r¾   r   zUSUCCESS! New XBR Member onboarded: member_oid={member_oid}, transaction={transaction}rº   rÒ   Útransaction)r§   rý   )rJ   rK   rÇ   rE   r   ru   rD   rõ   rG   rF   rö   r)   r�   rž   r*   ra   rÌ   rÍ   )rU   r¥   r¦   rØ   r}   r§   rW   rW   rX   rœ   ß  s$     ÿ,(þz Client._do_onboard_member_verifyr   c
                 Ã   s   |   d|j¡I d H }
|
d }|   d¡I d H }|d }t |d dd … ¡}t |d d dd … ¡}|   d	¡I d H }|d
 d }|   d¡I d H }t|ƒ}| jjd|d� |   d|j¡I d H }t|ƒ}| jjd|d� d t 	dd¡¡ 
d¡}t ¡ }| |¡ tt t 
| ¡ d¡¡ƒ}|||||j|jdœ}t |¡}t ¡ }| |¡ t t 
| ¡ d¡¡}t| j|||||j|||||||	ƒ}t|ƒ}t|ƒ}t|	ƒ}	|||dœ}|   d|j|j|||||||||||	||¡I d H }| jjdt|ƒd� t|ƒtk�s t‚d|k�r*t|d ƒtk�r*|d dk�s.t‚d|k�rF|d dk�sJt‚d|k�rxt|d ƒtk�rxt|d ƒd k�s|t‚tj|d d!�}| jjd"|d#� d S )$Núxbr.network.get_memberr¸   rÙ   rÛ   rÜ   rY   Z	contractsÚxbrtokenrÚ   rÝ   rÞ   úxbr.network.find_marketsz)Total markets before: {cnt_market_before})Úcnt_market_beforeú xbr.network.get_markets_by_ownerz.Market for owner: {cnt_market_by_owner_before}©Úcnt_market_by_owner_beforez&these are my market terms (randint={})r   iè  Úutf8rå   )Zchain_idÚblock_numberZcontract_adrrÄ   r§   r¨   )r”   r•   r–   zxbr.network.create_marketzLSUCCESS: Create market request submitted: 
{createmarket_request_submitted}
)Úcreatemarket_request_submittedrÐ   rè   Zcreate_marketr¥   ré   rº   z8SUCCESS: New Market verification "{vaction_oid}" createdrê   )rÇ   rE   ra   rb   rF   rJ   rK   rZ   ÚrandomÚrandintrò   rí   rî   rï   rô   rð   rñ   ró   rë   rì   r#   rP   r   r   rD   rõ   rG   rö   r�   rž   )rU   r§   r¨   r�   r”   r•   r–   r—   r˜   r“   rÏ   rÄ   rV   rø   rù   Zcoin_adrr÷   r  Úresr  r  Z
terms_datarû   Z
terms_hashÚmeta_objÚ	meta_dataÚ	meta_hashrÑ   Ú
attributesr  r¥   rW   rW   rX   r¡   õ  s¼    ÿ
ú

       þý

          ü
ÿÿÿ
ÿÿÿ
ÿÿÿÿÿzClient._do_create_marketc           
      Ã   sØ  | j jd||d� |  d|j|¡I d H }| j jdt|ƒd� t|ƒtksLt‚d|krtt|d ƒtkrtt|d ƒdksxt‚d|krœt|d ƒt	krœ|d d	ks t‚|d }| j jd
t
j|d�t|ƒd� |  d¡I d H }| j jdt|ƒd� t|ƒ}| j jd|d� ||k�s(td t
j|d�t|ƒ¡ƒ‚|  d|j¡I d H }| j jdt|ƒd� t|ƒ}| j jd|d� ||k�sŽtd t
j|d�t|ƒ¡ƒ‚|D ]@}| j jd|d� | jd|dd�I d H }	| j jdt|	ƒd� �q’d S )NzWVerifying create market using vaction_oid={vaction_oid}, vaction_code={vaction_code} ..rü   z xbr.network.verify_create_marketzBCreate market request verified: 
{create_market_request_verified}
)Úcreate_market_request_verifiedr¨   ré   r¾   r   zJSUCCESS! New XBR market created: market_oid={market_oid}, result=
{result}rº   )r¨   rØ   r   z3SUCCESS - find_markets: found {cnt_markets} markets)Zcnt_marketsz'Total markets after: {cnt_market_after})Úcnt_market_afterzFexpected to find market ID {}, but not found in {} returned market IDsr  z;SUCCESS - get_markets_by_owner: found {cnt_markets} marketsz-Market for owner: {cnt_market_by_owner_after}r  z2xbr.network.get_market(market_oid={market_oid}) ..©r¨   úxbr.network.get_marketT)Zinclude_attributesz*SUCCESS: got market information

{market}
)r‹   )rJ   rK   rÇ   rE   r   rD   rõ   rG   rF   rö   r�   rž   rZ   )
rU   r§   r¥   r¦   r  r¨   r×   r  Zcnt_market_by_owner_afterr‹   rW   rW   rX   r¢   Q  sp     ÿ
ÿ
ÿ
ÿÿÿÿÿ
ÿÿ
ÿ
 ÿ
 ÿÿ
 ÿzClient._do_create_market_verifyc                 Ã   s  |   d|j¡I d H }|d }|   d|j¡I d H }|rî|d |krN| j d¡ n | jjdttj |d ¡ƒd� tj	|d d	�|d< tj |d ¡|d< tj |d
 ¡|d
< tj |d ¡|d< t
 |d d¡|d< | jjdt|ƒt|ƒd� n| jjdt|ƒd� d S )Nrþ   r¸   r  Úownerz You are market owner (operator)!zMarked is owned by {owner})r  r‹   rº   ZmakerZcoinrÐ   r¿   z+Market {market_oid} information:

{market}
)r¨   r‹   zNo market {market_oid} found!r  )rÇ   rE   rJ   rK   r)   r]   r^   r_   r�   rž   rÉ   rÊ   r   rË   )rU   r§   r¨   rÏ   rÄ   r‹   rW   rW   rX   rŸ   ~  s"      ÿzClient._do_get_marketc                 Ã   s  |t jt jt jfkst‚|  d|j¡I d H }|d }|  d¡I d H }|d }t |d dd … ¡}|  d¡I d H }	|	d d	 }
i }t	 
|¡}t ¡ }| |¡ t t | ¡ d
¡¡}t| j||||
|j||ƒ}|  d|j|j||
|||||¡
I d H }tj|d d�}| jjd|d� d S )Nrþ   r¸   rÙ   rÛ   rÜ   rY   rÚ   rÝ   rÞ   rå   zxbr.network.join_marketr¥   rº   zESUCCESS! XBR market join request submitted: vaction_oid={vaction_oid}rê   )r%   rÕ   rÔ   rÖ   rG   rÇ   rE   ra   rb   rë   rì   rí   rî   rï   rð   rñ   rò   ró   r$   rP   r�   rž   rJ   rK   )rU   r§   r¨   r™   rÏ   rÄ   rV   rø   rù   r÷   r  r  r  rû   r  rÑ   Zrequest_submittedr¥   rW   rW   rX   r£   “  s<    

   ÿ     þ
zClient._do_join_marketc                 Ã   s>   |   d|j|¡I d H }|d }|d }| jjd|||d� d S )Nzxbr.network.verify_join_marketr¨   r™   zeSUCCESS! XBR market joined: member_oid={member_oid}, market_oid={market_oid}, actor_type={actor_type})r§   r¨   r™   )rÇ   rE   rJ   rK   )rU   r§   r¥   r¦   Zrequest_verifiedr¨   r™   rW   rW   rX   r¤   ²  s      þzClient._do_join_market_verifyc                 Ã   s¬   |   d|¡I d H }| jjdt|ƒd� |rœ| jjdtt|d ƒd ƒd� |   d|d	 ¡I d H }| jjd
t|ƒd� | jjdtt|d ƒd ƒ|d d� n| j d¡ d S )Nz*xbr.marketmaker.get_active_payment_channelú	{channel}©r­   z5Active buyer (payment) channel found: {amount} amountr®   ì     ÈNÎZo©r®   z+xbr.marketmaker.get_payment_channel_balancerµ   ú	{balance}úECurrent off-chain amount remaining: {remaining} [sequence {sequence}]Ú	remainingÚseq©r  Úsequencez(No active buyer (payment) channel found!©rÇ   rJ   Údebugr   rK   rö   r   ©rU   r¨   Zdelegate_adrr­   r»   rW   rW   rX   r±   º  s    ÿ ÿz%Client._do_get_active_payment_channelc                 Ã   s¬   |   d|¡I d H }| jjdt|ƒd� |rœ| jjdtt|d ƒd ƒd� |   d|d	 ¡I d H }| jjd
t|ƒd� | jjdtt|d ƒd ƒ|d d� n| j d¡ d S )Nz)xbr.marketmaker.get_active_paying_channelr  r  z5Active seller (paying) channel found: {amount} amountr®   r  r  z*xbr.marketmaker.get_paying_channel_balancerµ   r  r  r  r  r  z(No active seller (paying) channel found!r  r   rW   rW   rX   r³   Ç  s    ÿ ÿz$Client._do_get_active_paying_channelc                 Ã   sœ  | j }| jj ¡ }|  d¡I d H }t |d dd … ¡}	t |d dd … ¡}
|d }t |d dd … ¡}|  d¡I d H }|d d	 }|d
k�r,|tjkrª|}t	j
j}n$|tjkrÂ|	}t	j
j}ndsÎtdƒ‚z*t| j|||ƒI d H }| jjd|d� W n2 tk
�r* } z| j ¡  |‚W 5 d }~X Y nX t||||||j|j|||	|
|ƒ}d }|  d||j|j||||||	|
t|ƒ||¡I d H }| jjdt|ƒd� d S )Nzxbr.marketmaker.get_configr�   rY   r  rÛ   rÜ   zxbr.marketmaker.get_statusrÝ   rÞ   r   Fr‰   z*transaction submitted, txn_hash={txn_hash})Útxn_hashzxbr.marketmaker.open_channelz3Channel open request submitted:

{channel_request}
)Úchannel_request)rP   rQ   r=   r`   rÇ   ra   rb   r&   r°   r   Z
xbrchannelr¸   r²   rG   r   Ú_send_AllowancerJ   rK   r{   r|   r    rE   r   r   )rU   r¨   rµ   r¬   r«   r®   Z
member_keyrÄ   rV   r�   Z	recipientrÛ   rÜ   r÷   Zcurrent_block_numberÚfrom_adrÚto_adrr!  r}   rÑ   r  r"  rW   rW   rX   r´   Ô  sd    






      þ        ý
ÿzClient._do_open_channelc           
      C   s   | j }| j dd¡}| j}| jjj|dd�}| jjdt| j	ƒ|d� t
jj ||¡ |||| j|dœ¡}| jjdt| j	ƒ|d	� | jjjj|| jd
�}| jjdt| j	ƒtt |j¡ ¡ ƒd� | jj |j¡}	t|	ƒ}	| jjdt| j	ƒtt |	¡ ¡ ƒd� |	S )NÚ10ZgweiÚpending)Zblock_identifierz9{func}::[1/4] - Ethereum transaction nonce: nonce={nonce})ÚfuncÚnonce)ÚfromÚgasÚgasPriceZchainIdr)  zQ{func}::[2/4] - Ethereum transaction created: raw_transaction=
{raw_transaction}
)r(  Úraw_transaction)Zprivate_keyzF{func}::[3/4] - Ethereum transaction signed: signed_txn=
{signed_txn}
)r(  Ú
signed_txnzE{func}::[4/4] - Ethereum transaction submitted: txn_hash=0x{txn_hash})r(  r!  )r?   r¯   ZtoWeirR   r¼   ZgetTransactionCountrJ   rK   r(   r#  r   rÿ   Z	functionsZapproveZbuildTransactionr@   ZaccountZsign_transactionrP   r*   ra   rÌ   ZrawTransactionrÍ   ZsendRawTransactionrE   )
rU   r$  r%  r®   r+  r,  r)  r-  r.  r!  rW   rW   rX   r#    sD    þûýýýzClient._send_Allowance)N)N)NNNr   r   r   )Ú__name__Ú
__module__Ú__qualname__rg   r>   rO   ri   rn   r~   r‚   rƒ   ry   rz   rš   r    r   r›   rœ   r¡   r¢   rŸ   r£   r¤   r±   r³   r´   r#  rW   rW   rW   rX   r9   [   s:   
	
E.#7@
      ÿ
\-1r9   c                   C   s²   t dƒ t d tdt ƒ¡ƒ t dƒ t dƒ t d ttƒt¡ƒ t d ttƒt¡ƒ t d tt	ƒt
¡ƒ t d ttƒt¡ƒ t d	 ttƒt¡ƒ t d
 ttƒt¡ƒ t dƒ d S )NÚ z XBR CLI {}
Úvz   Contract addresses:
z"      XBRToken   : {} [source: {}]z"      XBRNetwork : {} [source: {}]z"      XBRDomain  : {} [source: {}]z"      XBRCatalog : {} [source: {}]z"      XBRMarket  : {} [source: {}]z"      XBRChannel : {} [source: {}])ÚprintrZ   r*   r   r)   r   r   r   r   r	   r   r
   r   r   r   r   r   rW   rW   rW   rX   Úprint_version3  s    r5  c                  C   s¤  t  ¡ } | jdttdddd� | jdddd	d
� | jddtdd� | jdddtdd� | jdddtdd� ddg}| jdddtd |¡d� | jddtd d!d"� | jd#d$td%d&d"� | jd'd(td)d� | jd*d+td,d� | jd-d.td d/d"� | jd0d1td d2d"� | jd3d4td d5d"� | jd6d7td d8d"� | jd9d:td d;d"� | jd<d=td d>d"� | jd?d@td dAd"� | jdBdCtd dAd"� | jdDdEtd dAd"� | jdFdGtd dHd"� | jdIdJtttj	tj
tjgƒd dKdL� | jdMdNtd dOd"� | jdPdQtd dRd"� | jdSdTtd dUd"� | jdVdWtttjtjgƒd dXdL� | jdYdZtd d[d"� | jd\d]td d^d"� |  ¡ }|jd_k�rjtƒ  �n6|jd`k�rôt|jda�}| |j¡ t|jƒt|jƒ t|jƒ }tdb t|ƒtt|jƒƒtt|jƒƒtt|jƒƒ¡ƒ tƒ  | ¡  �n¬|jdck�r€t|jda�}| |j¡ t|jddde�ƒ t dfdg¡}t |dhdidj�}t!|dddddk�}t"j# $|j%¡�slt" &|j%¡ | '||j%d¡ �n |jd k�s˜|jdk�r¶tdl dm (t¡¡ƒ t) *dn¡ t+|j,|j-|j.|j/do�}|j0�rät1j2dpdq� nt1j2drdq� t1 3¡ }	|	j4dst5dtt6 ƒdu� |	j4dvt|j7ƒt|j#ƒdw� ||j|j.|j/|j8|j9|j:�rTt; <|j:¡nd |j=|j>|j?|j@�pldn|jA�pvdn|jB�p€dn|jC�rœtD E|jCdxd … ¡nd |jF|jG|jH�rºt; <|jH¡nd |jI�rÐt; <|jI¡nd |jJ|jK�ròtD E|jKdxd … ¡nd |jL�pþdndyœ}
tM|jN|jO|
tPƒ gdz�}zB|	j4d{t|jNƒ|jO�rFd|t|jOƒ d} ndAd~� |jQtRdid� W n6 tSk
�r” } zt|ƒ t) *d€¡ W 5 d }~X Y nX t) *dn¡ d S )�Nrt   Znoopú?zCommand to run)rD   ÚchoicesÚconstÚnargsÚhelpz-dz--debugÚ
store_truezEnable debug output.)rè   r:  z-oz--outputzCode output folder)rD   r:  z-sz--schemaÚschemaz.FlatBuffers binary schema file to read (.bfbs))ÚdestrD   r:  z-bz--basemoduleÚ
basemodulezRender to this base moduleÚpythonÚjsonz-lz
--languageÚlanguagez"Generated code language, one of {}z--urlÚurlzwss://planet.xbr.network/wsz8The router URL (default: "wss://planet.xbr.network/ws").)r=  rD   Údefaultr:  z--realmre   rc   z*The realm to join (default: "xbrnetwork").z--ethkeyrN   z5Private Ethereum key (32 bytes as HEX encoded string)z--cskeyrC   zKPrivate WAMP-cryptosign authentication key (32 bytes as HEX encoded string)z
--usernamer…   z)For on-boarding, the new member username.z--emailr†   z.For on-boarding, the new member email address.z--marketr‹   z*For creating new markets, the market UUID.z--market_titlerŽ   z+For creating new markets, the market title.z--market_labelr�   z+For creating new markets, the market label.z--market_homepager�   z.For creating new markets, the market homepage.z--provider_securityr—   r2  z--consumer_securityr˜   z--market_feer“   z--marketmakerr�   z3For creating new markets, the market maker address.z--actor_typer™   zDActor type: PROVIDER = 1, CONSUMER = 2, PROVIDER_CONSUMER (both) = 3)r=  rD   r7  rC  r:  z--vcoderˆ   z4For verifications of actions, the verification UUID.z	--vactionr‡   zRFor verifications of actions (on-board, create-market, ..), the verification code.z	--channelr­   z+For creating new channel, the channel UUID.z--channel_typer¬   z6Channel type: Seller (PAYING) = 1, Buyer (PAYMENT) = 2z
--delegater«   z/For creating new channel, the delegate address.z--amountr®   zzAmount to open the channel with. In tokens of the market coin type, used as means of payment in the market of the channel.r+   r7   )r>  zOok, loaded {} types ({} structs and tables, {} enums and {} service interfaces)r8   T)r\   Úautobahnzxbr/templateszutf-8F)ÚencodingÚfollowlinks)ÚloaderZtrim_blocksZlstrip_blocksz!no command given. select from: {}z, r   )Zdefault_urlZdefault_realmZdefault_usernameZdefault_emailr  )rÀ   rK   zXBR CLI {version}r3  )r+   z$Profile {profile} loaded from {path})r;   ÚpathrY   )r;   rt   r…   r†   rN   rC   r‹   rŽ   r�   r�   r‘   r’   r“   r�   r™   rˆ   r‡   r­   r¬   r«   r®   )rB  re   rA   Zserializersz Connecting to "{url}" {realm} ..z
at realm "ú")rB  re   )Zauto_reconnectr   )TÚargparseÚArgumentParserÚadd_argumentrô   Ú	_COMMANDSrZ   rö   Úsortedr%   rÕ   rÔ   rÖ   r&   r²   r°   Ú
parse_argsrt   r5  r   r>  Úloadr<  rF   ZobjsZenumsZservicesr4  r*   Zprint_summaryÚsummaryÚpkg_resourcesÚresource_filenamer   r   rL   rH  ÚisdirÚoutputÚmkdirZrenderrh   ÚsysÚexitr'   rB  re   r…   r†   r  rv   Zstart_loggingZmake_loggerrK   r)   r   ÚnamerN   rC   r‹   r�   rž   rŽ   r�   r�   r—   r˜   r“   r�   ra   rb   r™   rˆ   r‡   r­   r¬   r«   r®   r   Znetwork_urlZnetwork_realmr   Úrunr9   r{   )ÚparserZ
_LANGUAGESÚargsZrepoZtotal_countZ	templatesrG  Úenvr;   rJ   rA   r€   r}   rW   rW   rX   Ú_mainA  sØ   ûýýüüüüüýýüüüüüüüüüüûüüüûüü
ü

 ÿ



æÿþr^  Ú__main__)OrL   rW  rR  Zjinja2r   r   rD  r   r   ZHAS_XBRr4  rX  Zautobahn.xbr._abir   r   r	   r
   r   r   r   r   r   r   r   r   Zautobahn.xbrr   r�   ra   rJ  r  Úpprintr   r[   r]   rí   rð   rë   ÚnumpyrÉ   rv   Zuse_twistedÚtwisted.internetr   Ztwisted.internet.deferr   Ztwisted.internet.threadsr   Ztwisted.internet.errorr   Zautobahn.twisted.wampr   r   Zautobahn.wamp.serializerr   Zautobahn.wampr   Zautobahn.wamp.exceptionr   r   r   r    r!   r"   r#   r$   r%   r&   Zautobahn.xbr._configr'   Zautobahn.utilr(   r)   r*   rM  r9   r5  r^  r/  rW   rW   rW   rX   Ú<module>   s~   
         ü     ]  
