
    8'h5d                         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mZ  G d d	e      Z G d
 de      Zy)    N)pformat)ApplicationError)ApplicationSession   )unpack_uint256pack_uint256)hlsign_eip712_datarecover_eip712_signerc                       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	            O/var/www/html/trade_iq/venv/lib/python3.12/site-packages/autobahn/xbr/_buyer.py__init__zTransaction.__init__4   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__K   s    t||~&&r   N)__name__
__module____qualname__r   r   r"    r   r   r   r   2   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                         | _        || _        || _	        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	_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__V   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                                	 t        | j                        t         k(  rt#        | j                        dk(  sJ |j%                  d| j                         d{   | _        |j%                  d| j&                  d	          d{   }|d
   | _        t        | j*                        t         k(  rt-        | j*                        | _        |d   | _        | j                  j                  dt        dt        j                  | j&                  d	         j                         z         | j*                  | j.                         | j*                  S 7 7 #  |j)                           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;   r*   z*xbr.marketmaker.get_active_payment_channel+xbr.marketmaker.get_payment_channel_balancer   	remainingseqztDelegate has current payment channel address {payment_channel_adr} (remaining balance {remaining} at sequence {seq})0x)payment_channel_adrrT   rU   )
isinstancer   r,   strrI   rH   r3   infor	   r>   binasciib2a_hexr9   r;   decoder=   r-   r.   callrD   leaverE   r   rF   )r   sessionconsumer_idpayment_balances       r   startzSimpleBuyer.start   s     '#5666K C'''==  k o!)!1!1$**2G2G2L!M!T!T!V 	 	X		

#u,TZZB1FFF"),,/[]a]g]g"hhDM %,LL1^`d`m`mnw`x$yyO (4%'*4==9DM#E*	  M*,TH4D4DT]]S\E]4^4e4e4g-g*h $499 	 	> }}' i z	MMOsD   B,H/AG< G8+G< 0G:1G< 5CH8G< :G< <HHc                 6   K   | j                   sJ d| _         yw)z#
        Stop buying keys.
        FN)rI   r!   s    r   stopzSimpleBuyer.stop   s      }}}s   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
        rS   r   N)rH   is_attachedr^   rD   )r   rb   s     r   r   zSimpleBuyer.balance   sW      }}!:!:!<<< $ 2 23`bfbobopybz {{ |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   rT   inflight)r   rT   rj   )rH   rg   osurandomr^   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   rn   s     r   close_channelzSimpleBuyer.close_channel  s     s   c                 4  K   t        |      t        k(  rt        |      dk(  sJ t        |      t        k(  r|dv sJ t        |      t        k(  sJ t        | j                  d         }|| j
                  v r<| j                  j                  dt        t        j                  |                   nG| 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| j*                  rBd
}| j-                         }	|	r|	d   }|r&|}
| j.                  }| j(                  }d}t1        | j2                  |
|||      }| j                  j                  dt5        j6                  |
      j9                         |t        |dz        |       | j                  j                  d|
|t;        |      ||       d
{    t!        ddj#                  | j$                  j&                  t        j                  |      t5        j6                  |
      j9                         t        |dz                    t!        ddj#                  | j$                  j&                  t        j                  |      t        | j(                  dz        t        |dz                    | j<                  j>                  jA                  tB        jD                  jF                        }| j.                  dz   }d}t1        | j2                  ||||      }| 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        t5        j6                  |      j9                               t        t5        j6                  | jV                        j9                               %       t!        d&d'j#                  | j$                  j&                              | j.                  dz   |k7  r>t!        d(d)j#                  | j$                  j&                  | j.                  |d                | j(                  |z
  |k7  rAt!        d(d*j#                  | j$                  j&                  | j(                  |z
  |d"               || _        || _        | j[                  || jV                  ||||||       |d+   }tB        j\                  j_                  | j<                        }	 |ja                  |      }tB        jf                  ji                  |      | j
                  |<   | jk                         }| j                  j                  d.| j$                  j&                  t        d/d01      t        t        j                  |            t        t        t        |dz              d2z   d01      t        t5        j6                  |d3         j9                               t        t        |dz              t        t        |dz              t        t5        j6                  |      j9                               |4
       d}| j
                  |   du r|d5z  rT| j                  j                  d6| j$                  j&                  t        t        j                  |            7       |dz  }tm        jn                  d8       d
{    | j
                  |   du rtq        | j
                  |   tP              r| j
                  |   }|	 | j
                  |   ja                  |      }	 ts        jt                  |      } | S 7 7 7 q# t         $ r&}|jL                  dk(  r| jO                          |d
}~wtP        $ rK}| j                  jM                  d       | j                  jS                          || j
                  |<   |d
}~ww xY w# tB        jb                  jd                  $ rD}|| j
                  |<   t!        d,d-j#                  | j$                  j&                  |            d
}~ww xY w7 m# tB        jb                  jd                  $ r5}t!        d,d9j#                  | j$                  j&                  |            d
}~ww xY w# tr        jv                  jx                  $ 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
           )cborr   z>Key {key_id} already in key store (or currently being bought).)r-   )r   z1Key {key_id} not yet in key store - buying key ..Fzxbr.marketmaker.get_quoteN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 {close_adr} [close_seq={close_seq}, close_balance={close_balance}, close_is_final={close_is_final}])	close_adr	close_seqclose_balanceclose_is_finalzxbr.marketmaker.close_channelzxbr.error.channel_closedzw{}.unwrap() - key {} cannot be bought: payment channel 0x{} 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 {})encoderr   )is_finalzxbr.marketmaker.buy_keyz8Encountered error while calling market maker to buy key!r   r   amount_paidrT   rj   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 XBRro   )	r~   tx_typer   r}   ro   rT   rj   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-   r.   rY   rD   rG   r3   rZ   r	   uuidUUIDrH   r^   r   r0   rC   r   r/   	__class__r#   rE   rJ   past_transactionsrF   r
   r5   r[   r\   r]   r   rB   r;   encoder?   encoding
RawEncoder_save_transaction_phase1r=   errorre   	Exceptionfailurer   r4   warn_save_transaction_phase2r@   	SealedBoxdecrypt
exceptionsCryptoErrorsecret	SecretBoxcount_transactionsr1   sleeprX   cbor2loadsdecoderCBORDecodeError)!r   r   
serializer
ciphertextchannel_adrquoter   r   last_txtxnsrw   rx   ry   rz   r   r   r   r|   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(((DMM)45 TZZHHMMZ!#DIIF$;!<  > HHMMMVXY]YbYbioYpVqMr "'DJJv --,,-H&QQE $E'N3FHHMMI!#DIIF$;!<RFU[OH\E]  _ '&'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' %0	$(II	(,)-$4T^^YPY[hjx$y	  'i080@0@0K0R0R0T09478N4O5C	 & E #mm001PR[]fht  vC  iD  FT  V_  `  `  ` //I 0i  0p  0p  qu  q  q  qH  qH qu  qz  qz  AG  qH qy  qA  qA  BK  qL  qS  qS  qU qt  uB  EM  uM  qN0OP P
 ''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 )kSZemnI ))+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 2;@WYnpu  xM  N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 g$(NN$;$;BtyyW]G^D_  aq ++b/!! jj E) djj()4

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

