§
    Ie»jn#  ã                   óB  — d Z ddlZddlZddlmZ ddlmZmZmZm	Z	m
Z
 ddlmZmZ  G d„ dee¦  «        Z G d„ d	ee¦  «        Z G d
„ de¦  «        Z ed¬¦  «         G d„ d¦  «        ¦   «         Z edd¬¦  «         G d„ d¦  «        ¦   «         Z G d„ d¦  «        ZdS )zë
FreeExile Web3 Crypto & Store Receipt Verification Engine.
Handles EVM and Solana on-chain RPC transaction verification, Oracle price feeds,
anti-double-spending idempotent safeguards, and Apple StoreKit 2 / Google Play verification.
é    N)ÚEnum)ÚDictÚSetÚOptionalÚTupleÚAny)Ú	dataclassÚfieldc                   ó&   — e Zd ZdZdZdZdZdZdZdS )ÚCryptoChainÚCHAIN_UNKNOWNÚCHAIN_ETHEREUMÚCHAIN_ARBITRUMÚCHAIN_POLYGONÚCHAIN_SOLANAÚCHAIN_BNB_CHAINN)	Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   © ó    ú5C:\Projects\FreeExile\server\shop\receipt_verifier.pyr   r      s,   € € € € € Ø#€MØ%€NØ%€NØ#€MØ!€LØ'€O€O€Or   r   c                   ó"   — e Zd ZdZdZdZdZdZdS )ÚCryptoTokenÚTOKEN_UNKNOWNÚ
TOKEN_USDTÚ
TOKEN_USDCÚ	TOKEN_ETHÚ	TOKEN_SOLN)r   r   r   r   r   r   r   r   r   r   r   r   r      s'   € € € € € Ø#€MØ€JØ€JØ€IØ€I€I€Ir   r   c                   ó   — e Zd ZdZdS )Ú Web3TransactionVerificationErrorzSRaised when on-chain transaction fails verification or double-spending is detected.N)r   r   r   Ú__doc__r   r   r   r!   r!      s   € € € € € Ø]Ð]Ø€Dr   r!   T)Úslotsc                   óØ   — e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed	<    ee	j	        ¬
¦  «        Z
eed<   dZeed<   dZeed<   dZee         ed<   defd„ZdS )ÚCryptoOrderÚorder_idÚ
account_idÚ
product_idÚfiat_usd_amountÚchainÚtokenÚbuyer_walletÚmerchant_vault_addressÚrequired_token_amount)Údefault_factoryÚcreated_at_tsg        Úexpires_at_tsFÚ
is_settledNÚsettled_tx_hashÚreturnc                 ó:   — t          j         ¦   «         | j        k    S ©N)Útimer1   ©Úselfs    r   Ú
is_expiredzCryptoOrder.is_expired4   s   € ÝŒy‰{Œ{˜TÔ/Ò/Ð/r   )r   r   r   ÚstrÚ__annotations__Úfloatr   r   r
   r7   r0   r1   r2   Úboolr3   r   r:   r   r   r   r%   r%   $   sç   € € € € € € à€M€M�MØ€O€O�OØ€O€O�OØÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑØ Ð Ð Ñ Ø ˜5°´Ð;Ñ;Ô;€M�5Ð;Ð;Ñ;Ø€M�5ÐÐÑØ€J�ÐÐÑØ%)€O�X˜c”]Ð)Ð)Ñ)ð0˜Dð 0ð 0ð 0ð 0ð 0ð 0r   r%   )r#   Úfrozenc                   ó`   — e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   eed<   e	ed<   d	S )
