
    mj                        d dl mZ d dlZd dlmc mZ d dlZd dl	m
Z
 d dlmZ d dlmZ d dlmZmZ ddZddZddZddZdS )    )annotationsN)Path)
create_app)TradeApprovalRequest)build_crypto_trader_snapshotrecord_trade_approvalpathr   payloaddictreturnNonec                    | j                             dd           |                     t          j        |          d           d S )NTparentsexist_okutf-8encoding)parentmkdir
write_textjsondumps)r	   r
   s     P/home/agent/.hermes/repos/FinanceManager/tests/unit/test_crypto_trader_bridge.py_write_jsonr      sC    KdT222OODJw'''O:::::    rows
list[dict]c                    | j                             dd           |                     d                    d |D                       dz   d           d S )NTr   
c              3  >   K   | ]}t          j        |          V  d S )N)r   r   ).0rows     r   	<genexpr>z _append_jsonl.<locals>.<genexpr>   s*      >>#djoo>>>>>>r   r   r   )r   r   r   join)r	   r   s     r   _append_jsonlr&      sZ    KdT222OODII>>>>>>>EPWOXXXXXr   tmp_pathc                .   |                     dt          | dz                       | dz  }|                     dt          |                     |dz  dz  }t          |dz  dz  d	dd
d
d
d
dddddii           t          |dz  dddddddddddd	ii           t          |dz  dddd
ddd
dg           t          |dz  d z  d!d"d#d$g d%g d&d!d%d%d'd(           t          |d)z  i d*d+d,dd-dd.d/d0d1d2dd3d4d5dd6d7d8d9d:d;d<d;d=d>d?d$d@dAdBdCdDd
g           |dz                      d
d
E           |dz  dFz                      dGdHI           t          |          }|j        }|j        }d!}||k    }|st          j
        dJ|fdK||f          dLt          j                    v st          j        |          rt          j        |          ndLt          j        |          t          j        |          t          j        |          dMz  }	dNdO|	iz  }
t          t          j        |
                    d x}x}x}}|j        }|j        }dP}||u }|st          j
        dQ|fdR||f          dLt          j                    v st          j        |          rt          j        |          ndLt          j        |          t          j        |          t          j        |          dMz  }	dNdO|	iz  }
t          t          j        |
                    d x}x}x}}|j        j        d%         }|j        }d
}||u }|st          j
        dQ|fdS||f          t          j        |          t          j        |          t          j        |          dTz  }dUdV|iz  }t          t          j        |                    d x}x}x}}|j        }|j        }dW}||k    }|st          j
        dJ|fdX||f          dLt          j                    v st          j        |          rt          j        |          ndLt          j        |          t          j        |          t          j        |          dMz  }	dNdO|	iz  }
t          t          j        |
                    d x}x}x}}|j        j        d%         }|j        }d}||k    }|st          j
        dJ|fdY||f          t          j        |          t          j        |          t          j        |          dTz  }dUdV|iz  }t          t          j        |                    d x}x}x}}|j        j        d%         }|j        }dZ}||k    }|st          j
        dJ|fd[||f          t          j        |          t          j        |          t          j        |          dTz  }dUdV|iz  }t          t          j        |                    d x}x}x}}|j        j        d%         }|j        }d7}||k    }|st          j
        dJ|fd\||f          t          j        |          t          j        |          t          j        |          dTz  }dUdV|iz  }t          t          j        |                    d x}x}x}}|j        }|j        }d7}||k    }|st          j
        dJ|fd]||f          dLt          j                    v st          j        |          rt          j        |          ndLt          j        |          t          j        |          t          j        |          dMz  }	dNdO|	iz  }
t          t          j        |
                    d x}x}x}}|j        }|j        }d^}||k    }|st          j
        dJ|fd_||f          dLt          j                    v st          j        |          rt          j        |          ndLt          j        |          t          j        |          t          j        |          dMz  }	dNdO|	iz  }
t          t          j        |
                    d x}x}x}}|j        }|j        }d#}||k    }|st          j
        dJ|fd`||f          dLt          j                    v st          j        |          rt          j        |          ndLt          j        |          t          j        |          t          j        |          dMz  }	dNdO|	iz  }
t          t          j        |
                    d x}x}x}}|j        j        da         }|j        }d7}||k    }|st          j
        dJ|fdb||f          t          j        |          t          j        |          t          j        |          dTz  }dUdV|iz  }t          t          j        |                    d x}x}x}}|j        j         d%         }|j!        }d}||k    }|st          j
        dJ|fdc||f          t          j        |          t          j        |          t          j        |          dTz  }dUdV|iz  }t          t          j        |                    d x}x}x}}|j        j         d%         }|j        }d7}||k    }|st          j
        dJ|fd\||f          t          j        |          t          j        |          t          j        |          dTz  }dUdV|iz  }t          t          j        |                    d x}x}x}}|j        }|j"        }d7}||k    }|st          j
        dJ|fdd||f          dLt          j                    v st          j        |          rt          j        |          ndLt          j        |          t          j        |          t          j        |          dMz  }	dNdO|	iz  }
t          t          j        |
                    d x}x}x}}|j        }|j#        }d!}||k    }|st          j
        dJ|fde||f          dLt          j                    v st          j        |          rt          j        |          ndLt          j        |          t          j        |          t          j        |          dMz  }	dNdO|	iz  }
t          t          j        |
                    d x}x}x}}|j        }|j$        }d"}||k    }|st          j
        dJ|fdf||f          dLt          j                    v st          j        |          rt          j        |          ndLt          j        |          t          j        |          t          j        |          dMz  }	dNdO|	iz  }
t          t          j        |
                    d x}x}x}}dg |j        j%        D             }h dh}||k    }|slt          j
        di|fdj||f          t          j        |          t          j        |          dkz  }dldm|iz  }t          t          j        |                    d x}x}}|j&        d%         }|j'        }dn}||k    }|st          j
        dJ|fdo||f          t          j        |          t          j        |          t          j        |          dTz  }dUdV|iz  }t          t          j        |                    d x}x}x}}|j&        d%         }|j(        }dP}||u }|st          j
        dQ|fdp||f          t          j        |          t          j        |          t          j        |          dTz  }dUdV|iz  }t          t          j        |                    d x}x}x}}|j)        d%         }|j        }d}||k    }|st          j
        dJ|fdY||f          t          j        |          t          j        |          t          j        |          dTz  }dUdV|iz  }t          t          j        |                    d x}x}x}}|j)        d%         }|j*        }dq}||k    }|st          j
        dJ|fdr||f          t          j        |          t          j        |          t          j        |          dTz  }dUdV|iz  }t          t          j        |                    d x}x}x}}|j)        d%         }|j(        }dP}||u }|st          j
        dQ|fdp||f          t          j        |          t          j        |          t          j        |          dTz  }dUdV|iz  }t          t          j        |                    d x}x}x}}|j+        d%         }|j        }dP}||u }|st          j
        dQ|fds||f          t          j        |          t          j        |          t          j        |          dTz  }dUdV|iz  }t          t          j        |                    d x}x}x}}tY          t[          |j)        d%         j.        dtd
duv                    }|j        }dw}||k    }|st          j
        dJ|fdx||f          dyt          j                    v st          j        |          rt          j        |          ndyt          j        |          t          j        |          dzz  }d{d||iz  }	t          t          j        |	                    d x}x}}|j(        }dP}||u }|st          j
        dQ|fd}||f          dyt          j                    v st          j        |          rt          j        |          ndyt          j        |          t          j        |          dzz  }d{d||iz  }	t          t          j        |	                    d x}x}}d}| |z  }d~}||z  }d}||z  }|j/        } |            }|sddt          j                    v st          j        |           rt          j        |           ndt          j        |          t          j        |          t          j        |          t          j        |          t          j        |          dz  }t          t          j        |                    d x}x}x}x}x}x}x}}| dz  d~z  dz  0                    dHI          1                                }te          j3        |da                   }|d-         }d}||k    }|slt          j
        dJ|fd||f          t          j        |          t          j        |          dkz  }dldm|iz  }t          t          j        |                    d x}x}}|d,         }d}||k    }|slt          j
        dJ|fd||f          t          j        |          t          j        |          dkz  }dldm|iz  }t          t          j        |                    d x}x}}|d         }d}||k    }|slt          j
        dJ|fd||f          t          j        |          t          j        |          dkz  }dldm|iz  }t          t          j        |                    d x}x}}t          |          }|j)        d%         }|j*        }d}||k    }|st          j
        dJ|fdr||f          t          j        |          t          j        |          t          j        |          dTz  }dUdV|iz  }t          t          j        |                    d x}x}x}}d S )NJARVIS_FINANCE_RUNTIME_DIRfinance_runtimeruntime!JARVIS_CRYPTO_TRADER_RUNTIME_ROOTexperiments%candidate_swing_trend_retest_researchreportsz v76_paper_supervisor_latest.jsonafterTi  z9runtime/experiments/candidate_swing_trend_retest_researchzMruntime/experiments/candidate_swing_trend_retest_research/trade_journal.jsonlzNruntime/experiments/candidate_swing_trend_retest_research/signal_journal.jsonl)running
paper_onlyenv_okcmd_okpidruntime_dirtrade_journalsignal_journalz
state.jsonopen_positionsSOL100z0.595110z1.2z-0.3   z2026-06-30T12:00:00+00:00)	strategy_identrysize	stop_losstake_profitmfe_pctmae_pct
ticks_held	opened_atzsignal_journal.jsonlpaper_opened_lifecyclez25.6)	timestampcoinr?   would_enterfinal_decisionsignal_scoredata_quality_allowedz!hl_reconcile_watchdog_latest.jsonokz75.49z100.000r   )status	free_usdcequitymargin_usage_pctopen_ordersstops_missing_countwarnings)rQ   open_orders_countrV   )	reconcilewatchdogztrade_journal.jsonlrI   z2026-06-30T12:30:00+00:00rJ   r?   eventexitsidelongentry_price
exit_price102rA   net_pnl_usdz0.80gross_pnl_usdz1.00entry_fee_usdz0.05exit_fee_usdslippage_cost_usdz0.10funding_cost_usdexit_reasonrC   candles_held   paper_tradingr   z"hyperliquid_daily_report_latest.mdzv76 Lifecycle Scorecard: source=true_lifecycle_exits_only, closed=99, winrate=35.35%, pf=0.58, net_pnl=-2.55 USDC, blocker=lifecycle_pnl_not_positive, live=nein
r   r   )==)zQ%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.status
}.bridge_status
} == %(py7)ssnapshot)py0py2py4py7zassert %(py9)spy9F)is)zP%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.status
}.live_allowed
} is %(py7)s)z2%(py3)s
{%(py3)s = %(py1)s.paper_only
} is %(py6)s)py1py3py6zassert %(py8)spy8hyperliquid)zS%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.portfolio
}.portfolio_id
} == %(py7)s)z,%(py3)s
{%(py3)s = %(py1)s.coin
} == %(py6)sz50.00)z4%(py3)s
{%(py3)s = %(py1)s.notional_usd
} == %(py6)s)z3%(py3)s
{%(py3)s = %(py1)s.net_pnl_usd
} == %(py6)s)zW%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.portfolio
}.realized_pnl_usd
} == %(py7)s   )zZ%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.portfolio
}.closed_trades_count
} == %(py7)s)zR%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.portfolio
}.winrate_pct
} == %(py7)s)z5%(py3)s
{%(py3)s = %(py1)s.paper_pnl_usd
} == %(py6)s)z3%(py3)s
{%(py3)s = %(py1)s.strategy_id
} == %(py6)s)zk%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.portfolio
}.experimental_legacy_realized_pnl_usd
} == %(py7)s)zW%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.portfolio
}.reconcile_status
} == %(py7)s)zP%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.portfolio
}.free_usdc
} == %(py7)sc                    h | ]	}|j         
S  )key)r"   checks     r   	<setcomp>zStest_crypto_trader_bridge_builds_read_only_snapshot_from_runtime.<locals>.<setcomp>   s    BBB%EIBBBr   >   stopsrY   kill_switchdata_qualityexecution_mode)>=)z%(py1)s >= %(py4)s)rt   rp   zassert %(py6)srv   BUY)z.%(py3)s
{%(py3)s = %(py1)s.signal
} == %(py6)s)z9%(py3)s
{%(py3)s = %(py1)s.execution_allowed
} is %(py6)sawaiting_approval)z7%(py3)s
{%(py3)s = %(py1)s.approval_status
} == %(py6)s)z4%(py3)s
{%(py3)s = %(py1)s.live_allowed
} is %(py6)sr2   test)	intent_iddecisionconfirmnoterecorded)z.%(py2)s
{%(py2)s = %(py0)s.status
} == %(py5)sresponse)rn   ro   py5zassert %(py7)srq   )z9%(py2)s
{%(py2)s = %(py0)s.execution_allowed
} is %(py5)scrypto_traderztrade_approvals.jsonlziassert %(py13)s
{%(py13)s = %(py11)s
{%(py11)s = (((%(py0)s / %(py2)s) / %(py5)s) / %(py8)s).exists
}()
}r'   )rn   ro   r   rw   py11py13)z%(py1)s == %(py4)ssource_engineCryptoTraderpaper_only_approved)4setenvstrr   r&   r   r   r   rQ   bridge_status
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationlive_allowed	processesr2   	portfolioportfolio_idr9   rJ   notional_usdrecent_closed_tradesrb   realized_pnl_usdclosed_trades_countwinrate_pctperformance_pointspaper_pnl_usdstrategy_performancer?   $experimental_legacy_realized_pnl_usdreconcile_statusrR   risk_checkssignalssignalexecution_allowedtrade_intentsapproval_status
scorecardsr   r   r   exists	read_text
splitlinesr   loads)r'   monkeypatchr+   strategyrm   @py_assert1@py_assert3@py_assert6@py_assert5@py_format8@py_format10@py_assert0@py_assert2@py_assert4@py_format7@py_format9@py_format5r   @py_format6@py_assert7@py_assert9@py_assert10@py_assert12@py_format14
audit_rowsaudit_payloadupdateds                              r   @test_crypto_trader_bridge_builds_read_only_snapshot_from_runtimer      s   3SDU9U5V5VWWW"G:CLLIII&)PPH)@@7#"&""#^%t&v	: 	:	
  " <#J"!!%#($%"#!<
 
	
  $ )) 9F#": &(, 
	
   )AA $"$'!'(  $(aXYZZ	
 	
   ((8 F 	
  u e  v      $V #C }  !"  #	
  0 yt<<<y??KK 	m L   
 ,G44H?0?(0D0(D0000000000(D0000000000008000008000000?0000(0000D00000000000000000000000000000?0?'050'50000000000'50000000000008000008000000?0000'0000500000000000000000000000000000?$Q':'2:d:2d::::::::::2d:::::'::::2::::d:::::::::::::::::::::::::::::;*;m;*m;;;;;;;;;;*m;;;;;;;;;;;;8;;;;;8;;;;;;;;;;*;;;;m;;;;;;;;;;;;;;;;;;;;;;;;;;;;;,Q/=/4==4==========4=====/====4=================================,Q/G/<GG<GGGGGGGGGG<GGGGG/GGGG<GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG215K5AKVKAVKKKKKKKKKKAVKKKKK5KKKKAKKKKVKKKKKKKKKKKKKKKKKKKKKKKKKKKKK8.8&8.&8888888888.&88888888888888888888888888888.8888&88888888888888888888888888888616Q61Q66666666661Q6666666666668666668666666666616666Q666666666666666666666666666665)5X5)X5555555555)X55555555555585555585555555555)5555X5555555555555555555555555555504L4BLfLBfLLLLLLLLLLBfLLLLL4LLLLBLLLLfLLLLLLLLLLLLLLLLLLLLLLLLLLLLL215l5AlEllAElllllllllllAEllllll5llllAllllEllllllllllllllllllllllllllllll215K5AKVKAVKKKKKKKKKKAVKKKKK5KKKKAKKKKVKKKKKKKKKKKKKKKKKKKKKKKKKKKKKLBLfLBfLLLLLLLLLLBfLLLLLLLLLLLL8LLLLL8LLLLLLLLLLBLLLLfLLLLLLLLLLLLLLLLLLLLLLLLLLLLL6.6$6.$6666666666.$66666666666686666686666666666.6666$666666666666666666666666666662'272'72222222222'722222222222282222282222222222'2222722222222222222222222222222222BB8#5#ABBB  N  GN  GN  GN  NB  GN  N  N  N  N  N  N  N  N  N  NB  GN  N  N  N  N  NB  N  N  N  N  GN  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  NA.%..%..........%.........%.................................A909E90E99999999990E99999999909999E99999999999999999999999999999!!$2$)2U2)U2222222222)U22222$2222)2222U22222222222222222222222222222!!$K$4K8KK48KKKKKKKKKKK48KKKKKK$KKKK4KKKK8KKKKKKKKKKKKKKKKKKKKKKKKKKKKKK!!$?$6?%?6%??????????6%?????$????6????%?????????????????????????????q!7!.7%7.%7777777777.%77777!7777.7777%77777777777777777777777777777$%9HDZ[\D]Dgr~  IM  TZ  &[  &[  &[  \  \H?(j(?j((((((((((?j((((((((((((8(((((8((((((?((((j(((((((((((((((((((((((((((%..%..........%............8.....8......%...............................(^H((^?^(?:^=T^:=TT^T\^\\^^^^^^^^^^^^^^^H^^^^^H^^^^^^(^^^^?^^^^=T^^^^\^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^..@CZZeeoveww  C  C  E  EJJz"~..M'R+RR'+RRRRRRRRRRR'+RRRRRR'RRRR+RRRRRRRRRRRRRRRRRRRRRRRRRRRR )E) E)))))))))) E))))) ))))E))))))))))))))))))))))))))));^;)^;;;;;;;;;;)^;;;;;);;;;^;;;;;;;;;;;;;;;;;;;;;;;;;;;*733G #L#3L7LL37LLLLLLLLLLL37LLLLLL#LLLL3LLLL7LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLr   c                    t                      } |                                 d         }d}||v }|st          j        d|fd||f          t          j        |          dt          j                    v st          j        |          rt          j        |          nddz  }dd|iz  }t          t          j	        |                    d x}}d}||v }|st          j        d|fd||f          t          j        |          dt          j                    v st          j        |          rt          j        |          nddz  }dd|iz  }t          t          j	        |                    d x}}d	}||v }|st          j        d|fd||f          t          j        |          dt          j                    v st          j        |          rt          j        |          nddz  }dd|iz  }t          t          j	        |                    d x}}d
}||v }|st          j        d|fd||f          t          j        |          dt          j                    v st          j        |          rt          j        |          nddz  }dd|iz  }t          t          j	        |                    d x}}d}||v }|st          j        d|fd||f          t          j        |          dt          j                    v st          j        |          rt          j        |          nddz  }dd|iz  }t          t          j	        |                    d x}}d S )Npathsz/api/crypto-trader/status)in)z%(py1)s in %(py3)s)rt   ru   zassert %(py5)sr   z/api/crypto-trader/snapshotz(/api/crypto-trader/hyperliquid-portfolioz /api/crypto-trader/trade-intentsz"/api/crypto-trader/trade-approvals)
r   openapir   r   r   r   r   r   r   r   )appr   r   r   @py_format4r   s         r   (test_crypto_trader_api_routes_registeredr      s   
,,CKKMM'"E&/&%//////////&%/////&///////////%/////%///////////////////////////(1(E1111111111(E11111(11111111111E11111E1111111111111111111111111115>5>>>>>>>>>>5>>>>>5>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-6-6666666666-66666-6666666666666666666666666666666666666666666/8/58888888888/588888/88888888888588888588888888888888888888888888888r   )r	   r   r
   r   r   r   )r	   r   r   r   r   r   )r'   r   r   r   )r   r   )
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   r   pathlibr   jarvis_finance.api.mainr   (jarvis_finance.api.schemas.crypto_traderr   ,jarvis_finance.services.crypto_trader_bridger   r   r   r&   r   r   r|   r   r   <module>r      s    " " " " " "                     . . . . . . I I I I I I l l l l l l l l; ; ; ;
Y Y Y Y
GM GM GM GMT9 9 9 9 9 9r   