o
    èó·i*Í  ã                   @   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	s0e
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 g d¢ZJG dd„ de3ƒZKdd„ ZLdd„ ZMeNd k�r
eMƒ  dS 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d0dd„ƒZedd„ ƒZ		d1d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 )2ÚClientz
tls-uniqueNc                 C   sö   t  | |¡ d| _d| _|j dd ¡}|r?|jr?t|jƒtkr&t	|jƒdks(J ‚|j| _
tj | j
¡| _| jjd| jjd� nt d¡| _
tj | j
¡| _| j d¡ |rd|jrd|  |¡ | 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ÚlenZ
_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;   © rV   úWC:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\autobahn/xbr/_cli.pyr>   `   s*   
 


zClient.__init__c                 C   sž   t |jƒtksJ d t |jƒ¡ƒ‚t|jƒdks"J 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   rM   rE   ÚformatrF   rO   Úeth_keysÚkeysZ
PrivateKeyrP   Úweb3ÚWeb3ÚtoChecksumAddressr=   Úto_canonical_addressrQ   ÚbinasciiÚa2b_hexrR   rI   rJ   )rT   r;   rV   rV   rW   rN      s"   ÿÿÿÿÿzClient.set_ethkey_from_profilec                 C   s~   | j jdkr*| j ¡ d d | jdœ}| jjdt| j jƒd� | j| j jdg|d� d S | 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) ..)	rU   rd   rH   r=   ÚCHANNEL_BINDINGrI   rJ   r)   Újoin)rT   re   rV   rV   rW   Ú	onConnect�   s   ü
ÿ
ÿzClient.onConnectc                 C   sB   |j dkr| jj|| jjj | jd ¡| jd�}|S td 	|j ¡ƒ‚)Nr   )Ú
channel_idZchannel_id_typez*unable to process authentication method {})
ÚmethodrH   Zsign_challengeÚ	transportZtransport_detailsri   rB   rf   ÚRuntimeErrorrY   )rT   rc   Zsigned_challengerV   rV   rW   ÚonChallenge    s   
þzClient.onChallengec              
   Ã   sú   �| j jdt|jƒt|jƒt|jƒt|jƒ|d� d| jjv r+t	 
| jjd | |f¡ d| jjv r{zDz|jdkrA|  |¡I d H  n|  |¡I d H  W n tyg } z| j  ¡  || jjd< W Y d }~nd }~ww W |  ¡  d S W |  ¡  d S |  ¡  w d S )NzbOk, client joined on realm "{realm}" [session={session}, authid="{authid}", authrole="{authrole}"])rd   ÚsessionÚauthidÚauthroleÚdetailsÚreadyÚcommandrb   Úerror)rI   rJ   r)   rd   rn   ro   rp   rU   rA   ÚtxaioÚresolveÚ_do_xbrnetwork_realmÚ_do_market_realmÚ	ExceptionÚfailureÚleave)rT   rq   ÚerV   rV   rW   ÚonJoin©   s6   €ú
€
€þ€þözClient.onJoinc                 C   sX   | j jdt|jƒd� d| _|jdkr&| jr(| jjr*| jj ¡  |  ¡  d S d S d S d S )Nz%Client left realm (reason="{reason}"))ÚreasonFzwamp.close.normal)	rI   rJ   r*   r~   rS   rU   ÚrunnerÚstopZ
disconnect)rT   rq   rV   rV   rW   ÚonLeaveÀ   s   
üzClient.onLeavec                 C   s0   | j  d¡ zt ¡  W d S  ty   Y d S w )NzClient disconnected)rI   rJ   r   r€   r   )rT   rV   rV   rW   ÚonDisconnectÊ   s   ÿzClient.onDisconnectc                 Ã   sä  �| j jd }|jdkra| j d¡ |dv sJ ‚|dkr'|  | j¡I d H  d S |dkrB| j jd }| j jd }|  ||¡I d H  d S |d	kr]| j jd
 }| j jd }|  ||¡I d H  d S J dƒ‚t	 
|jdd … ¡}|dv sqJ ‚|dkr€|  | j¡I d H  d S |dkr•| j jd }|  ||¡I d H  d S |dkrÏd| j jv r¬| j jd r¬| j jd }nd }d| j jv rÁ| j jd rÁ| j jd }	n| j}	|  ||	¡I d H  d S |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  d S |dk�r4| j jd
 }| j jd }|  |||¡I d H  d S |dk�rQ| j jd }| j jd }|  |||¡I d H  d S |d k�rn| j jd
 }| j jd }|  |||¡I d H  d S J dƒ‚)!Nrs   Z	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   )rU   rA   rp   rI   rJ   Ú_do_get_memberrR   Ú_do_onboard_memberÚ_do_onboard_member_verifyÚuuidÚUUIDro   Ú_do_get_marketÚ_do_get_actorÚ_do_create_marketÚ_do_create_market_verifyÚ_do_join_marketÚ_do_join_market_verify)rT   rq   rs   rƒ   r„   Úvaction_oidÚvaction_codeÚ
member_oidÚ
market_oidrŠ   r‹   rŒ   r�   rŽ   r•   r–   r‘   r—   rV   rV   rW   rw   Ñ   st   €

ý


zClient._do_xbrnetwork_realmc           
      Ã   s4  �| j jd }d|j|j|jdœ}t|ƒ| _t | j¡ | j jd }|dv s(J ‚|dkrb| j jd }| j jd }| j jd	 }|t	j
krN|  ||¡I d H  d S |t	jkr^|  ||¡I d H  d S J dƒ‚|dkr–| j jd }| j jd put ¡ }| j jd	 }| j jd }| j jd }	|  |||||	¡I d H  d S J dƒ‚)Nr;   Zinfura)rD   ÚnetworkÚkeyÚsecretrs   )r6   r5   r5   r‰   ÚdelegateÚchannel_typeFr‡   r6   ÚchannelÚamount)rU   rA   Zinfura_networkZ
infura_keyZinfura_secretr!   Ú_w3r   ZsetProviderr&   ÚPAYMENTÚ_do_get_active_payment_channelÚPAYINGÚ_do_get_active_paying_channelr›   Úuuid4Ú_do_open_channel)
rT   rq   r;   Zblockchain_gatewayrs   r¦   rª   r«   Úchannel_oidr­   rV   rV   rW   rx     s8   €ü


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   rX   é   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   rI   rJ   r*   r)   Úwarnr`   Úb2a_hexÚdecode)rT   rÄ   Ú	is_memberÚmember_datarÃ   ZMEMBER_LEVEL_TO_STRrV   rV   rW   r˜   D  s4   €""ö


