§
    ]šÁj§F  ã                   ó`  — d Z ddlZddlmc mZ ddlZddl	Z	ddl
Z
ddlZddlZe
j                             e
j                             e
j                             e¦  «        d¦  «        ¦  «        Ze
j                             ed¦  «        Zeej        vrej                             de¦  «         eej        vrej                             de¦  «         ddlmZmZmZmZmZmZ ddlmZmZ ddlm Z!m"Z"mZ# ddl$m%Z%m&Z& dd	l'm(Z(m)Z)  G d
„ dej*        ¦  «        Z+e,dk    r ej-        ¦   «          dS dS )u—  
Sprint 3 Unit & Concurrency Stress Test Suite for FreeExile:
- Ná»�n Kinh Táº¿ Báº£n Vá»‹ Huyáº¿t Tháº¡ch & Cá»• Cá»‘t (Primal Bloodstones & Bone Relics)
- Ma Tráº­n 15 Tiers Thuá»™c TÃ­nh & PhÃ­ VÃ ng Cháº¿ TÃ¡c LÅ©y Thá»«a
- Giao thá»©c Distributed Two-Phase Commit (2PC) chá»‘ng dupe trÃªn Háº¯c Thá»‹ Hoang Vá»±c
- Kiá»ƒm thá»­ táº£i 50.000 giao dá»‹ch song song tranh mua cÃ¹ng 1 mÃ³n Ä‘á»“ (0% dupe)
é    Nz../..Úserver)ÚItemSlotÚ
ItemRarityÚ	AffixTypeÚPrimalCurrencyTypeÚCraftingItemÚAffixMod)ÚItemCraftingEngineÚcalculate_crafting_gold_fee)ÚCraftingEngineÚGearItemr   )ÚInstantBuyoutEngineÚ	StashItem)ÚUniversalConsignmentVaultÚVaultItemFilterc                   ót   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚTestSprint3EconomyAndBazaar2PCc                 ó  — t          ¦   «         | _        t          ¦   «         | _        t	          dd¬¦  «        | _        d| _        d| _        | j                             | j        ¦  «         | j                             | j        ¦  «         d S )Nçš™™™™™©?ú:memory:©Úmarket_tax_rateÚdb_pathÚseller_master_01Úbuyer_exile_02)	r
   Úcraft_engineÚPrimalBarterEngineÚbarter_enginer   Úbazaar_engineÚ	seller_idÚbuyer_idÚregister_account)Úselfs    úHC:\Projects\FreeExile\tests\unit\test_sprint_3_economy_and_bazaar_2pc.pyÚsetUpz$TestSprint3EconomyAndBazaar2PC.setUp2   sy   € Ý.Ñ0Ô0ˆÔÝ/Ñ1Ô1ˆÔÝ0ÀÈzÐZÑZÔZˆÔØ+ˆŒØ(ˆŒØÔ×+Ò+¨D¬NÑ;Ô;Ð;ØÔ×+Ò+¨D¬MÑ:Ô:Ð:Ð:Ð:ó    c                 óR  — t          dddt          j        t          j        ¬¦  «        }| j                             |t          j        ¦  «        \  }}}|  	                    |¦  «         |  
                    |j        t          j        ¦  «         |  	                    d|j        cxk    odk    nc ¦  «         t          ddd	t          j        ¦  «        }| j                             |¦  «        \  }}|  	                    |¦  «         |  
                    |j        t          j        ¦  «         d
S )uF   Huyáº¿t Há»“n Tháº¡ch awakens Normal item into Magic with 1-2 affixes.Úprimal_axe_01u   Hung Tháº§n RÃ¬u ThÃ´éK   ©Ú	item_uuidÚ	base_nameÚ
item_levelÚslotÚrarityé   é   Úg_axe_1u	   RÃ¬u Gá»‰é<   N)r   r   Ú	WEAPON_1Hr   ÚNORMALr   Úapply_currencyr   ÚHUYET_HON_THACHÚ
assertTrueÚassertEqualr/   ÚMAGICÚtotal_affixes_countr   ÚPrimalRarityÚ	PHAM_PHAMr   Úapply_huyet_hon_thachÚ	LINH_PHAM©r#   ÚitemÚokÚmsgÚres_itemÚgearÚb_okÚ_s           r$   Ú$test_huyet_hon_thach_normal_to_magiczCTestSprint3EconomyAndBazaar2PC.test_huyet_hon_thach_normal_to_magic;   s  € åØ%Ø-ØÝÔ#ÝÔ$ð
ñ 
ô 
ˆð !Ô-×<Ò<¸TÕCUÔCeÑfÔfÑˆˆC�Ø�Š˜ÑÔÐØ×Ò˜œ­*Ô*:Ñ;Ô;Ð;Ø�Š˜˜XÔ9Ð>Ð>Ò>Ð>¸QÒ>Ð>Ð>Ð>Ñ?Ô?Ð?å˜	 ;°µLÔ4JÑKÔKˆØÔ$×:Ò:¸4Ñ@Ô@‰ˆˆaØ�Š˜ÑÔÐØ×Ò˜œ¥lÔ&<Ñ=Ô=Ð=Ð=Ð=r&   c           	      ó¢  — t          dddt          j        t          j        ¬¦  «        }|j                             t          ddt          j	        dd¦  «        ¦  «         | j
                             |t          j        ¦  «        \  }}}|                      |¦  «         |                      |j        t          j        ¦  «         |                      |j        d¦  «         t'          d	d
dt(          j        ¦  «        }| j                             |¦  «        \  }}|                      |¦  «         |                      |j        t(          j        ¦  «         dS )uF   Cá»• Cá»‘t áº¤n evolves Magic item into Rare with an additional affix.Úbone_spear_02u   U Minh Cá»‘t ThÆ°Æ¡ngéP   r*   Úp_1u   SÃ¡t ThÆ°Æ¡ng % (T2)r1   é‚   Ú	g_spear_2u   Ma ThÆ°Æ¡ngéF   N)r   r   Ú	WEAPON_2Hr   r:   ÚprefixesÚappendr	   r   ÚPREFIXr   r6   r   Ú	CO_COT_ANr8   r9   r/   ÚRAREr;   r   r<   r?   r   Úapply_co_cot_anÚCUC_PHAMr@   s           r$   Ú"test_co_cot_an_regal_magic_to_rarezATestSprint3EconomyAndBazaar2PC.test_co_cot_an_regal_magic_to_rareN   s$  € åØ%Ø-ØÝÔ#ÝÔ#ð
ñ 
ô 
ˆð 	Œ×Ò�X eÐ-CÅYÔEUÐWXÐZ]Ñ^Ô^Ñ_Ô_Ð_Ø Ô-×<Ò<¸TÕCUÔC_Ñ`Ô`ÑˆˆC�Ø�Š˜ÑÔÐØ×Ò˜œ­*¬/Ñ:Ô:Ð:Ø×Ò˜Ô5°qÑ9Ô9Ð9å˜ ]°B½Ô8NÑOÔOˆØÔ$×4Ò4°TÑ:Ô:‰ˆˆaØ�Š˜ÑÔÐØ×Ò˜œ¥lÔ&;Ñ<Ô<Ð<Ð<Ð<r&   c           	      óÜ  — t          dddt          j        t          j        ¬¦  «        }|j                             t          ddt          j	        dd¦  «        ¦  «         |j
                             t          d	d
t          j        dd¦  «        ¦  «         | j                             |t          j        ¦  «        \  }}}|                      |¦  «         |                      |j        d¦  «         dS )uD   U Minh Cá»‘t Ä�inh slams an additional affix onto Rare item (max 6).Úwraith_helm_03u   U Minh Cá»‘t KhÃ´iéU   r*   Úp_lifeu   Sinh Lá»±c (T1)r0   éŒ   Ús_resu   KhÃ¡ng LÃ´i (T1)é-   é   N)r   r   ÚHELMETr   rU   rQ   rR   r	   r   rS   ÚsuffixesÚSUFFIXr   r6   r   ÚU_MINH_COT_DINHr8   r9   r;   ©r#   rA   rB   rC   rD   s        r$   Ú!test_u_minh_cot_dinh_exalted_slamz@TestSprint3EconomyAndBazaar2PC.test_u_minh_cot_dinh_exalted_slamb   s×   € åØ&Ø*ØÝ”Ý”?ð
ñ 
ô 
ˆð 	Œ×Ò�X hÐ0AÅ9ÔCSÐUVÐX[Ñ\Ô\Ñ]Ô]Ð]ØŒ×Ò�X gÐ/AÅ9ÔCSÐUVÐXZÑ[Ô[Ñ\Ô\Ð\Ø Ô-×<Ò<¸TÕCUÔCeÑfÔfÑˆˆC�Ø�Š˜ÑÔÐØ×Ò˜Ô5°qÑ9Ô9Ð9Ð9Ð9r&   c           
      óÞ  — t          dddt          j        t          j        ¬¦  «        }|j                             t          ddt          j	        ddd	¬
¦  «        ¦  «         |j
                             t          ddt          j        dd¦  «        ¦  «         | j                             |t          j        ¦  «        \  }}}|                      |¦  «         |                      |j        t          j        ¦  «         |                      t)          |j        ¦  «        d¦  «         |                      |j        d         j        ¦  «         |                      t)          |j
        ¦  «        d¦  «         dS )uU   Uáº©n Ma Tháº¡ch scours Rare item, cleansing affixes while preserving fractured mods.Úcursed_body_04u   Huyáº¿t BÃ¬ GiÃ¡péV   r*   Úp_fracu    Báº¥t Diá»‡t Huyáº¿t Máº¡ch (T1)r0   é–   T)Úis_fracturedÚs_tempu   NÃ© TrÃ¡nh Nháº¹é
   é   r   N)r   r   ÚBODY_ARMOURr   rU   rQ   rR   r	   r   rS   rb   rc   r   r6   r   ÚUAN_MA_THACHr8   r9   r/   r5   Úlenrl   re   s        r$   Ú(test_uan_ma_thach_scour_cleanses_affixeszGTestSprint3EconomyAndBazaar2PC.test_uan_ma_thach_scour_cleanses_affixesq   sR  € åØ&Ø)ØÝÔ%Ý”?ð
ñ 
ô 
ˆð 	Œ×Ò�X hÐ0RÕT]ÔTdÐfgÐilÐ{ð  Añ  Aô  Añ  	Bô  	Bð  	BØŒ×Ò�X hÐ0BÅIÔDTÐVXÐZ\Ñ]Ô]Ñ^Ô^Ð^Ø Ô-×<Ò<¸TÕCUÔCbÑcÔcÑˆˆC�Ø�Š˜ÑÔÐØ×Ò˜œ­*Ô*;Ñ<Ô<Ð<Ø×Ò�˜XÔ.Ñ/Ô/°Ñ3Ô3Ð3Ø�Š˜Ô)¨!Ô,Ô9Ñ:Ô:Ð:Ø×Ò�˜XÔ.Ñ/Ô/°Ñ3Ô3Ð3Ð3Ð3r&   c                 ó”  — t          dddt          j        t          j        ¬¦  «        }|j                             t          ddt          j	        ddd	d
¬¦  «        ¦  «         | j
                             |t          j        ¦  «        \  }}}|                      |¦  «         |                      |d¦  «         |                      t!          |j        ¦  «        d¦  «         |                      |j        d         j                             d¦  «        ¦  «         |                      d|j        d         j        cxk    od
k    nc ¦  «         dS )uM   Háº¯c SÆ¡ Tháº¡ch rerolls tiers for existing affixes while preserving family.Úring_tier_05u   Cá»‘t Giá»›iéX   r*   Úpref_life_t14u   KhÃ­ Tá»©c SÆ¡ Khai (T14)é   é   rn   ro   )Útier_minÚtier_maxÚREROLL_TIERS_SUCCESSr0   r   Úpref_life_tN)r   r   ÚRINGr   r:   rQ   rR   r	   r   rS   r   r6   r   ÚHAC_SO_THACHr8   r9   rr   Úmod_idÚ
startswithÚtierre   s        r$   Útest_hac_so_thach_reroll_tiersz=TestSprint3EconomyAndBazaar2PC.test_hac_so_thach_reroll_tiersƒ   sO  € åØ$Ø$ØÝ”ÝÔ#ð
ñ 
ô 
ˆð 	Œ×Ò�X oÐ7RÕT]ÔTdÐfhÐjlÐwyð  EGð  Hñ  Hô  Hñ  	Iô  	Ið  	IØ Ô-×<Ò<¸TÕCUÔCbÑcÔcÑˆˆC�Ø�Š˜ÑÔÐØ×Ò˜Ð4Ñ5Ô5Ð5Ø×Ò�˜XÔ.Ñ/Ô/°Ñ3Ô3Ð3Ø�Š˜Ô)¨!Ô,Ô3×>Ò>¸}ÑMÔMÑNÔNÐNØ�Š˜˜XÔ.¨qÔ1Ô6Ð<Ð<Ò<Ð<¸"Ò<Ð<Ð<Ð<Ñ=Ô=Ð=Ð=Ð=r&   c                 ó^  — t          t          j        d¦  «        }t          t          j        d¦  «        }|                      ||dz  ¦  «         t	          dddt
          j        t          j        ¦  «        }| j	         
                    |t          j        d¬¦  «        }|                      |j        ¦  «         |                      |j        d¦  «         | j	         
                    |t          j        d	¬¦  «        }|                      |j        ¦  «         |                      |j        d
¦  «         dS )zMCrafting fee scales exponentially with iLvl; fails when gold is insufficient.é   r[   r`   Úcostly_baseõ   Tháº§n Kiáº¿mrn   )Úplayer_goldÚINSUFFICIENT_GOLD_FEEéPÃ  r   N)r   r   r7   ÚassertGreaterr   r   r4   r   r5   r   Úapply_primal_currencyÚassertFalseÚsuccessr9   Ústatus_coder8   Úgold_fee_consumed)r#   Úfee_lowÚfee_highrA   Úres_failÚres_oks         r$   Ú'test_exponential_gold_fee_and_depletionzFTestSprint3EconomyAndBazaar2PC.test_exponential_gold_fee_and_depletion”   s  € å-Õ.@Ô.PÐRTÑUÔUˆÝ.Õ/AÔ/QÐSUÑVÔVˆØ×Ò˜8 W¨q¡[Ñ1Ô1Ð1å˜M¨?¸BÅÔ@RÕT^ÔTeÑfÔfˆØÔ$×:Ò:¸4ÕASÔAcÐqsÐ:ÑtÔtˆØ×Ò˜Ô)Ñ*Ô*Ð*Ø×Ò˜Ô-Ð/FÑGÔGÐGàÔ"×8Ò8¸Õ?QÔ?aÐotÐ8ÑuÔuˆØ�Š˜œÑ'Ô'Ð'Ø×Ò˜6Ô3°QÑ7Ô7Ð7Ð7Ð7r&   c           	      ó„  — d}| j                              t          || j        ddd¦  «        ¦  «         | j                              | j        dd¦  «         | j                              | j        | j        |dd¦  «        \  }}}|                      |¦  «         |                      |¦  «         | j          	                    |¦  «        }|                      |j
        ¦  «         |                      |j        |¦  «         | j                              | j        | j        |dd¦  «        \  }}}|                      |¦  «         | j                              |¦  «        \  }	}|                      |	¦  «         | j          	                    |¦  «        }
