
    Lf	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y)    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y)Transactionc	                 t    || _         || _        || _        || _        || _        || _        || _        || _        y Nchanneldelegatepubkeykey_idchannel_seqamountbalance	signature)	selfr   r   r   r   r   r   r   r   s	            N/var/www/cs2snipe.com/venv/lib/python3.12/site-packages/autobahn/xbr/_buyer.py__init__zTransaction.__init__3   s;     &"    c           	          | j                   | j                  | j                  | j                  | j                  | j
                  | j                  | j                  d}|S )Nr   r   )r   ress     r   marshalzTransaction.marshal=   sJ    ||kkkk++kk||	
 
r   c                 4    t        | j                               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   s    #'r   r   c                   h    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y)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                    t        |      t        k(  rt        |      dk(  sJ dj                  |             t        |      t        k(  rt        |      dk(  sJ dj                  |             t        |      t        k(  r|dkD  sJ t        j                         | _        || _        d| _	        || _
        t        j                  j                  |      | _        d| _        | j                  j                   j#                         | _        d| _        t(        j*                  j                  j-                         | _        || _        d| _        d| _        d| _        i | _        d| _        d| _        d| _        i | _         g | _!        y)	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    $%.37G3HB3N  	\  QC  QJ  QJ  K[  Q\  	\NI%'C	Nb,@  	EBrByBy  {D  CE  	E@I#%)a-77$$& "2! # ]]--i8

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

  !KK22;;= $   	 
 $(  !#r   c           	        K   t        |t              sJ t        |      t        k(  sJ | j                  rJ || _        d| _        | j                  j                  dt        | j                        t        j                  | j                  j                  dd       j                                	 |j                  d       d{   | _        t        | j"                        t$        k(  rt'        | j"                        dk(  sJ |j                  d| j"                         d{   | _        | j(                  st+        d	      | j(                  d
   }t        |      t$        k(  rt'        |      dk(  sJ t-        j.                  |      | _        |j                  d| j0                  j$                         d{   }t        |d         t$        k(  rt5        |d         |d<   |d   dkD  st+        d      |d   | _        |d   | _        | j                  j;                  dt        | j0                        t=        | j6                        t=        | j8                               | j6                  S 7 7 O7 #  |j3                           xY ww)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   s5     '#5666K C'''==  l!$++"*"2"24::3H3H"3M"N"U"U"W 	 	Y	'.||4P'Q!QD 

#u,TZZB1FFF"),,/[]a]g]g"hhDM== ABB--6K$-#k2Bb2HHH $		 <D %,LL1^`d`q`q`w`w$xxO ,-6+9/+:V+WOK({+a/OPP'4#E*	  O"$T%6%6"75CW]bcgclcl]m 	 	o }}? "R i y	MMOsW   B,J/I6 I.AI6 "I1#BI6 8I49I6 =B1J.I6 1I6 4I6 6J		Jc                 l   K   | j                   sJ d| _         | j                  j                  d       yw)z#
        Stop buying keys.
        FzOk, buyer delegate stopped.N)rL   r5   rh   r#   s    r   stopzSimpleBuyer.stop   s,      }}}34s   24c                    K   | j                   r| j                   j                         sJ | j                   j                  d| j                  d          d{   }|S 7 w)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   sW      }}!:!:!<<< $ 2 23`bfbobop}b~  @s   AA AA c                   K   | j                   r| j                   j                         sJ t        j                  d      }| j                   j	                  d|| j
                  ||       d{   }|d   |d   |d   d}|S 7 w)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      }}!:!:!<<< JJrN	 $ 2 23Y3=37::393<	!> > &h/(5'
3
 >s   A*B,B-Bc                    K   yw)z[
        Requests to close the currently active payment channel.

        :return:
        Nr(   )r   rw   s     r   close_channelzSimpleBuyer.close_channel  s     s   c                 f  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                  j                  d
t        t        j                  |                   n$| j                  j                  dt        t        j                  |                   d| j                  |<   | j                  j                  d|       d	{   }	t!        |	d         }
| j                  j                  dt        t        j                  |            t        t#        |
dz                     |
| j$                  kD  rht'        ddj)                  | j*                  j,                  t        j                  |      t#        |
dz        t#        | j$                  dz                    | j.                  |
z
  }|dk  r| j0                  rd	}| j3                         }|r|d   }|r| j4                  }| j.                  }d}t7        | j8                  ||||||||	      }| j                  j                  dt        j                  |      |t#        |dz        |       | j                  j                  d||||t;        |      |||	       d	{    t'        ddj)                  | j*                  j,                  t        j                  |      |t#        |dz                    t'        ddj)                  | j*                  j,                  t        j                  |      t#        | j.                  dz        t#        |