ý
ÿzClient._do_get_memberc                 Ã   sD  �|   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 rºt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}qm| j 	d¡ d S d S | 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‰   ÚsecurityÚ	signatureÚ0xÚtidr—   ÚPROVIDERÚCONSUMERÚPROVIDER_CONSUMER)r   rX   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   rI   rJ   r)   r*   rE   rÉ   rÊ   r`   rÌ   rÍ   rB   r   rË   )rT   r¦   Z	actor_adrrÎ   rŠ   Z	actor_oidZactor_levelZactor_balance_ethZactor_balance_xbrÚmarket_oidsÚresultr—   ZACTOR_TYPE_TO_STRrV   rV   rW   rž   g  sj   €û
ÿÿÿÿ&úÿêä
ÿ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 n0 tyž } z| jjd|d� |  dt|ƒ¡ W Y d }~d S d }~w ty« } z|‚d }~ww t|ƒtks´J ‚d|v rÆt|d ƒtkrÆ|d dksÈJ ‚d|v rÒ|d dksÔJ ‚d|v rèt|d ƒtkrèt|d ƒdksêJ ‚tj|d d�}| jjd|d� |S )NZmetamaskúxbr.network.get_configúxbr.network.get_statusÚverifying_chain_idÚverifying_contract_adrrX   ÚblockÚnumberÚeulaÚhash)Úmember_usernameÚmember_emailÚclient_pubkeyÚwallet_typeúsha2-256zxbr.network.onboard_memberúApplicationError: {error}©rt   z
wamp.errorrÐ   r   ÚactionZonboard_memberr£   é   rº   z9On-boarding member - verification "{vaction_oid}" created©r£   ) r`   ra   rH   r=   rP   rO   r_   rÇ   Úcbor2ÚdumpsÚhashlibÚsha256ÚupdateÚ	multihashÚto_b58_stringÚencodeÚdigestr"   r   rI   rt   r{   Ústrry   rD   ÚdictÚintrE   rF   r›   rœ   rJ   )rT   râ   rã   Zmember_passwordrä   rå   Z
wallet_keyZ
wallet_rawZ
wallet_adrrU   ÚstatusÚverifyingChainÚverifyingContractZ
registeredrà   Zprofile_objZprofile_dataÚhr;   rÒ   rÙ   r|   r£   rV   rV   rW   r™   ž  s\   €
ü

ÿ

ý€€ÿ(,zClient._do_onboard_memberc              
   c   sü   � | j jd||d� z|  d|j|¡V }W n ty+ } z
| j jd|d� |‚d }~ww t|ƒtks4J ‚d|v rHt|d ƒtkrHt|d ƒdksJJ ‚d|v r\t|d ƒt	kr\|d d	ks^J ‚|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ý   )rI   rJ   rÇ   rE   r   rt   rD   rö   rF   r÷   r)   r›   rœ   r*   r`   rÌ   rÍ   )rT   r£   r¤   rÙ   r|   r¥   rV   rV   rW   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J ‚d|v �rt|d ƒtk�r|d dk�sJ ‚d|v �r$|d dk�s&J ‚d|v �r=t|d ƒtk�r=t|d ƒd k�s?J ‚tj|d d!�}| jjd"|d#� d S )$Núxbr.network.get_memberr¸   rÚ   rÜ   rÝ   rX   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   r`   ra   rF   rI   rJ   rY   ÚrandomÚrandintró   rî   rï   rð   rõ   rñ   rò   rô   rì   rí   r#   rO   r   r   rD   rö   r÷   r›   rœ   )rT   r¥   r¦   r‹   r’   r“   r”   r•   r–   r‘   rÏ   rÄ   rU   rù   rú   Zcoin_adrrø   r  Úresr  r  Z
terms_datarû   Z
terms_hashÚmeta_objÚ	meta_dataÚ	meta_hashrÒ   Ú
attributesr  r£   rV   rV   rW   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s'J ‚d|v r;t|d ƒtkr;t|d ƒdks=J ‚d|v rOt|d ƒtkrO|d d	ksQJ ‚|d }| j jd
t	j
|d�t|ƒd� |  d¡I d H }| j jdt|ƒd� t|ƒ}| j jd|d� ||v s”J d t	j
|d�t|ƒ¡ƒ‚|  d|j¡I d H }| j jdt|ƒd� t|ƒ}| j jd|d� ||v sÆJ 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)Úinclude_attributesz*SUCCESS: got market information

{market}
)r‰   )rI   rJ   rÇ   rE   r   rD   rö   rF   r÷   r›   rœ   rY   )
rT   r¥   r£   r¤   r  r¦   rØ   r  Zcnt_market_by_owner_afterr‰   rV   rV   rW   r    Q  sl   €ÿ

ÿÿ
ÿÿÿÿÿ
ÿÿ
ÿÿÿÿÿýzClient._do_create_market_verifyc                 Ã   s
  �|   d|j¡I d H }|d }|   d|j¡I d H }|ry|d |kr(| 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� d S | 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º   ÚmakerZcoinrÐ   r¿   z+Market {market_oid} information:

{market}
)r¦   r‰   zNo market {market_oid} found!r  )rÇ   rE   rI   rJ   r)   r\   r]   r^   r›   rœ   rÉ   rÊ   r   rË   )rT   r¥   r¦   rÏ   rÄ   r‰   rV   rV   rW   r�   ~  s"   € 
ÿzClient._do_get_marketc                 Ã   s  �|t jt jt jfv sJ ‚|  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Ý   rX   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×   rÇ   rE   r`   ra   rì   rí   rî   rï   rð   rñ   rò   ró   rô   r$   rO   r›   rœ   rI   rJ   )rT   r¥   r¦   r—   rÏ   rÄ   rU   rù   rú   rø   r  r  r  rû   r  rÒ   Zrequest_submittedr£   rV   rV   rW   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   rI   rJ   )rT   r¥   r£   r¤   Zrequest_verifiedr¦   r—   rV   rV   rW   r¢   ²  s   €
þzClient._do_join_market_verifyc                 Ã   ó°   �|   d|¡I d H }| jjdt|ƒd� |rP| 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� d S | 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Ç   rI   Údebugr   rJ   r÷   r   ©rT   r¦   Zdelegate_adrr¬   r»   rV   rV   rW   r°   º  ó   €ÿ
ÿz%Client._do_get_active_payment_channelc                 Ã   r  )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#  rV   rV   rW   r²   Ç  r$  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rU|}t	j
j}n|tjkra|	}t	j
j}nJ dƒ‚zt| j|||ƒI d H }| jjd|d� W n ty� } z| j ¡  |‚d }~ww t||||||j|j|||	|
|ƒ}d }|  d||j|j||||||	|
t|ƒ||¡I d H }| jjdt|ƒd� d S )Nzxbr.marketmaker.get_configr‹   rX   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)rO   rP   r=   r_   rÇ   r`   ra   r&   r¯   r   Z
xbrchannelr¸   r±   r   Ú_send_AllowancerI   rJ   ry   rz   r    rE   r   r   )rT   r¦   rµ   r«   rª   r­   Z
member_keyrÄ   rU   r‹   Z	recipientrÜ   rÝ   rø   Zcurrent_block_numberÚfrom_adrÚto_adrr%  r|   rÒ   r  r&  rV   rV   rW   r´   Ô  sN   €