|                      |
j        | j        ¦  «         |                      |
j
        ¦  «         dS )zO2PC Phase 1 prepares & locks item; Phase 2 commits transfer and updates ledger.Úsword_2pc_01u   TÃ  áº¢nh Kiáº¿mr7   éd   éÈ   N)r   Úupsert_itemr   r    Úset_balancer!   Úprepare_buyoutr8   ÚassertIsNotNoneÚget_itemÚ	is_lockedr9   Úlocked_by_txÚexecute_instant_buyoutr�   Úcommit_buyoutÚowner_account_id)r#   r+   Úprep_okrC   Útx_idÚlocked_itemÚfail_okÚfail_msgrG   Úcom_okÚtransferreds              r$   Ú%test_2pc_prepare_and_commit_lifecyclezDTestSprint3EconomyAndBazaar2PC.test_2pc_prepare_and_commit_lifecycle£   s¯  € à"ˆ	ØÔ×&Ò&¥y°¸D¼NÐL^Ð`qÐsvÑ'wÔ'wÑxÔxÐxØÔ×&Ò& t¤}Ð6GÈÑMÔMÐMà"Ô0×?Ò?ØŒM˜4œ>¨9Ð6GÈñ
ô 
Ñˆ��eð 	�Š˜Ñ Ô Ð Ø×Ò˜UÑ#Ô#Ð#ØÔ(×1Ò1°)Ñ<Ô<ˆØ�Š˜Ô-Ñ.Ô.Ð.Ø×Ò˜Ô1°5Ñ9Ô9Ð9ð  $Ô1×HÒHØŒM˜4œ>¨9Ð6GÈñ 
ô  
Ñˆ�˜1ð 	×Ò˜Ñ!Ô!Ð!ð Ô&×4Ò4°UÑ;Ô;‰	ˆ�Ø�Š˜ÑÔÐØÔ(×1Ò1°)Ñ<Ô<ˆØ×Ò˜Ô5°t´}ÑEÔEÐEØ×Ò˜Ô.Ñ/Ô/Ð/Ð/Ð/r&   c           	      óh  — d}| j                              t          || j        ddd¦  «        ¦  «         | j                              | j        dd¦  «         | j                              | j        | j        |dd¦  «        \  }}}|                      |¦  «         | j                              |d¦  «        \  }}|  	                    |¦  «         |  
                    d|¦  «         | j                              |¦  «        }|                      |j        | j        ¦  «         |  	                    |j        ¦  «         dS )	zE2PC Phase 2 abort unlocks item and reverts transaction state cleanly.Úbow_abort_02zMa Cungr7   é2   r˜   zBuyer aborted paymentÚTRANSACTION_ABORTEDN)r   rš   r   r    r›   r!   rœ   r8   Úabort_buyoutr�   ÚassertInrž   r9   r£   rŸ   )r#   r+   r¤   rG   r¥   Úabort_okÚ	abort_msgrA   s           r$   Ú$test_2pc_prepare_and_abort_lifecyclezCTestSprint3EconomyAndBazaar2PC.test_2pc_prepare_and_abort_lifecycle¿   s'  € à"ˆ	ØÔ×&Ò&¥y°¸D¼NÈIÐWhÐjlÑ'mÔ'mÑnÔnÐnØÔ×&Ò& t¤}Ð6GÈÑMÔMÐMà Ô.×=Ò=ØŒM˜4œ>¨9Ð6GÈñ
