
    af	m                         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d dlmZ d dlmZ ddlmZmZ d dlZddlmZmZ dd	lmZmZ  G d
 de          Z G d de          ZdS )    N)pformat)ApplicationError)ApplicationSession   )unpack_uint256pack_uint256   )hlhlval)sign_eip712_channel_closerecover_eip712_channel_closec                        e Zd Zd Zd Zd ZdS )Transactionc	                 v    || _         || _        || _        || _        || _        || _        || _        || _        d S Nchanneldelegatepubkeykey_idchannel_seqamountbalance	signature)	selfr   r   r   r   r   r   r   r   s	            E/var/www/html/env/lib/python3.11/site-packages/autobahn/xbr/_buyer.py__init__zTransaction.__init__3   s?     &"    c           	      l    | j         | j        | j        | j        | j        | j        | j        | j        d}|S )Nr   r   )r   ress     r   marshalzTransaction.marshal=   s>    |kk+k|	
 	
 
r   c                 D    t          |                                           S r   )r   r!   r   s    r   __str__zTransaction.__str__J   s    t||~~&&&r   N)__name__
__module____qualname__r   r!   r$    r   r   r   r   1   sA        # # #  ' ' ' ' 'r   r   c                   j    e Zd ZdZdZd Zd Zd Zd ZddZ	ddZ
d	 Zd
 Zd ZddZd Zd Zd ZdS )SimpleBuyerz
    Simple XBR buyer component. This component can be used by a XBR buyer delegate to
    handle the automated buying of data encryption keys from the XBR market maker.
    Nc                 F   t          |          t          k    rt          |          dk    sJ d                    |                      t          |          t          k    rt          |          dk    sJ d                    |                      t          |          t          k    r|dk    sJ t          j                    | _        || _        d| _	        || _
        t          j                            |          | _        d| _        | j        j                                        | _        d| _        t(          j        j                                        | _        || _        d| _        d| _        d| _        i | _        d| _        d| _        d| _        i | _         g | _!        dS )	a  

        :param market_maker_adr:
        :type market_maker_adr:

        :param buyer_key: Consumer delegate (buyer) private Ethereum key.
        :type buyer_key: bytes

        :param max_price: Maximum price we are willing to buy per key.
        :type max_price: int
           z0market_maker_adr must be bytes[20], but got "{}"    z.buyer delegate must be bytes[32], but got "{}"r   NFT)"typebyteslenformatinttxaiomake_loggerlog_market_maker_adr_xbrmm_config	_pkey_raweth_keyskeys
PrivateKey_pkey_acct
public_keyto_canonical_address_addr_caddrnaclpublicgenerate_receive_key
_max_price_channel_balance_seq_keys_session_running_auto_close_channel_transaction_idx_transactions)r   market_maker_adr	buyer_key	max_prices       r   r   zSimpleBuyer.__init__U   s    $%%..37G3H3HB3N3N3N  QC  QJ  QJ  K[  Q\  Q\3N3NNI%''C	NNb,@,@,@BrByBy  {D  CE  CE,@,@@I#%%)a---7$&& "2! # ]--i88

 
 Z*??AA

  !K2;;== $   	 
 $(  !#r   c           	      >  K   t          |t                    sJ t          |          t          k    sJ | j        rJ || _        d| _        | j                            dt          | j	                  t          j        | j        j        dd                                                              	 |                    d           d{V | _        t          | j                  t$          k    rt'          | j                  dk    sJ |                    d| j                   d{V | _        | j        st+          d	          | j        d
         }t          |          t$          k    rt'          |          dk    sJ t-          j        |          | _        |                    d| j        j                   d{V }n#  |                                  xY wt          |d                   t$          k    rt5          |d                   |d<   |d         dk    st+          d          |d         | _        |d         | _        | j                            dt          | j                  t=          | j                  t=          | j                             | j        S )a  
        Start buying keys to decrypt XBR data by calling ``unwrap()``.

        :param session: WAMP session over which to communicate with the XBR market maker.
        :type session: :class:`autobahn.wamp.protocol.ApplicationSession`

        :param consumer_id: XBR consumer ID.
        :type consumer_id: str

        :return: Current remaining balance in payment channel.
        :rtype: int
        TzSStart buying from consumer delegate address {address} (public key 0x{public_key}..)N
   )addressr>   zxbr.marketmaker.get_configr,   z*xbr.marketmaker.get_active_payment_channelzno active payment channel foundchannel_oid   r/   +xbr.marketmaker.get_payment_channel_balance	remainingr   z1no off-chain balance remaining on payment channelseqzvOk, buyer delegate started [active payment channel {channel_oid} with remaining balance {remaining} at sequence {seq}])rV   rZ   r[   )
isinstancer   r.   strrL   rK   r5   debugr
   rA   binasciib2a_hexr<   r>   decodecallr7   r@   r/   r0   rG   	ExceptionuuidUUID_channel_oidleaver   rH   rI   infor   )r   sessionconsumer_idrV   payment_balances        r   startzSimpleBuyer.start   s      '#566666K  C''''=   l!$+"*"24:3H"3M"N"N"U"U"W"W 	 	Y 	Y 	Y	'.||4P'Q'Q!Q!Q!Q!Q!Q!QD 
##u,,TZB1F1F1FF"),,/[]a]g"h"hhhhhhhDM= C ABBB-6K$$--#k2B2Bb2H2H2HH $	 < < <D %,LL1^`d`q`w$x$xxxxxxxOO	MMOOO ,--66+9/+:V+W+WOK({+a//OPPP'4#E*	  O"$T%6"7"75CWCW]bcgcl]m]m 	 	o 	o 	o }s   1DF? ?Gc                 ^   K   | j         sJ d| _         | j                            d           dS )z#
        Stop buying keys.
        FzOk, buyer delegate stopped.N)rL   r5   rh   r#   s    r   stopzSimpleBuyer.stop   s7       }}344444r   c                    K   | j         r| j                                         sJ | j                             d| j        d                    d{V }|S )a  
        Return current balance of payment channel:

        * ``amount``: The initial amount with which the payment channel was opened.
        * ``remaining``: The remaining amount of XBR in the payment channel that can be spent.
        * ``inflight``: The amount of XBR allocated to buy transactions that are currently processed.

        :return: Current payment balance.
        :rtype: dict
        rY   rV   N)rK   is_attachedrb   rG   )r   rk   s     r   r   zSimpleBuyer.balance   sc       }<!:!:!<!<<<< $ 2 23`bfbop}b~  r   c                    K   | j         r| j                                         sJ t          j        d          }| j                             d|| j        ||           d{V }|d         |d         |d         d}|S )z

        :param amount:
        :type amount:

        :param details:
        :type details:

        :return:
        :rtype:
        @   z$xbr.marketmaker.open_payment_channelNr   rZ   inflight)r   rZ   rs   )rK   rp   osurandomrb   r@   )r   
buyer_addrr   detailsr   payment_channelr   s          r   open_channelzSimpleBuyer.open_channel   s       }<!:!:!<!<<<< JrNN	 $ 2 23Y3=37:393<	!> !> > > > > > > &h/(5'
3
 
 r   c                 
   K   dS )z[
        Requests to close the currently active payment channel.

        :return:
        Nr(   )r   rw   s     r   close_channelzSimpleBuyer.close_channel  s
        r   c                 0  K   t          |          t          k    rt          |          dk    sJ t          |          t          k    r|dv sJ t          |          t          k    sJ | j        d         }| j        d         }d}| j        d         }t          j        | j        d         dd	                   }|| j        v r>| j	        
                    d
t          t          j        |                               n| j	        
                    dt          t          j        |                               d| j        |<   | j                            d|           d	{V }	t!          |	d                   }
| j	        
                    dt          t          j        |                    t          t#          |
dz                                 |
| j        k    rht'          dd                    | j        j        t          j        |          t#          |
dz            t#          | j        dz                                | j        |
z
  }|dk     r| j        rd	}|                                 }|r|d         }|r| j        }| j        }d}t7          | j        ||||||||	  	        }| j	        
                    dt          j        |          |t#          |dz            |           | j                            d||||t;          |          |||	  	         d	{V  t'          dd                    | j        j        t          j        |          |t#          |dz                                t'          dd                    | j        j        t          j        |          t#          | j        dz            t#          |
dz                                | j        j                             tB          j"        j#                  }| j        dz   }d}t7          | j        ||||||||	  	        }| $                    || j%        ||||
||           	 | j                            d | j%        ||||t;          |
          t;          |          |	  	         d	{V }n# t&          $ r&}|j&        dk    r| '                                 |d	}~wtP          $ rD}| j	        &                    d!           | j	        )                                 || j        |<   |d	}~ww xY w|d"         }|d#         }t!          |d$                   }t!          |d%                   }t!          |d&                   }tU          |||||||d|	  	        }|| j+        k    r| j	        ,                    d'| j        j        t          t          j-        |          .                                          t          t          j-        | j+                  .                                          (           t'          d)d*                    | j        j                            | j        dz   |k    r:t'          d+d,                    | j        j        | j        |d#                             | j        |
z
  |k    r=t'          d+d-                    | j        j        | j        |
z
  |d%                             || _        || _        | /                    || j+        ||||||           |d.         }tB          j0        1                    | j                  }	 |2                    |          }nT# tB          j3        j4        $ r=}|| j        |<   t'          d/d0                    | j        j        |                    d	}~ww xY wtB          j5        6                    |          | j        |<   | 7                                } | j	        8                    d1| j        j        t          d2d34          t          t          j        |                    t          t          t#          |dz                      d5z   d34          t          t          j-        |d6                   .                                          t          t#          |dz                      t          t#          |dz                      t          t          j-        |          .                                          | 7
  
         d}!| j        |         du rz|!d8z  rL| j	        
                    d9| j        j        t          t          j        |                    :           |!dz  }!ts          j:        d;           d	{V  | j        |         du ztw          | j        |         tP                    r| j        |         }|	 | j        |         2                    |          }"nJ# tB          j3        j4        $ r3}t'          d/d<                    | j        j        |                    d	}~ww xY w	 ty          j=        |"          }#nJ# tx          j>        j?        $ r3}t'          d=d>                    | j        j        |                    d	}~ww xY w|#S )?aO  
        Decrypt XBR data. This functions will potentially make the buyer call the
        XBR market maker to buy data encryption keys from the XBR provider.

        :param key_id: ID of the data encryption used for decryption
            of application payload.
        :type key_id: bytes

        :param serializer: Application payload serializer.
        :type serializer: str

        :param ciphertext: Ciphertext of encrypted application payload to
            decrypt.
        :type ciphertext: bytes

        :return: Decrypted application payload.
        :rtype: object
        rW   )cbor
market_oidrV   r   verifying_chain_idverifying_contract_adrr	   Nz>Key {key_id} already in key store (or currently being bought).rX   )r   z1Key {key_id} not yet in key store - buying key ..Fzxbr.marketmaker.get_quotepricez-Key {key_id} has current price quote {amount}l     NZo)r   r   zxbr.error.max_price_exceededzR{}.unwrap() - key {} needed cannot be bought: price {} exceeds maximum price of {}r   Tzauto-closing payment channel {channel_oid} [close_seq={close_seq}, close_balance={close_balance}, close_is_final={close_is_final}])rV   	close_seqclose_balanceclose_is_finalzxbr.marketmaker.close_channelzxbr.error.channel_closedzu{}.unwrap() - key {} cannot be bought: payment channel {} ran empty and we initiated close at remaining balance of {}zxbr.error.insufficient_balancez_{}.unwrap() - key {} cannot be bought: insufficient balance {} in payment channel for amount {})encoderzxbr.marketmaker.buy_keyz8Encountered error while calling market maker to buy key!r   r   amount_paidrZ   rs   zv{klass}.unwrap()::XBRSIG[8/8] - EIP712 signature invalid: signer_address={signer_address}, delegate_adr={delegate_adr})klasssigner_addressdelegate_adrzxbr.error.invalid_signaturezQ{}.unwrap()::XBRSIG[8/8] - EIP712 signature invalid or not signed by market makerzxbr.error.invalid_transactionz^{}.buy_key(): invalid transaction (channel sequence number mismatch - expected {}, but got {})z_{}.buy_key(): invalid transaction (channel remaining amount mismatch - expected {}, but got {})
sealed_keyzxbr.error.decryption_failedz6{}.unwrap() - could not unseal data encryption key: {}z{klass}.unwrap() - {tx_type} key {key_id} bought for {amount_paid} [payment_channel={payment_channel}, remaining={remaining}, inflight={inflight}, buyer_pubkey={buyer_pubkey}, transactions={transactions}]z
XBR BUY   magenta)colorz XBRrx   )	r   tx_typer   r   rx   rZ   rs   buyer_pubkeytransactionsd   zG{klass}.unwrap() - waiting for key "{key_id}" currently being bought ..)r   r   g?z1{}.unwrap() - failed to unwrap encrypted data: {}z xbr.error.deserialization_failedz;{}.unwrap() - failed to deserialize application payload: {})@r.   r/   r0   r]   rG   r7   r_   a2b_hexrJ   r5   r^   r
   rd   re   rK   rb   r   r2   rF   r   r1   	__class__r%   rH   rM   past_transactionsrI   r   r8   r   rE   r>   encoderB   encoding
RawEncoder_save_transaction_phase1r@   errorrn   rc   failurer   r6   warnr`   ra   _save_transaction_phase2rC   	SealedBoxdecrypt
exceptionsCryptoErrorsecret	SecretBoxcount_transactionsrh   r3   sleepr\   cbor2loadsdecoderCBORDecodeError)$r   r   
serializer
ciphertextr~   rV   current_block_numberr   r   quoter   r   last_txtxnsr   r   r   r   r   r   is_finalreceiptemarketmaker_signaturemarketmaker_channel_seqmarketmaker_amount_paidmarketmaker_remainingmarketmaker_inflightr   r   
unseal_boxkeytransactions_countlog_countermessagepayloads$                                       r   unwrapzSimpleBuyer.unwrap  s     & F||u$$V):):)::J3&&:+A+A+AAJ5((((]<0
mM2  !!/0DE!)!1$2DE]2^_`_a_a2b!c!c TZHNN["$TYV%<%<%<"="=  ? ? ? ? HNNNWYZ^ZcjpZqZqZqWrWrNsss "'DJv -,,-H&QQQQQQQQE $E'N33FHNNJ"$TYV%<%<%<"="=bVV\_I]I]F^F^  ` ` ` ''&'E'{  (C  (C  DH  DR  D[  ]a  ]f  ms  ]t  ]t  ]t  vy  z@  CK  zK  vL  vL  NQ  RV  Ra  dl  Rl  Nm  Nm  (n  (no o o mf,G{{+ 4N"G1133D *"&q' -N %)I	(,)-$=dn>P>T>R>H>I>G>K>L%N %N	   (l379;3O3O3O1:589O5P5P6D	 ' F F F #m001P1<1C1E1G1=m1L1L1:1?1:< < < < < < < < < //I 0g  0n  0n  os  o}  oF os  ox  E  oF  oF  oF oz or  s@  CK  sK  oL  oL0M 0MN N N
 ''G (I  (P  (P  QU  Q_  Qh QU  QZ  ag  Qh  Qh  Qh QT  UY  Ub  em  Um  Qn  Qn QT  U[  ^f  Uf  Qg  Qg(h (hi i i  ,7>>t}G_>``L)a-KH 2$.BTVl2F
T_al298E EI
 ))+tz<QWYdflnu  xA  B  B  B $ 2 23L37:3?393>3>3?3G3G3?3H3H3<!> !> > > > > > > $   7888IIKKK   YZZZ  """%&
6"	 %,K$8!&-m&<#&4W]5K&L&L#$27;3G$H$H!#1'*2E#F#F 9:LNd:NPZ\g:QSh:?AVX XN !777  W$(N$;-/0@0P0P0W0W0Y0Y-Z-Z+-h.>t?U.V.V.].]._._+`+`  b b b ''D'z  (B  (B  CG  CQ  CZ  ([  ([\ \ \ y1} 777&'F (H  (O  (O  PT  P^  Pg  im  ir  t{  |I  tJ  (K  (KL L L }v%)>>>&'F (I  (P  (P  QU  Q_  Qh  jn  jw  z@  j@  BI  JU  BV  (W  (WX X X 0DI1DM ))+t7M|]ce|*ACXZoq q q !.J..t/@AAJc ((44?. c c c%&
6"&'DF~  GF  GF  GK  GU  G^  `a  Gb  Gb  c  c  cc
 "&!6!6s!;!;DJv!%!8!8!:!:HMM _n-<y999$)&11122s3'>'I#J#JKKfT\efff "8#3G<M4N#O#O#V#V#X#X Y YS!6!ABBCCC 4x ?@@AA 0 > > E E G GHH/  
1 
1 
1 j E))S  !h%)^%<R	X^H_H_H_E`E`  b b bq +b//!!!!!!! j E)) dj()44 	
6"AG	Zj(00<<GG* 	Z 	Z 	Z"#@BuB|B|  ~B  ~L  ~U  WX  CY  CY  Z  Z  Z	Z	ik'**GG}, 	i 	i 	i"#E  HE  HL  HL  MQ  M[  Md  fg  Hh  Hh  i  i  i	i sm   AR" "
T,!ST?TT=] ^$'8^^$ g, ,h3 .h..h37i j .jjc	           
          || j         v r4t          d                    t          j        |                              t          ||||||||          }	t          | j                  }
| j                            |	dg           |
| j         |<   dS )

        :param channel_oid:
        :param delegate_adr:
        :param buyer_pubkey:
        :param key_id:
        :param channel_seq:
        :param amount:
        :param balance:
        :param signature:
        :return:
        z;save_transaction_phase1: duplicate transaction for key 0x{}N)	rN   RuntimeErrorr1   r_   r`   r   r0   rO   append)r   rV   r   r   r   r   r   r   r   tx1key_idxs              r   r   z$SimpleBuyer._save_transaction_phase1  s     T***\ccdldtu{d|d|}}~~~+|\6;X^`girssd())!!3+...(/f%%%r   c	           
         || j         vr4t          d                    t          j        |                              | j         |         }	| j        |	         d         r4t          d                    t          j        |                              | j        |	         d         }
t          ||||||||          }|
j        |j        k    sJ |
j        |j        k    sJ |
j	        |j	        k    sJ |
j
        |j
        k    sJ |
j        |j        k    sJ |
j        |j        k    sJ |
j        |j        k    sJ || j        |	         d<   dS )r   z;save_transaction_phase2: transaction for key 0x{} not foundr   z;save_transaction_phase2: duplicate transaction for key 0x{}r   N)rN   r   r1   r_   r`   rO   r   r   r   r   r   r   r   r   )r   rV   r   r   r   r   r   r   r   r   r   tx2s               r   r   z$SimpleBuyer._save_transaction_phase2  sq    ...\ccdldtu{d|d|}}~~~'/g&q) 	pMTTU]UeflUmUmnnp p p  )!,+|\6;X^`girss{ck))))zSZ''''zSZ''''#/1111zSZ''''{ck)))) }----),7#A&&&r   Tr   c                 B   t          |          t          k    sJ t          |          t          k    r|dk    sJ d}g }||k     rZt          | j                  |k    r;| j        |          }|r|d         r"|d         r|                    |           |dz  }nn||k     Z|S )zQ

        :param filter_complete:
        :param limit:
        :return:
        r   r   )r.   boolr2   r0   rO   r   )r   filter_completelimitnr    txs         r   r   zSimpleBuyer.past_transactionsB  s     O$$,,,,E{{c!!eaiii/%ii4%&&**'+& 2a5 RU JJrNNNFA %ii 
r   c                 t    ddd}| j         D ]*\  }}|r|r|dxx         dz  cc<   |dxx         dz  cc<   +|S )z

        :return:
        r   )completependingr   r   r   )rO   )r   r    r   r   s       r   r   zSimpleBuyer.count_transactionsX  sr     
 
 * 	$ 	$HC $s $J1$I!#
r   c                 Z    | j                             |d          }|r| j        |         S dS )2

        :param key_id:
        :return:
        NrN   getrO   )r   r   idxs      r   get_transactionzSimpleBuyer.get_transactionh  s<     #''55 	+%c**	+ 	+r   c                 h    | j                             |d          }|r| j        |         \  }}|o|S dS )r   NFr   )r   r   r   r   r   s        r   is_completezSimpleBuyer.is_completer  sD     #''55 	)#.HC;3ur   r   )Tr   )r%   r&   r'   __doc__r5   r   rl   rn   r   ry   r{   r   r   r   r   r   r   r   r(   r   r   r*   r*   N   s         CC  C  C J8 8 8t5 5 5  "   >   o o ob0 0 0,$- $- $-L   ,   + + +
 
 
 
 
r   r*   )rd   r_   pprintr   rt   r   nacl.secretrB   
nacl.utilsnacl.exceptionsnacl.publicr3   autobahn.wamp.exceptionr   autobahn.wamp.protocolr   _utilr   r   r9   utilr
   r   _eip712_channel_closer   r   objectr   r*   r(   r   r   <module>r      sS  6         				                   4 4 4 4 4 4 5 5 5 5 5 5 / / / / / / / /          Z Z Z Z Z Z Z Z' ' ' ' '& ' ' ':n n n n n& n n n n nr   