6"	T ??.. 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   Djc:Gj!c="E*jAd d d Hj(f 9Gj>g+?j.jg. #i 8j=j d 	f!d--f9Ae??fjg($?g##g((j.i 0h;;i  jj 0jjjc	           
          || j                   v r-t        dj                  t        j                  |                  t        ||||||||      }	t        | j                        }
| j                  j                  |	dg       |
| j                   |<   y)

        :param channel_adr:
        :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)	rK   RuntimeErrorr/   r[   r\   r   r.   rL   append)r   r   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)rK   r   r/   r[   r\   rL   r   r   r   r   r   r   r   r   )r   r   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,   boolr0   r.   rL   r   )r   filter_completelimitnr   txs         r   r   zSimpleBuyer.past_transactions  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   )rL   )r   r   r   r   s       r   r   zSimpleBuyer.count_transactions2  sT     
 ** 	$HCsJ1$I!#		$
 
r   c                 ^    | j                   j                  |d      }|r| j                  |   S y)2

        :param key_id:
        :return:
        NrK   getrL   )r   r   idxs      r   get_transactionzSimpleBuyer.get_transactionB  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_completeL  s@     ##''5))#.HC;3r   r   )Tr   )r#   r$   r%   __doc__r3   r   rc   re   r   rp   rr   r   r   r   r   r   r   r   r&   r   r   r(   r(   O   sU     CB H.`">Un0,$-L, +
r   r(   )r   r[   pprintr   rk   r   nacl.secretr?   
nacl.utilsnacl.exceptionsnacl.publicr1   autobahn.wamp.exceptionr   autobahn.wamp.protocolr   _utilr   r   r6   r	   r
   r   objectr   r(   r&   r   r   <module>r      sS   6    	       4 5 /  ? >'& ':G& Gr   