ô 
Ñˆ��Eð 	�Š˜Ñ Ô Ð à"Ô0×=Ò=¸eÐE\Ñ]Ô]Ñˆ�)Ø×Ò˜Ñ"Ô"Ð"Ø�ŠÐ+¨YÑ7Ô7Ð7àÔ!×*Ò*¨9Ñ5Ô5ˆØ×Ò˜Ô.°´Ñ?Ô?Ð?Ø×Ò˜œÑ(Ô(Ð(Ð(Ð(r&   c           	      ó€  — d}| j                              t          || j        ddd¦  «        ¦  «         | j                              | j        dd¦  «         | j                              | j        dd¦  «         | j                              | j        | j        |dd¦  «        \  }}}|                      |¦  «         |                      | j          	                    | j        d¦  «        d¦  «         |                      | j          	                    | j        d¦  «        d¦  «         |                      | j         j
        d¦  «         dS )	zMVerifies 5% market tax is deducted from seller credit and burned permanently.Úring_tax_03u   Cá»‘t Nháº«nr7   éè  r   i¶  r®   N)r   rš   r   r    r›   r!   r¡   r8   r9   Úget_balanceÚtotal_tax_burned)r#   r+   rB   rC   r¥   s        r$   Ú$test_anti_inflation_5pct_tax_burningzCTestSprint3EconomyAndBazaar2PC.test_anti_inflation_5pct_tax_burningÒ   s,  € à!ˆ	ØÔ×&Ò&¥y°¸D¼NÈNÐ\mÐosÑ'tÔ'tÑuÔuÐuØÔ×&Ò& t¤}Ð6GÈÑNÔNÐNØÔ×&Ò& t¤~Ð7HÈ!ÑLÔLÐLàÔ+×BÒBØŒM˜4œ>¨9Ð6GÈñ
