
    :
j(                        d dl mZ d dlmZ d dlZd dl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mZmZ d dlmZ d d	lmZ d
 Zd ZddZddZddZddZddZddZddZ ddZ!ddZ"y)    )annotations)DecimalN)create_crypto_assetget_crypto_asset)calculate_crypto_holdingscreate_initial_holding_snapshot)record_crypto_buyrecord_crypto_sellrecord_crypto_transfer)create_walletdeactivate_wallet
get_walletupdate_wallet)connect_memory)apply_migrationsc                     t               } t        |        | j                  d       | j                  d       | j                          | S )NzINSERT INTO platforms(platform_id, name, platform_type, default_currency, created_at) VALUES('p1','Synthetic Broker','Bank/Broker','CHF','now')zINSERT INTO accounts(account_id, platform_id, account_name, account_type, currency, created_at) VALUES('a1','p1','Synthetic Cash','cash','CHF','now'))r   r   executecommit)conns    tests/unit/test_crypto_core.py
setup_connr      sH    DTLL 	Z 	LL 	` 	KKMK    c                    t        | dd      }t        | dd      }t        | ddd	      }t        | d
dd	      }||||fS )NzSynthetic Cold WalletHardware Walletwallet_namewallet_typezSynthetic Exchange WalletExchangeSynthetic BitcoinBTCbitcoin	coin_namesymbolcoingecko_idzSynthetic EtherETHethereum)r   r   )r   w1w2btceths        r   seed_wallets_assetsr,      sU    	t)@N_	`B	t)DR\	]B
d.A%^g
hC
d.?\f
gCr3r   c                    t               } t        | dd      }t        | |      }|d   dk(  sJ |d   J t        j                  t
        d      5  t        | dd       d d d        t        j                  t
        d      5  t        | d	d
       d d d        t        | |dd       t        | |      d   dk(  sJ t        | |d       t        | |      d   dk(  sJ y # 1 sw Y   xY w# 1 sw Y   [xY w)NzSynthetic Wallet Alphar   r   r   wallet_addressmatchzSoftware Walletr   zSynthetic Bad TypezMoon BagDeFizsynthetic update)r   noteszsynthetic retire)note	is_activer   )r   r   r   pytestraises
ValueErrorr   r   )r   	wallet_idwallets      r   Dtest_wallet_create_read_update_deactivate_and_duplicate_name_blockedr:   $   s   <Dd0HVghIi(F- $<<<<"#+++	z	7 ad(@N_`a	z	7 Vd(<*UV $	v=OPdI&}5???dI,>?dI&{3q888a aV Vs   C C, C),C5c                 n   t               } t        | ddd      }t        | |      d   dk(  sJ t        | ddd      }t        | |      d   dk(  sJ | j                  d	      j	                         }|sJ t        | d
d      }t        | |      d   J | j                  d      j	                         }|sJ y )Nr   r    r!   r"   r%   zSynthetic Bitcoin Wrapperzwrapped-bitcoinr$   z;SELECT * FROM alerts WHERE rule_id='crypto_symbol_conflict'zSynthetic Mystery CoinMYST)r#   r$   z9SELECT * FROM alerts WHERE rule_id='missing_coingecko_id')r   r   r   r   fetchall)r   a1a2symbol_alertsa3missing_alertss         r   Htest_crypto_asset_with_and_without_coingecko_and_symbol_conflict_warningrC   6   s    <D	T-@]f	gBD"%n5BBB	T-HQVev	wBD"%h/5888LL!^_hhjM=	T-Ef	UBD"%n5===\\"]^ggiN>r   c                 ^   t               } t        |       \  }}}}t        | ||t        d      ddt        d      d       t        | ||t        d      dt        d	      d
       t	        |       }|j
                  ||f   j                  t        d      k(  sJ |j
                  ||f   j                  t        d      k(  sJ |j                  |   j                  t        d      k(  sJ |j
                  ||f   j                  t        d      k(  sJ |j
                  ||f   j                  J y )Nz1.25verifiedz2026-01-01T00:00:00Z50000synthetic snapshot)asset_idr8   quantityverification_statuslast_verified_atlegacy_snapshot_value_chfr3   z0.75stale30000)rH   r8   rI   rJ   rL   r3   z2.00)