dz                    | j<                  j>                  jA                  tB        jD                  jF                        }| j4                  dz   }d}t7        | j8                  ||||||||	      }| jI                  || jJ                  ||||
||       	 | j                  j                  d | jJ                  ||||t;        |
      t;        |      |	       d	{   }|d"   }|d#   }t!        |d$         }t!        |d%         }t!        |d&         }tU        |||||||d|	      }|| jV                  k7  r| j                  jY                  d'| j*                  j,                  t        t        jZ                  |      j]                               t        t        jZ                  | jV                        j]                               (       t'        d)d*j)                  | j*                  j,                              | j4                  dz   |k7  r>t'        d+d,j)                  | j*                  j,                  | j4                  |d#               | j.                  |
z
  |k7  rAt'        d+d-j)                  | j*                  j,                  | j.                  |
z
  |d%               || _        || _        | j_                  || jV                  ||||||       |d.   }tB        j`                  jc                  | j<                        }	 |je                  |      }tB        jj                  jm                  |      | j                  |<   | jo                         } | j                  jq                  d1| j*                  j,                  t        d2d34      t        t        j                  |            t        t        t#        |dz              d5z   d34      t        t        jZ                  |d6         j]                               t        t#        |dz              t        t#        |dz              t        t        jZ                  |      j]                               | 7
       d}!| j                  |   du r|!d8z  rT| j                  j                  d9| j*                  j,                  t        t        j                  |            :       |!dz  }!ts        jt                  d;       d	{    | j                  |   du rtw        | j                  |   tP              r| j                  |   }|	 | j                  |   je                  |      }"	 ty        jz                  |"      }#|#S 7 7 7 u# t&        $ r&}|jL                  dk(  r| jO                          |d	}~wtP        $ rK}| j                  jM                  d!       | j                  jS                          || j                  |<   |d	}~ww xY w# tB        jf                  jh                  $ rD}|| j                  |<   t'        d/d0j)                  | j*                  j,                  |            d	}~ww xY w7 m# tB        jf                  jh                  $ r5}t'        d/d<j)                  | j*                  j,                  |            d	}~ww xY w# tx        j|                  j~                  $ r5}t'        d=d>j)                  | j*                  j,                  |            d	}~ww xY ww)?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J5(((]]<0
mmM2  !!//0DE!)!1!1$2D2DE]2^_`_a2b!c TZZHHNN["$TYYV%<"=  ? HHNNNWYZ^ZcZcjpZqWrNs "'DJJv --,,-H&QQE $E'N3FHHNNJ"$TYYV%<"=bVV\_I]F^  ` '&'E'{  (C  (C  DH  DR  DR  D[  D[  ]a  ]f  ]f  ms  ]t  vy  z@  CK  zK  vL  NQ  RV  Ra  Ra  dl  Rl  Nm  (no o mmf,G{++"G113D"&q' %)II	(,)-$=dnn>P>T>R>H>I>G>K>L%N	   (l3799;3O1:589O5P6D	 ' F #mm001P1<1C1E1G1=m1L1:1?1:< < < //I 0g  0n  0n  os  o}  o}  oF  oF os  ox  ox  E  oF oz or  s@  CK  sK  oL0MN N
 ''G (I  (P  (P  QU  Q_  Q_  Qh  Qh QU  QZ  QZ  ag  Qh QT  UY  Ub  Ub  em  Um  Qn QT  U[  ^f  Uf  Qg(hi i  ,,77>>t}}G_G_>`L))a-KH 2$..BTVl2F
T_al298EI
 ))+tzz<QWYdflnu  xA  B $ 2 23L37::3?393>3>3?3G3?3H3<!> >( %,K$8!&-m&<#&4W]5K&L#$27;3G$H!#1'*2E#F 9:LNd:NPZ\g:QSh:?AVXN !7!77  W$(NN$;$;-/0@0@0P0W0W0Y-Z+-h.>.>t?U?U.V.].]._+`  b ''D'z  (B  (B  CG  CQ  CQ  CZ  CZ  ([\ \ yy1} 77&'F (H  (O  (O  PT  P^  P^  Pg  Pg  im  ir  ir  t{  |I  tJ  (KL L }}v%)>>&'F (I  (P  (P  QU  Q_  Q_  Qh  Qh  jn  jw  jw  z@  j@  BI  JU  BV  (WX X 0DI1DM ))+t7M7M|]ce|*ACXZoq !.J..t/@/@AJc ((4 "&!6!6s!;DJJv!%!8!8!:HHMM _nn--<y9$))&12s3'>'I#JKfT\ef "8#3#3G<M4N#O#V#V#X YS!6!ABCC 4x ?@A 0 0 > E E GH/  
1 jj E)S h%)^^%<%<R		X^H_E`  bq ++b/!! jj E) djj()4

6"AG	Zjj(00<G	ikk'*G
 I Rf<J> $ 7788IIK YZ  "%&

6"	Z ??.. c%&

6"&'DF~  GF  GF  GK  GU  GU  G^  G^  `a  Gb  c  cc6 " ** 	Z"#@BuB|B|  ~B  ~L  ~L  ~U  ~U  WX  CY  Z  Z	Z }},, 	i"#E  HE  HL  HL  MQ  M[  M[  Md  Md  fg  Hh  i  i	is   Ej1dF<j1dEj1"Ad $d%d )Hj1f  Gj1hj1..j1h <i j1j1d 	f%!efAffj1 h=?g<<hj1i$0iij1j.90j))j..j1c	           
          || j                   v r-t        dj                  t        j                  |                  t        ||||||||      }	t        | j                        }
| j                  j                  |	dg       |
| j                   |<   y)

        :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cdldtdtu{d|}~~+|\6;X^`girsd(()!!3+.(/f%r   c	           
         || j                   vr-t        dj                  t        j                  |                  | j                   |   }	| j
                  |	   d   r-t        dj                  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                  k7  sJ || j
                  |	   d<   y)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  sf    ...\ccdldtdtu{d|}~~''/g&q)MTTU]UeUeflUmnp p   )!,+|\6;X^`girs{{ckk)))zzSZZ'''zzSZZ'''#//111zzSZZ'''{{ckk))) }}---),7#A&r   c                    t        |      t        k(  sJ t        |      t        k(  r|dkD  sJ d}g }||k  rTt        | j                        |kD  r3| j                  |    }|r
|d   r|d   r|j                  |       |dz  }n	 |S ||k  rT|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!eai//%i4%%&*''+&2a5RUJJrNFA
 %i 
r   c                 v    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  sT     
 ** 	$HCsJ1$I!#		$
 
r   c                 ^    | j                   j                  |d      }|r| j                  |   S y)2

        :param key_id:
        :return:
        NrN   getrO   )r   r   idxs      r   get_transactionzSimpleBuyer.get_transactionh  s5     ##''5%%c** r   c                 p    | j                   j                  |d      }|r| j                  |   \  }}|xr |S y)r   NFr   )r   r   r   r   r   s        r   is_completezSimpleBuyer.is_completer  s@     ##''5))#.HC;3r   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   sU     CC J8t5">ob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      sQ   6    	       4 5 /   Z'& ':n& nr   