ô 
‰ˆˆC�ð 	�Š˜ÑÔÐØ×Ò˜Ô+×7Ò7¸¼ÐGXÑYÔYÐ[\Ñ]Ô]Ð]Ø×Ò˜Ô+×7Ò7¸¼ÐHYÑZÔZÐ\_Ñ`Ô`Ð`Ø×Ò˜Ô+Ô<¸bÑAÔAÐAÐAÐAr&   c                 ó@  — t          dd¬¦  «        }|j                             d¦  «         |j                             d¦  «         |j                             ddd¦  «         t	          dd	d
t
          j        ¦  «        }|                     d|dd¦  «         |                     dd¦  «        \  }}}|  	                    |¦  «         |  
                    |¦  «         |                     t          ¦   «         ¦  «        }|                      t          |¦  «        d¦  «         dS )zRInstant Buyout via UniversalConsignmentVault delists item and transfers ownership.r   r   r   Úvault_sellerÚvault_buyerr7   éô  Úv_item_1u   Cuá»“ng Ma Nháº­nr[   r™   r   N)r   Úbuyout_enginer"   r›   r   r<   rW   Úlist_item_for_saleÚbuy_instantr8   r�   Úsearch_listingsr   r9   rr   )r#   ÚvaultrE   rB   rC   ÚtxÚlistingss          r$   Ú7test_instant_buyout_cross_account_via_consignment_vaultzVTestSprint3EconomyAndBazaar2PC.test_instant_buyout_cross_account_via_consignment_vaultá   s  € å)¸$È
ÐSÑSÔSˆØÔ×,Ò,¨^Ñ<Ô<Ð<ØÔ×,Ò,¨]Ñ;Ô;Ð;ØÔ×'Ò'¨Ð7HÈ#ÑNÔNÐNå˜
Ð$7¸½\Ô=RÑSÔSˆØ× Ò  °Ð7HÈ#ÑNÔNÐNà×'Ò'¨°zÑBÔB‰ˆˆC�Ø�Š˜ÑÔÐØ×Ò˜RÑ Ô Ð Ø×(Ò(­Ñ):Ô):Ñ;Ô;ˆØ×Ò�˜X™œ¨Ñ*Ô*Ð*Ð*Ð*r&   c                 ó†  — d}t          || j        dddd¬¦  «        }| j                             |¦  «         | j                             | j        dd¦  «         | j                             | j        | j        |dd¦  «        \  }}}|                      |¦  «         |                      d| 	                    ¦   «         ¦  «         d	S )
z@Scourge soulbound items are rejected from 2PC trade preparation.Úsoulbound_item_04u   Há»“n PhÃ¡ch Cá»‘tr7   r˜   T)Úis_scourge_soulboundr¾   Ú	soulboundN)
r   r    r   rš   r›   r!   r¡   r�   r±   Úlower)r#   r+   Ú	soul_itemrB   rC   rÅ   s         r$   Ú/test_scourge_soulbound_item_rejected_from_tradezNTestSprint3EconomyAndBazaar2PC.test_scourge_soulbound_item_rejected_from_tradeñ   sÏ   € à'ˆ	Ý˜i¨¬Ð9MÐO`Ðbeð  }Að  Bñ  Bô  Bˆ	ØÔ×&Ò& yÑ1Ô1Ð1ØÔ×&Ò& t¤}Ð6GÈÑMÔMÐMàÔ(×?Ò?ØŒM˜4œ>¨9Ð6GÈñ
ô 
‰ˆˆC�ð 	×Ò˜ÑÔÐØ�Š�k 3§9¢9¡;¤;Ñ/Ô/Ð/Ð/Ð/r&   c           	      ó  ‡ ‡‡— dŠt          ‰‰ j        ddd¦  «        }‰ j                             |¦  «         d}t	          j        ddi¦  «        Šˆfd„t          |¦  «        D ¦   «         }‰ j        j        5  ‰ j        j                             d|¦  «         d	d	d	¦  «         n# 1 swxY w Y   d
t          fˆ ˆfd„}t          j                             d¬¦  «        5 }t          |                     |t          |¦  «        ¦  «        ¦  «        }d	d	d	¦  «         n# 1 swxY w Y   d„ |D ¦   «         }d„ |D ¦   «         }‰                      t!          |¦  «        dd¦  «         ‰                      t!          |¦  «        dd¦  «         d„ |d	d…         D ¦   «         }	|	D ]!}
‰                      d|
v pd|
v d|
› �¦  «         Œ"‰ j        j                             ¦   «         }|                     d‰f¦  «         ‰                      |                     ¦   «         d         dd¦  «         ‰ j                             ‰¦  «        }‰                      |j        ‰ j        ¦  «         ‰                      |j                             d¦  «        ¦  «         d	S )zUSimulates 50,000 competing buyout requests on 1 single item: exactly 1 wins, 0% dupe.Úpinnacle_apex_sword_999u   VÃ´ Cá»±c Cá»• Ma Tráº£mr7   r¾   rŠ   r·   c                 ó   •— g | ]	}d |› �‰f‘Œ
S )Úswarm_buyer_© )Ú.0ÚiÚbalss     €r$   ú
<listcomp>zeTestSprint3EconomyAndBazaar2PC.test_50k_concurrent_buyout_stress_zero_duplication.<locals>.<listcomp>  s'   ø€ ÐMÐMÐM¸Ð,¨Ð,Ð,¨dÐ3ÐMÐMÐMr&   z"INSERT INTO accounts VALUES (?, ?)NÚidxc                 óR   •— ‰j                              d| › �‰j        ‰dd¬¦  «        S )NrÒ   r7   r¾   )Úbuyer_account_idÚseller_account_idr+   Úoffered_currencyÚoffered_amount)r   r¡   r    )rØ   r#   Útarget_uuids    €€r$   Úattempt_buyzfTestSprint3EconomyAndBazaar2PC.test_50k_concurrent_buyout_stress_zero_duplication.<locals>.attempt_buy
  s<   ø€ ØÔ%×<Ò<Ø!5°Ð!5Ð!5Ø"&¤.Ø%Ø!2Ø"ð =ñ ô ð r&   é   )Úmax_workersc                 ó"   — g | ]}|d          ¯
|‘ŒS ©r   rÓ   ©rÔ   Úrs     r$   r×   zeTestSprint3EconomyAndBazaar2PC.test_50k_concurrent_buyout_stress_zero_duplication.<locals>.<listcomp>  s!   € Ð0Ð0Ð0˜1¨1¨Q¬4Ð0�QÐ0Ð0Ð0r&   c                 ó"   — g | ]}|d          °
|‘ŒS rã   rÓ   rä   s     r$   r×   zeTestSprint3EconomyAndBazaar2PC.test_50k_concurrent_buyout_stress_zero_duplication.<locals>.<listcomp>  s!   € Ð3Ð3Ð3˜!¨a°¬dÐ3�AÐ3Ð3Ð3r&   r0   z.Exactly 1 buyer must succeed in 50k contentioniOÃ  z%All 49,999 competing buyers must failc                 ó   — h | ]
}|d          ’ŒS )r0   rÓ   )rÔ   Úfs     r$   ú	<setcomp>zdTestSprint3EconomyAndBazaar2PC.test_50k_concurrent_buyout_stress_zero_duplication.<locals>.<setcomp>  s   € Ð;Ð;Ð;¨˜q œtÐ;Ð;Ð;r&   r®   ÚITEM_ALREADY_SOLDr¯   zUnexpected failure reason: z.SELECT COUNT(*) FROM items WHERE item_uuid = ?r   z6Item must exist exactly once in the database (0% dupe)rÒ   )r   r    r   rš   ÚjsonÚdumpsÚrangeÚconnÚexecutemanyÚintÚ
concurrentÚfuturesÚThreadPoolExecutorÚlistÚmapr9   rr   r8   ÚcursorÚexecuteÚfetchonerž   ÚassertNotEqualr£   r�   )r#   Ú
apex_swordÚtotal_txÚbulk_accountsrß   ÚpoolÚresultsÚ	successesÚfailuresÚsample_fail_reasonsÚreasonÚcurrA   rÖ   rÞ   s   `            @@r$   Ú2test_50k_concurrent_buyout_stress_zero_duplicationzQTestSprint3EconomyAndBazaar2PC.test_50k_concurrent_buyout_stress_zero_duplicationþ   sI  øøø€ à/ˆÝ˜{¨D¬NÐ<VÐXiÐknÑoÔoˆ
ØÔ×&Ò& zÑ2Ô2Ð2àˆÝŒzÐ,¨dÐ3Ñ4Ô4ˆØMÐMÐMÐM½UÀ8¹_¼_ÐMÑMÔMˆØÔÔ$ð 	eð 	eØÔÔ#×/Ò/Ð0TÐVcÑdÔdÐdð	eð 	eð 	eñ 	eô 	eð 	eð 	eð 	eð 	eð 	eð 	eøøøð 	eð 	eð 	eð 	eð	�Sð 	ð 	ð 	ð 	ð 	ð 	ð 	õ Ô×2Ò2¸rÐ2ÑBÔBð 	CÀdÝ˜4Ÿ8š8 Kµ°x±´ÑAÔAÑBÔBˆGð	Cð 	Cð 	Cñ 	Cô 	Cð 	Cð 	Cð 	Cð 	Cð 	Cð 	Cøøøð 	Cð 	Cð 	Cð 	Cð 1Ð0 Ð0Ñ0Ô0ˆ	Ø3Ð3˜wÐ3Ñ3Ô3ˆà×Ò�˜Y™œ¨Ð,\Ñ]Ô]Ð]Ø×Ò�˜X™œ¨Ð/VÑWÔWÐWð <Ð;¨X°c°r°c¬]Ð;Ñ;Ô;ÐØ)ð 	ð 	ˆFØ�OŠOØ# vÐ-ÐPÐ1FÈ&Ð1PØ6¨fÐ6Ð6ñô ð ð ð Ô Ô%×,Ò,Ñ.Ô.ˆØ�ŠÐDÀ{ÀnÑUÔUÐUØ×Ò˜Ÿš™œ¨Ô*¨AÐ/gÑhÔhÐhàÔ!×*Ò*¨;Ñ7Ô7ˆØ×Ò˜DÔ1°4´>ÑBÔBÐBØ�Š˜Ô-×8Ò8¸ÑHÔHÑIÔIÐIÐIÐIs$   Á7!B$Â$B(Â+B(Ã1DÄDÄ!Dc           	      óò  — t          dd¬¦  «        }|                     d¦  «         |                     d¦  «         |                     ddd¦  «         |                     t	          ddd	dd¦  «        ¦  «         |                     t	          d
dddd¦  «        ¦  «         |                     ddddd¦  «        \  }}}|                      |¦  «         |                      |                     dd¦  «        dd¦  «         |                     ddd
dd¦  «        \  }}}|  	                    |¦  «         |  
                    d|¦  «         |                     |¦  «        \  }}|                      |¦  «         |                      |                     dd¦  «        d¦  «         |                      |                     d¦  «        j        d¦  «         |                      |                     d
¦  «        j        d¦  «         dS )zLVerifies Phase 1 escrow prevents double-spending currency on multiple items.r   r   r   Ú	seller_dsÚbuyer_dsr7   r˜   Ú	item_ds_1u   RÃ¬u 1Ú	item_ds_2u   RÃ¬u 2r   z!Funds must be escrowed in Phase 1zInsufficient fundsN)r   r"   r›   rš   r   rœ   r8   r9   r¸   r�   r±   r¢   rž   r£   )r#   ÚengineÚok1rG   Útx1Úok2Úmsg2Úcom1s           r$   Ú test_2pc_double_spend_preventionz?TestSprint3EconomyAndBazaar2PC.test_2pc_double_spend_prevention-  sì  € å$°TÀ:ÐNÑNÔNˆØ×Ò Ñ,Ô,Ð,Ø×Ò 
Ñ+Ô+Ð+Ø×Ò˜:Ð'8¸#Ñ>Ô>Ð>Ø×Ò�9 [°+¸xÐIZÐ\_Ñ`Ô`ÑaÔaÐaØ×Ò�9 [°+¸xÐIZÐ\_Ñ`Ô`ÑaÔaÐaà×+Ò+¨J¸À[ÐRcÐehÑiÔi‰ˆˆQ�Ø�Š˜ÑÔÐØ×Ò˜×+Ò+¨JÐ8IÑJÔJÈAÐOrÑsÔsÐsà×,Ò,¨Z¸ÀkÐSdÐfiÑjÔj‰ˆˆT�1Ø×Ò˜ÑÔÐØ�ŠÐ*¨DÑ1Ô1Ð1à×&Ò& sÑ+Ô+‰ˆˆaØ�Š˜ÑÔÐØ×Ò˜×+Ò+¨JÐ8IÑJÔJÈAÑNÔNÐNØ×Ò˜Ÿš¨Ñ5Ô5ÔFÈ
ÑSÔSÐSØ×Ò˜Ÿš¨Ñ5Ô5ÔFÈÑTÔTÐTÐTÐTr&   c           	      óŠ  — t          dd¬¦  «        }|                     d¦  «         |                     d¦  «         |                     ddd¦  «         |                     t	          ddd	dd¦  «        ¦  «         |                     ddddd¦  «        \  }}}|                      |¦  «         |                      |                     dd¦  «        d
¦  «         | 	                    |d¦  «         |                      |                     dd¦  «        dd¦  «         |  
                    |                     d¦  «        j        ¦  «         dS )zGVerifies Phase 2 abort refunds escrowed currency back to buyer balance.r   r   r   Ú	seller_abÚbuyer_abr7   r˜   Úitem_abort_2u   Ä�aor   zTest cancellationzFunds must be restored on abortN)r   r"   r›   rš   r   rœ   r8   r9   r¸   r°   r�   rž   rŸ   )r#   r
  rB   rG   r¥   s        r$   Ú%test_2pc_abort_refunds_escrowed_fundszDTestSprint3EconomyAndBazaar2PC.test_2pc_abort_refunds_escrowed_fundsD  sA  € å$°TÀ:ÐNÑNÔNˆØ×Ò Ñ,Ô,Ð,Ø×Ò 
Ñ+Ô+Ð+Ø×Ò˜:Ð'8¸#Ñ>Ô>Ð>Ø×Ò�9 ^°[À&ÐJ[Ð]`ÑaÔaÑbÔbÐbà×,Ò,¨Z¸ÀnÐVgÐilÑmÔm‰ˆˆAˆuØ�Š˜ÑÔÐØ×Ò˜×+Ò+¨JÐ8IÑJÔJÈAÑNÔNÐNà×Ò˜EÐ#6Ñ7Ô7Ð7Ø×Ò˜×+Ò+¨JÐ8IÑJÔJÈCÐQrÑsÔsÐsØ×Ò˜Ÿš¨Ñ8Ô8ÔBÑCÔCÐCÐCÐCr&   c           	      óz  — | j                              t          d| j        ddd¦  «        ¦  «         | j                              | j        dd¦  «         | j                              | j        | j        ddd¦  «        \  }}}|                      |¦  «         |                      d|                     ¦   «         ¦  «         dS )z0Verifies accounts cannot buy their own listings.Ú	self_itemu   Tá»± Mua Kiáº¿mr7   r®   r˜   zown listingN)	r   rš   r   r    r›   r¡   r�   r±   rÌ   )r#   rB   rC   rG   s       r$   Útest_2pc_self_trade_rejectionz<TestSprint3EconomyAndBazaar2PC.test_2pc_self_trade_rejectionT  s²   € àÔ×&Ò&¥y°¸d¼nÐN_ÐarÐtvÑ'wÔ'wÑxÔxÐxØÔ×&Ò& t¤~Ð7HÈ#ÑNÔNÐNØÔ'×>Ò>ØŒN˜DœN¨KÐ9JÈBñ
ô 
‰
ˆˆC�ð 	×Ò˜ÑÔÐØ�Š�m S§Y¢Y¡[¤[Ñ1Ô1Ð1Ð1Ð1r&   c           	      óö  — ddl }|                     dd¬¦  «        5 }|j        }ddd¦  «         n# 1 swxY w Y   	 t          d|¬¦  «        }|                     d¦  «         |                     d	¦  «         |                     d	d
d¦  «         |                     t          dddd
d¦  «        ¦  «         |                     d	ddd
d¦  «        \  }}}|  	                    |¦  «         |  
                    |                     d¦  «        j        d	¦  «         |j                             ¦   «          	 t          j        |¦  «         dD ];}t          j                             ||z   ¦  «        rt          j        ||z   ¦  «         Œ<dS # t&          $ r Y dS w xY w# 	 t          j        |¦  «         dD ];}t          j                             ||z   ¦  «        rt          j        ||z   ¦  «         Œ<w # t&          $ r Y w w xY wxY w)z\Verifies multi-threaded concurrency on a real file-backed SQLite database with busy timeout.r   Nz.dbF)ÚsuffixÚdeleter   r   Úf_sellerÚf_buyerr7   r·   Úf_itemr‡   r™   )z-walz-shm)ÚtempfileÚNamedTemporaryFileÚnamer   r"   r›   rš   r   r¡   r8   r9   rž   r£   rî   ÚcloseÚosÚremoveÚpathÚexistsÚOSError)	r#   r  ÚtmpÚtmp_pathÚfile_enginerB   rC   rÅ   Úexts	            r$   Ú#test_file_backed_sqlite_concurrencyzBTestSprint3EconomyAndBazaar2PC.test_file_backed_sqlite_concurrency^  sq  € àˆˆˆØ×(Ò(°¸eÐ(ÑDÔDð 	 ÈØ”xˆHð	 ð 	 ð 	 ñ 	 ô 	 ð 	 ð 	 ð 	 ð 	 ð 	 ð 	 øøøð 	 ð 	 ð 	 ð 	 ð	Ý-¸dÈHÐUÑUÔUˆKØ×(Ò(¨Ñ4Ô4Ð4Ø×(Ò(¨Ñ3Ô3Ð3Ø×#Ò# IÐ/@À$ÑGÔGÐGØ×#Ò#¥I¨h¸
ÀOÐUfÐhkÑ$lÔ$lÑmÔmÐmà%×<Ò<Ø˜: xÐ1BÀCñô ‰KˆB��Rð �OŠO˜BÑÔÐØ×Ò˜[×1Ò1°(Ñ;Ô;ÔLÈiÑXÔXÐXØÔ×"Ò"Ñ$Ô$Ð$ðÝ”	˜(Ñ#Ô#Ð#Ø+ð 2ð 2�CÝ”w—~’~ h°¡nÑ5Ô5ð 2Ýœ	 (¨S¡.Ñ1Ô1Ð1øð2ð 2øõ ð ð ð Ø��ðøøøøðÝ”	˜(Ñ#Ô#Ð#Ø+ð 2ð 2�CÝ”w—~’~ h°¡nÑ5Ô5ð 2Ýœ	 (¨S¡.Ñ1Ô1Ð1øð2øõ ð ð ð Ø�ðøøøøøøsP   œ0°4·4¼C1F Ä.AF Æ
FÆFÆG8ÆAG(Ç'G8Ç(
G5Ç2G8Ç4G5Ç5G8N)Ú__name__Ú
__module__Ú__qualname__r%   rH   rX   rf   rs   rƒ   r•   r«   r´   rº   rÇ   rÎ   r  r  r  r  r,  rÓ   r&   r$   r   r   1   s   € € € € € ð;ð ;ð ;ð>ð >ð >ð&=ð =ð =ð(:ð :ð :ð4ð 4ð 4ð$>ð >ð >ð"8ð 8ð 8ð0ð 0ð 0ð8)ð )ð )ð&Bð Bð Bð+ð +ð +ð 0ð 0ð 0ð-Jð -Jð -Jð^Uð Uð Uð.Dð Dð Dð 2ð 2ð 2ðð ð ð ð r&   r   Ú__main__).Ú__doc__ÚbuiltinsÚ@py_builtinsÚ_pytest.assertion.rewriteÚ	assertionÚrewriteÚ
@pytest_arÚconcurrent.futuresrñ   rë   r#  ÚsysÚunittestr%  ÚabspathÚjoinÚdirnameÚ__file__ÚPROJECT_ROOTÚ
SERVER_DIRÚinsertÚ server.world.item_crafting_typesr   r   r   r   r   r	   Ú!server.world.item_crafting_enginer
   r   Ú#server.world.primal_stones_craftingr   r   r   r<   Úserver.trade.two_phase_commitr   r   Úserver.trade.consignment_vaultr   r   ÚTestCaser   r-  ÚmainrÓ   r&   r$   ú<module>rI     s>  ððð ð € € € € € € € € € € € € Ð Ð Ð Ð Ø €€€Ø 	€	€	€	Ø 
€
€
€
Ø €€€àŒw�Š˜rœwŸ|š|¨B¬G¯OªO¸HÑ,EÔ,EÀwÑOÔOÑPÔP€ØŒW�\Š\˜,¨Ñ1Ô1€
Ø�S”XÐÐØ„H‡O‚O�A�zÑ"Ô"Ð"Ø�s”xÐÐØ„H‡O‚O�A�|Ñ$Ô$Ð$ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð
ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ðGð Gð Gð Gð G XÔ%6ñ Gô Gð GðT
 ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr&   