r   r,   r   r   r   wallet_holdingsrI   total_by_assetrL   current_value_chf)r   r(   r)   r*   _holdingss         r   Utest_initial_crypto_holdings_multiple_wallets_aggregate_and_legacy_values_not_currentrT   F   s-   <D(.NBC#sb76?Xb/7SZK[bv $sb76?X_")'"29M
 ).H##RI.7776?JJJ##RI.7776?JJJ""3'00GFOCCC##RI.HHGT[L\\\\##RI.@@HHHr   c            
        t               } t        |       \  }}}}t        | ||t        d      dd       t	        | |||t        d      t        d      dd	      }t        |       }|j                  ||f   j                  t        d
      k(  sJ |j                  ||f   j                  t        d      k(  sJ | j                  d|f      j                         d   dk(  sJ | j                  d      j                         d   dk(  sJ y )N2rE   rG   rH   r8   rI   rJ   r3   z0.50.01synthetic_tx_hash_001zsynthetic transfer)rH   from_wallet_idto_wallet_idrI   fee_quantitytx_hashr3   z1.49zNSELECT transaction_type FROM crypto_transactions WHERE crypto_transaction_id=?transaction_typetransferzBSELECT COUNT(*) AS c FROM audit_log WHERE action='crypto_transfer'c   )
r   r,   r   r   r   r   rO   rI   r   fetchone)r   r(   r)   r*   rR   txidrS   s          r   5test_transfer_between_wallets_with_coin_fee_and_auditrd   Z   s&   <D(.NBC#D3"wWZ|q{  CW  X!s2BQVV_.EL`D
 ).H##RI.7776?JJJ##RI.7775>III<<hkojqr{{}  Q  R  V`  `  `  `<<\]ffhilmqrrrrr   c            
        t               } t        |       \  }}}}t        | ||t        d      dd       t	        j
                  t        d      5  t        | |||t        d      d	       d d d        t	        j
                  t        d
      5  t        | |||t        d      d	       d d d        | j                  d      j                         }|r|d   d   dk(  sJ y # 1 sw Y   vxY w# 1 sw Y   DxY w)N0.1rE   rG   rW   	differentr/   rX   zbad synthetic transfer)rH   rZ   r[   rI   r3   negative1zoverdraft synthetic transferzCSELECT * FROM alerts WHERE rule_id='crypto_negative_wallet_balance'r   prioritykritisch)
r   r,   r   r   r5   r6   r7   r   r   r=   )r   r(   r)   r*   rR   alertss         r   @test_transfer_same_wallet_and_overdraft_are_rejected_or_criticalrm   k   s   <D(.NBC#D3"wW\~s}  EY  Z	z	5 Ptc"SU`ghn`o  wO  	PP	z	4 Stc"SU`ghk`l  tR  	SS\\_`iikFfQi
+z9999P PS Ss   C C, C),C5c                    t               } t        |       \  }}}}t        | d||t        d      t        d      t        d      dt        d      d
      }| j	                  d	|f      j                         }|d
   J | j	                  d|d
   f      j                         }|d   dk(  sJ |d   |k(  sJ t        |d         t        d      k(  sJ t        |       j                  ||f   j                  t        d      k(  sJ y )Nr>   0.2100010CHFri   zsynthetic buy)	
account_idrH   r[   rI   gross_amount_originalfee_originalcurrencyfx_rate_to_chfr3   LSELECT transaction_id FROM crypto_transactions WHERE crypto_transaction_id=?transaction_idz`SELECT transaction_type, source_id, net_amount_original FROM transactions WHERE transaction_id=?r^   buy	source_idnet_amount_original)	r   r,   r	   r   r   rb   r   rO   rI   )r   r(   rR   r*   crypto_txidrowledgers          r   Btest_crypto_buy_with_fiat_creates_ledger_link_and_increases_walletr   x   s8   <D'-MB3#"wu~%foGDMTYjqrujvK
 ,,ehsgu
v

  BC ,,,\\|  @C  DT  @U  W  X  a  a  cF$%...++---6/01WV_DDD$T*::B9ENNRYZ_R````r   c                    t               } t        |       \  }}}}t        | ||t        d      dd       t	        | d||t        d      t        d      t        d      d	t        d      d

      }| j                  d|f      j                         d   }| j                  d|f      j                         }|d   dk(  sJ t        |d         t        d      k(  sJ t        |       j                  ||f   j                  t        d      k(  sJ y )Nri   rE   rG   rW   r>   z0.4200020rr   zsynthetic sell)	rs   rH   rZ   rI   rt   ru   rv   rw   r3   rx   ry   zUSELECT transaction_type, net_amount_original FROM transactions WHERE transaction_id=?r^   partial_sellr|   1980z0.6)
r   r,   r   r   r
   r   rb   r   rO   rI   )r   r(   rR   r*   r}   linkedr   s          r   Atest_crypto_sell_with_fiat_creates_ledger_link_and_reduces_walletr      s.   <D'-MB3#D3"wWZ|q{  CW  X$BQV%foGDMTYjqrujvK
 \\hkvjxy  C  C  E  FV  WF\\qtzs|}  G  G  IF$%7776/01WV_DDD$T*::B9ENNRYZ_R````r   c                 v   t               } t        |       \  }}}}t        | ||t        d      dd       t	        | |||t        d      t        d      d       t        |       j                  ||f   j                  t        d	      k(  sJ t        | d
||t        d      t        d      t        d      ddt        d      d       | j                  d      j                         }t        |      dk(  sJ t        |d   d         t        d      k(  sJ | j                  d      j                         d   dk\  sJ y )Nri   rE   rG   rW   ro   z0.03zsynthetic coin fee)rH   rZ   r[   rI   r\   r3   z0.77r>   rf   5005rr   zsynthetic fiat fee
rs   rH   r[   rI   rt   ru   fee_currencyrv   rw   r3   zPSELECT * FROM transactions WHERE transaction_type='fee' AND source_type='crypto'ra   r   rt   zTSELECT COUNT(*) AS c FROM audit_log WHERE action IN ('crypto_buy','crypto_transfer')r`      )r   r,   r   r   r   r   rO   rI   r	   r   r=   lenrb   )r   r(   r)   r*   rR   fee_rowss         r   Utest_coin_fee_reduces_balance_and_fiat_fee_creates_ledger_fee_without_double_countingr      sd   <D(.NBC#D3"wWZ|q{  CW  X4#br\cdi\j  zA  BH  zI  Pd  e$T*::B9ENNRYZ`Raaaa"wu~%en73<V[fk  }D  EH  }I!
 ||noxxzHx=A8A;678GCLHHH<<noxxz{~  DE  E  E  Er   c                 N   t               } t        |       \  }}}}t        | d||t        d      t        d      t        d      d dd d       | j	                  d      j                         }|d	   d
k(  sJ |d   dk(  sJ | j	                  d      j                         d   dk(  sJ y )Nr>   rf   100ri   USDzsynthetic missing fxr   zhSELECT fx_status, quality_status FROM transactions WHERE source_type='crypto' AND transaction_type='buy'	fx_statusmissingquality_status
incompletezLSELECT COUNT(*) AS c FROM alerts WHERE rule_id='crypto_fee_currency_unclear'r`   ra   )r   r,   r	   r   r   rb   )r   r(   rR   r*   r   s        r   >test_crypto_buy_missing_fx_is_incomplete_and_fee_unclear_warnsr      s    <D'-MB3"wu~%en73<VZt2H
 \\  E  F  O  O  QF+)+++"#|333<<fgpprsvw{||||r   )returnNone)#
__future__r   decimalr   r5   jarvis_finance.crypto.assetsr   r   jarvis_finance.crypto.holdingsr   r   "jarvis_finance.crypto.transactionsr	   r
   r   jarvis_finance.crypto.walletsr   r   r   r   jarvis_finance.storage.databaser   !jarvis_finance.storage.migrationsr   r   r,   r:   rC   rT   rd   rm   r   r   r   r    r   r   <module>r      sc    "   N e l l e e : >
9$ I(s"
:a"a E$}r   