€þ


þ


ý
ÿ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toWeirQ   r¼   ZgetTransactionCountrI   rJ   r(   r'  r   rÿ   Z	functionsZapproveZbuildTransactionr@   ÚaccountZsign_transactionrO   r*   r`   rÌ   ZrawTransactionrÍ   ZsendRawTransactionrE   )
rT   r(  r)  r­   r/  r0  r-  r1  r2  r%  rV   rV   rW   r'    sD   þûýýýzClient._send_Allowance)N)NNNr   r   r   )Ú__name__Ú
__module__Ú__qualname__rf   r>   rN   rh   rm   r}   r�   r‚   rw   rx   r˜   rž   r   r™   rš   rŸ   r    r�   r¡   r¢   r°   r²   r´   r'  rV   rV   rV   rW   r9   [   s8    
	
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: {}])ÚprintrY   r*   r   r)   r   r   r   r   r	   r   r
   r   r   r   r   r   rV   rV   rV   rW   Úprint_version3  s   r:  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�r5tƒ  d S |jd`k�rzt|jda�}| |j¡ t|jƒt|jƒ t|jƒ }tdb t|ƒtt|jƒƒtt|jƒƒtt|jƒƒ¡ƒ tƒ  | ¡  d S |jdck�rÀt|jda�}| |j¡ t|jddde�ƒ t dfdg¡}t |dhdidj�}t!|dddddk�}t"j# $|j%¡�s¶t" &|j%¡ | '||j%d¡ d S |jd u �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� i dx|“d|j“d.|j.“d1|j/“d(|j8“d+|j9“d4|j:�r8t; <|j:¡nd “d7|j=“d:|j>“d=|j?“dy|j@�pLdn“dz|jA�pSdn“dE|jB�pZdn“dG|jC�rjtD E|jCd{d … ¡nd “dJ|jF“dN|jG“dQ|jH�rt; <|jH¡nd “|jI�r‹t; <|jI¡nd |jJ|jK�rœtD E|jKd{d … ¡nd |jL�p¢dnd|œ¥}
tM|jN|jO|
tPƒ gd}�}z!|	j4d~t|jNƒ|jO�rÇdt|jOƒ d€ ndAd�� |jQtRdid‚� W n tS�yð } zt|ƒ t) *dƒ¡ W Y d }~d S d }~ww t) *dn¡ d S )„Nrs   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").)rB  rD   Údefaultr?  z--realmrd   rb   z*The realm to join (default: "xbrnetwork").z--ethkeyrM   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•   r7  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)rB  rD   r<  rH  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   )rC  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À   rJ   zXBR CLI {version}r8  )r+   z$Profile {profile} loaded from {path})r;   Úpathr;   r�   r�   rX   )r¬   r«   rª   r­   )rG  rd   rA   Zserializersz Connecting to "{url}" {realm} ..z
at realm "ú")rG  rd   )Zauto_reconnectr   )TÚargparseÚArgumentParserÚadd_argumentrõ   Ú	_COMMANDSrY   r÷   Úsortedr%   rÖ   rÕ   r×   r&   r±   r¯   Ú
parse_argsrs   r:  r   rC  ÚloadrA  rF   ÚobjsÚenumsZservicesr9  r*   Zprint_summaryÚsummaryÚpkg_resourcesÚresource_filenamer   r   rK   rM  ÚisdirÚoutputÚmkdirÚrenderrg   ÚsysÚexitr'   rG  rd   rƒ   r„   r"  ru   Zstart_loggingZmake_loggerrJ   r)   r   ÚnamerM   rC   r‰   r›   rœ   rŒ   r�   rŽ   r•   r–   r‘   r‹   r`   ra   r—   r†   r…   r¬   r«   rª   r­   r   Znetwork_urlZnetwork_realmr   Úrunr9   ry   )ÚparserZ
_LANGUAGESÚargsÚrepoZtotal_countZ	templatesrL  Úenvr;   rI   rA   r   r|   rV   rV   rW   Ú_mainA  sþ  ûýýüüüüüýýüüüüüüüüüüûüüüûüü
ü

ÿþûúù	÷
öôóòñðïî íìëê
æÿþ€þrg  Ú__main__)OrK   r_  rY  Zjinja2r   r   rI  r   r   ZHAS_XBRr9  r`  Zautobahn.xbr._abir   r   r	   r
   r   r   r   r   r   r   r   r   Zautobahn.xbrr   r›   r`   rO  r  Úpprintr   rZ   r\   rî   rñ   rì   ZnumpyrÉ   ru   Zuse_twistedZ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*   rR  r9   r:  rg  r4  rV   rV   rV   rW   Ú<module>   sj   
       ]  

ÿ