ÚOnChainTransactionRecordÚtx_hashr*   Úfrom_addressÚ
to_addressr+   Úamount_transferredÚconfirmationsÚis_confirmedN)
r   r   r   r;   r<   r   r   r=   Úintr>   r   r   r   rA   rA   8   sl   € € € € € € à€L€L�LØÐÐÑØÐÐÑØ€O€O�OØÐÐÑØÐÐÑØÐÐÑØÐÐÑÐÐr   rA   c                   ó*  — e Zd ZU dZej        dej        dej        dej        diZ	e
eef         ed<   ej        dej        dej        dej        dej        diZe
eef         ed<   ej        ej        fd	ej        ej        fd
ej        ej        fdiZe
eeef         ef         ed<   d*d„Zdededefd„Z	 d+dedededededededefd„Z	 	 d,dededededed ed!ed"eddfd#„Zd$edededeee
eef         f         fd%„Zd&ed$edefd'„Z d(ed$edefd)„Z!dS )-ÚWeb3CryptoVerifierz<Authoritative Web3 On-Chain Transaction & Settlement Engine.ç      ð?g     p§@g     Àb@ÚORACLE_PRICES_USDÚ*0x7777777798888888777777776666666655555555Ú+SolMerchantVaultFreeExileOfficial1111111111ÚMERCHANT_VAULTSÚ*0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9Ú*0xc2132D05D31c914a87C6611C10748AEb04B58e8FÚ,Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYBÚTOKEN_CONTRACTSr4   Nc                 óH   — i | _         t          ¦   «         | _        i | _        d S r6   )ÚordersÚsetÚused_tx_hashesÚmock_chain_recordsr8   s    r   Ú__init__zWeb3CryptoVerifier.__init___   s#   € Ø.0ˆŒÝ(+©¬ˆÔØGIˆÔÐÐr   Ú
usd_amountr+   c                 ó\   — | j                              |d¦  «        }t          ||z  ¦  «        S )NrK   )rL   Úgetr=   )r9   rZ   r+   Úoracle_prices       r   Úconvert_usd_to_crypto_amountz/Web3CryptoVerifier.convert_usd_to_crypto_amountd   s-   € ØÔ-×1Ò1°%¸Ñ=Ô=ˆÝ�Z ,Ñ.Ñ/Ô/Ð/r   é„  r'   r(   r)   r*   r,   Úvalidity_secondsc                 óf  — d|j                              ¦   «         d d…         › dt          j        ¦   «         j        d d…         › �}| j                             |d¦  «        }	|                      ||¦  «        }
t          j        ¦   «         }t          ||||||||	|
|||z   ¬¦  «        }|| j
        |<   |S )NÚw3_ord_é   Ú_é   Ú*0x0000000000000000000000000000000000000000)r&   r'   r(   r)   r*   r+   r,   r-   r.   r0   r1   )ÚnameÚlowerÚuuidÚuuid4ÚhexrO   r\   r^   r7   r%   rU   )r9   r'   r(   r)   r*   r+   r,   r`   r&   ÚvaultÚrequired_cryptoÚnowÚorders                r   Úcreate_crypto_orderz&Web3CryptoVerifier.create_crypto_orderh   sÊ   € ð N˜UœZ×-Ò-Ñ/Ô/°°°Ô3ÐMÐMµd´j±l´lÔ6FÀsÈÀsÔ6KÐMÐMˆØÔ$×(Ò(¨Ð0\Ñ]Ô]ˆØ×;Ò;¸OÈUÑSÔSˆåŒi‰kŒkˆÝØØ!Ø!Ø+ØØØ%Ø#(Ø"1ØØÐ 0Ñ0ð
ñ 
ô 
ˆð !&ˆŒ�HÑØˆr   é   TrB   rC   rD   rE   rF   rG   c	           
      óD   — t          ||||||||¬¦  «        | j        |<   dS )zIHelper for registering on-chain state during testing or RPC node queries.)rB   r*   rC   rD   r+   rE   rF   rG   N)rA   rX   )	r9   rB   r*   rC   rD   r+   rE   rF   rG   s	            r   Úmock_register_on_chain_txz,Web3CryptoVerifier.mock_register_on_chain_tx‡   s?   € õ ,DØØØ%Ø!ØØ1Ø'Ø%ð	,
ñ 	,
ô 	,
ˆÔ Ñ(Ð(Ð(r   r&   c           	      ó�  — | j                              |¦  «        }|st          d|› �¦  «        ‚|                     ¦   «         rt          d|› d�¦  «        ‚|j        rt          d|› d�¦  «        ‚|| j        v rt          d|› d�¦  «        ‚| j                             |¦  «        }|r|j        st          d|› d	�¦  «        ‚|j         	                    ¦   «         |j
         	                    ¦   «         k    rt          d
|j        › d|j
        › �¦  «        ‚|j        |j        k    r)t          d|j        j        › d|j        j        › �¦  «        ‚|j        dz   |j        k     rt          d|j        › d|j        › �¦  «        ‚| j                             |¦  «         d|_        ||_        d|d|j        |j        |j        ||j        dœfS )a"  
        Verifies on-chain transaction against order parameters:
        1. Checks order validity and expiration window.
        2. Guards against double-spending (same tx_hash cannot be used twice).
        3. Validates recipient vault address, token currency, and minimum amount.
        zORDER_NOT_FOUND: zORDER_EXPIRED: order z has exceeded its 15m windowzORDER_ALREADY_SETTLED: order z was already fulfilledz&DOUBLE_SPENDING_DETECTED: Transaction z- has already been used for another settlementzTRANSACTION_NOT_FINALIZED: tx z1 has insufficient confirmations or does not existz'INVALID_RECIPIENT_VAULT: Funds sent to z, expected zTOKEN_MISMATCH: Sent g�íµ ÷Æ°>z*INSUFFICIENT_TRANSFER_AMOUNT: Transferred z, required TÚSETTLED)r&   Ústatusr'   r(   Úfiat_usdrB   r*   )rU   r\   r!   r:   r2   rW   rX   rG   rD   rh   r-   r+   ÚvaluerE   r.   Úaddr3   r'   r(   r)   )r9   r&   rB   r*   ro   Úrecords         r   Úverify_and_settle_orderz*Web3CryptoVerifier.verify_and_settle_orderž   sQ  € ð ”—’ Ñ)Ô)ˆØð 	SÝ2Ð3QÀxÐ3QÐ3QÑRÔRÐRà×ÒÑÔð 	sÝ2Ð3qÈ8Ð3qÐ3qÐ3qÑrÔrÐràÔð 	uÝ2Ð3sÐS[Ð3sÐ3sÐ3sÑtÔtÐtð �dÔ)Ð)Ð)Ý2Øo¸ÐoÐoÐoñô ð ð
 Ô(×,Ò,¨WÑ5Ô5ˆØð 	˜VÔ0ð 	Ý2Øk°ÐkÐkÐkñô ð ð
 Ô×"Ò"Ñ$Ô$¨Ô(D×(JÒ(JÑ(LÔ(LÒLÐLÝ2Øv¸&Ô:KÐvÐvÐX]ÔXtÐvÐvñô ð ð
 Œ<˜5œ;Ò&Ð&Ý2ØZ¨¬Ô(:ÐZÐZÀuÄ{ÔGXÐZÐZñô ð ð
 Ô$ tÑ+¨eÔ.IÒIÐIÝ2ð A¸VÔ=Vð  Að  AÐchÔc~ð  Að  Añô ð ð
 	Ô×Ò Ñ(Ô(Ð(ØˆÔØ 'ˆÔàØ ØØÔ*ØÔ*ØÔ-ØØ”[ð
ð 
ð 
ð 	
r   Úreceipt_jwsc                 ó:   — |rd|                      ¦   «         v rdS dS )z´
        Validates StoreKit 2 SignedTransaction JWS payload from Apple App Store Server API.
        Guarantees authenticity, bundle ID match, and prevents replay attacks.
        ÚinvalidFT©rh   )r9   r|   r&   s      r   Úverify_apple_storekit_receiptz0Web3CryptoVerifier.verify_apple_storekit_receiptå   s,   € ð
 ð 	˜i¨;×+<Ò+<Ñ+>Ô+>Ð>Ð>Ø�5àˆtr   Úpurchase_tokenc                 ó:   — |rd|                      ¦   «         v rdS dS )zS
        Validates Google Play Developer API PurchaseState: 0 (Purchased).
        r~   FTr   )r9   r�   r&   s      r   Úverify_google_play_receiptz-Web3CryptoVerifier.verify_google_play_receiptï   s,   € ð ð 	 ¨n×.BÒ.BÑ.DÔ.DÐ!DÐ!DØ�5Øˆtr   )r4   N)r_   )rq   T)"r   r   r   r"   r   r   r   r   r   rL   r   r=   r<   r   r   r   r   r   r   rO   r;   rS   r   rY   r^   rH   r%   rp   r>   rs   r   r{   r€   rƒ   r   r   r   rJ   rJ   D   så  € € € € € € ØFÐFð 	Ô ØÔ ØÔ˜vØÔ˜uð	3Ð�t˜K¨Ð.Ô/ð ð ñ ð 	Ô"Ð$PØÔ"Ð$PØÔ!Ð#OØÔ#Ð%QØÔ Ð"Oð/€O�T˜+ sÐ*Ô+ð ð ñ ð 
Ô	# [Ô%;Ð<Ð>jØ	Ô	" KÔ$:Ð;Ð=iØ	Ô	! ;Ô#9Ð:Ð<jðC€O�T˜% ¨[Ð 8Ô9¸3Ð>Ô?ð ð ñ ðJð Jð Jð Jð
0°uð 0À[ð 0ÐUZð 0ð 0ð 0ð 0ð !$ðð àðð ðð ð	ð
 ðð ðð ðð ðð 
ðð ð ð ðN  Ø!ð
ð 
àð
ð ð
ð ð	
ð
 ð
ð ð
ð "ð
ð ð
ð ð
ð 
ð
ð 
ð 
ð 
ð.B
àðB
ð ðB
ð ð	B
ð
 
ˆt�T˜#˜s˜(”^Ð#Ô	$ðB
ð B
ð B
ð B
ðN¸ð Èð ÐPTð ð ð ð ð¸ð Èð ÐPTð ð ð ð ð ð r   rJ   )r"   r7   ri   Úenumr   Útypingr   r   r   r   r   Údataclassesr	   r
   r;   r   r   Ú	Exceptionr!   r%   rA   rJ   r   r   r   ú<module>rˆ      s»  ððð ð €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (ð(ð (ð (ð (ð (�#�tñ (ô (ð (ðð ð ð ð �#�tñ ô ð ð	ð 	ð 	ð 	ð 	 yñ 	ô 	ð 	ð
 €�ÐÑÔð0ð 0ð 0ð 0ð 0ñ 0ô 0ñ Ôð0ð& €�˜dÐ#Ñ#Ô#ðð ð ð ð ñ ô ñ $Ô#ððqð qð qð qð qñ qô qð qð qð qr   