§
    ¿d»jú  ã            
       ój  — d Z ddlZddlZddlZddlZej                             dej                             ej                             ej         	                    e
¦  «        d¦  «        ¦  «        ¦  «         ddlmZmZmZmZ ddlmZ  G d„ dej        ¦  «        Zedk    r ej        ¦   «          dS dS )	zç
Unit tests for FreeExile Web3 Crypto Payment Engine.
Validates crypto order generation, Pyth/Chainlink oracle price conversions,
on-chain RPC transaction verification (EVM & Solana), anti-double-spending, and expiration timeouts.
é    Nz../../server)ÚWeb3CryptoVerifierÚCryptoChainÚCryptoTokenÚ Web3TransactionVerificationError)ÚCurrencyExchangeEnginec                   ó,   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚTestWeb3CryptoPaymentc                 óR   — t          ¦   «         | _        t          ¦   «         | _        d S )N)r   Úfxr   Úverifier)Úselfs    ú<C:\Projects\FreeExile\tests\unit\test_web3_crypto_payment.pyÚsetUpzTestWeb3CryptoPayment.setUp   s    € Ý(Ñ*Ô*ˆŒÝ*Ñ,Ô,ˆŒˆˆó    c                 óê  — d}| j                              |t          j        ¦  «        }| j                              |t          j        ¦  «        }|                      |d¦  «         |                      |d¦  «         | j                              |t          j        ¦  «        }|                      |dd¬¦  «         | j                              |t          j        ¦  «        }|                      |dd¬¦  «         dS )zFConverting a $20 pack to USDT, USDC, ETH, and SOL using Oracle prices.g      4@gºì¿ÎM{?é   )Úplacesg9EGrùÁ?é   N)	r   Úconvert_usd_to_crypto_amountr   Ú
TOKEN_USDTÚ
TOKEN_USDCÚassertEqualÚ	TOKEN_ETHÚassertAlmostEqualÚ	TOKEN_SOL)r   Ú	usd_priceÚusdt_amountÚusdc_amountÚ
eth_amountÚ
sol_amounts         r   Ú#test_oracle_crypto_price_conversionz9TestWeb3CryptoPayment.test_oracle_crypto_price_conversion   sÝ   € àˆ	ð ”m×@Ò@ÀÍKÔLbÑcÔcˆØ”m×@Ò@ÀÍKÔLbÑcÔcˆØ×Ò˜ dÑ+Ô+Ð+Ø×Ò˜ dÑ+Ô+Ð+ð ”]×?Ò?À	Í;ÔK`ÑaÔaˆ
Ø×Ò˜z¨8¸AÐÑ>Ô>Ð>ð ”]×?Ò?À	Í;ÔK`ÑaÔaˆ
Ø×Ò˜z¨6¸!ÐÑ<Ô<Ð<Ð<Ð<r   c                 óØ  — | j                              dddt          j        t          j        d¬¦  «        }|                      |j        ¦  «         |                      |j	         
                    d¦  «        ¦  «         |                      |j        d¦  «         |                      |j        t          j        ¦   «         ¦  «         |                      |                     ¦   «         ¦  «         dS )zSOrder must contain merchant vault address, chain ID, and a valid expiration window.Úacc_crypto_whale_88Úcoin_pack_1000ç      $@z0x71C...aB3©Ú
account_idÚ
product_idÚfiat_usd_amountÚchainÚtokenÚbuyer_walletÚ0xN)r   Úcreate_crypto_orderr   ÚCHAIN_ARBITRUMr   r   ÚassertIsNotNoneÚorder_idÚ
assertTrueÚmerchant_vault_addressÚ
startswithr   Úrequired_token_amountÚassertGreaterÚexpires_at_tsÚtimeÚassertFalseÚ
is_expired)r   Úorders     r   Ú)test_crypto_order_creation_and_expirationz?TestWeb3CryptoPayment.test_crypto_order_creation_and_expiration.   sÏ   € à”×1Ò1Ø,Ø'Ø ÝÔ,ÝÔ(Ø&ð 2ñ 
ô 
ˆð 	×Ò˜Uœ^Ñ,Ô,Ð,Ø�Š˜Ô4×?Ò?ÀÑEÔEÑFÔFÐFØ×Ò˜Ô4°dÑ;Ô;Ð;Ø×Ò˜5Ô.µ´	±´Ñ<Ô<Ð<Ø×Ò˜×)Ò)Ñ+Ô+Ñ,Ô,Ð,Ð,Ð,r   c           
      óê  — | j                              dddt          j        t          j        d¬¦  «        }d}| j                              |t          j        d|j        t          j        ddd¬	¦  «         | j                              |j	        |t          j        ¬
¦  «        \  }}|  
                    |¦  «         |                      |d         |j	        ¦  «         |                      |d         d¦  «         dS )zZValid transaction with matching recipient, token contract, and amount passes verification.r#   r$   r%   Ú*0x1111222233334444555566667777888899990000r&   ÚB0x9876543210abcdef1234567890abcdef1234567890abcdef1234567890abcdefé   T©Útx_hashr*   Úfrom_addressÚ
to_addressr+   Úamount_transferredÚconfirmationsÚis_confirmed)r1   rB   r*   r1   ÚstatusÚSETTLEDN)r   r.   r   ÚCHAIN_POLYGONr   r   Úmock_register_on_chain_txr3   Úverify_and_settle_orderr1   r2   r   )r   r;   Úmock_tx_hashÚverifiedÚdetailss        r   Ú4test_successful_on_chain_verification_and_settlementzJTestWeb3CryptoPayment.test_successful_on_chain_verification_and_settlement>   s  € à”×1Ò1Ø,Ø'Ø ÝÔ+ÝÔ(ØEð 2ñ 
ô 
ˆð \ˆð 	Œ×/Ò/Ø ÝÔ+ØEØÔ3ÝÔ(Ø#ØØð 	0ñ 		
ô 		
ð 		
ð !œM×AÒAØ”^Ø ÝÔ+ð Bñ 
ô 
Ñˆ�'ð
 	�Š˜Ñ!Ô!Ð!Ø×Ò˜ Ô,¨e¬nÑ=Ô=Ð=Ø×Ò˜ Ô*¨IÑ6Ô6Ð6Ð6Ð6r   c           
      óê  — | j                              dddt          j        t          j        d¬¦  «        }d}| j                              |t          j        d|j        t          j        |j        dd¬	¦  «         | j          	                    |j
        |t          j        ¦  «        \  }}|                      |¦  «         | j                              d
ddt          j        t          j        d¬¦  «        }|                      t          ¦  «        5 }| j          	                    |j
        |t          j        ¦  «         ddd¦  «         n# 1 swxY w Y   |                      dt          |j        ¦  «        ¦  «         dS )zFReusing the same tx_hash for a second order MUST be strictly rejected.Ú
acc_user_1Úcoin_pack_100g      ð?Ú+SolBuyer11111111111111111111111111111111111r&   Ú!SolTxHash_UniqueSignature_ABC_123é    TrA   Ú
acc_user_2Ú,SolAttacker222222222222222222222222222222222NÚDOUBLE_SPENDING_DETECTED)r   r.   r   ÚCHAIN_SOLANAr   r   rK   r3   r5   rL   r1   r2   ÚassertRaisesr   ÚassertInÚstrÚ	exception)r   Úorder1rM   Úv1Ú_Úorder2Úctxs          r   Ú$test_anti_double_spending_protectionz:TestWeb3CryptoPayment.test_anti_double_spending_protection`   s«  € à”×2Ò2Ø#Ø&ØÝÔ*ÝÔ'ØFð 3ñ 
ô 
ˆð ;ˆàŒ×/Ò/Ø ÝÔ*ØFØÔ4ÝÔ'Ø%Ô;ØØð 	0ñ 		
ô 		
ð 		
ð ”×5Ò5°f´oÀ|ÕU`ÔUmÑnÔn‰ˆˆAØ�Š˜ÑÔÐð ”×2Ò2Ø#Ø&ØÝÔ*ÝÔ'ØGð 3ñ 
ô 
ˆð ×ÒÕ?Ñ@Ô@ð 	kÀCØŒM×1Ò1°&´/À<ÕQ\ÔQiÑjÔjÐjð	kð 	kð 	kñ 	kô 	kð 	kð 	kð 	kð 	kð 	kð 	køøøð 	kð 	kð 	kð 	kà�ŠÐ0µ#°c´mÑ2DÔ2DÑEÔEÐEÐEÐEs   Ä,E Å EÅEN)Ú__name__Ú
__module__Ú__qualname__r   r!   r<   rP   rd   © r   r   r	   r	      se   € € € € € ð-ð -ð -ð=ð =ð =ð$-ð -ð -ð  7ð  7ð  7ðD&Fð &Fð &Fð &Fð &Fr   r	   Ú__main__)Ú__doc__Úunittestr8   ÚsysÚosÚpathÚinsertÚabspathÚjoinÚdirnameÚ__file__Úshop.receipt_verifierr   r   r   r   Úshop.currency_exchanger   ÚTestCaser	   re   Úmainrh   r   r   ú<module>rx      s+  ððð ð €€€Ø €€€Ø 
€
€
€
Ø 	€	€	€	à „‡‚��2”7—?’? 2¤7§<¢<°´·²ÀÑ0IÔ0IÈ>Ñ#ZÔ#ZÑ[Ô[Ñ \Ô \Ð \ðð ð ð ð ð ð ð ð ð ð ð ð :Ð 9Ð 9Ð 9Ð 9Ð 9ðoFð oFð oFð oFð oF˜HÔ-ñ oFô oFð oFðd ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr   