
    .j                        d dl mZ d dlZd dlmc mZ d dl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mZmZmZmZ d dlmZmZm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%ddZ&ddZ'dS )    )annotationsN)Decimal)ReadOnlyGuard)CopyResearchPaths)main)ShadowPositionEnginebuild_shadow_portfolioclassify_deltacompute_deltascompute_position_deltarun_shadow_engine_once)ShadowDecisionTypeShadowDeltaTypeShadowLeaderPositionBTC1longc                R   dd| |t          |          t          d          t          d          dt          d          t          d          t          d          t          d	          t          d
          t          d          dd}|                    |           t          di |S )Nzleader-1wallet100z100.2z2026-06-14T10:00:00+00:008z0.220z0.001z0.0350000zsnap-1)	leader_idleader_typesymbolsidesizeleader_entry_pricecurrent_midobserved_atposition_age_hoursleader_unrealized_pnl_pctleader_liquidation_distance_pctfunding_rate
spread_pcttop_depth_usdsource_snapshot_id )r   updater   )r   r   r   kwargsdefaultss        `/home/agent/projects/CryptoTradingBot/Crypto_Agent/tests/test_ctb_copy_shadow_position_engine.pyposr.      s    %ennw''2%cll%,U^^+24==((foo ))& H" OOF++(+++    returnNonec                 "   d} t          |           }d}t          |          }t          ||          }t          j        }||k    }|st	          j        d|fd||f          dt          j                    v st	          j        t                    rt	          j	        t                    nddt          j                    v st	          j        t                     rt	          j	        t                     ndt	          j	        |           t	          j	        |          dt          j                    v st	          j        t                     rt	          j	        t                     ndt	          j	        |          t	          j	        |          t	          j	        |          dt          j                    v st	          j        t                    rt	          j	        t                    ndt	          j	        |          d
z  }d	d
|iz  }t          t	          j        |                    d x} x}x}x}x}x}}d} t          |           }d}t          |          }t          ||          }t          j        }||k    }|st	          j        d|fd||f          dt          j                    v st	          j        t                    rt	          j	        t                    nddt          j                    v st	          j        t                     rt	          j	        t                     ndt	          j	        |           t	          j	        |          dt          j                    v st	          j        t                     rt	          j	        t                     ndt	          j	        |          t	          j	        |          t	          j	        |          dt          j                    v st	          j        t                    rt	          j	        t                    ndt	          j	        |          d
z  }d	d
|iz  }t          t	          j        |                    d x} x}x}x}x}x}}d} t          |           }d}t          |          }t          ||          }t          j        }||k    }|st	          j        d|fd||f          dt          j                    v st	          j        t                    rt	          j	        t                    nddt          j                    v st	          j        t                     rt	          j	        t                     ndt	          j	        |           t	          j	        |          dt          j                    v st	          j        t                     rt	          j	        t                     ndt	          j	        |          t	          j	        |          t	          j	        |          dt          j                    v st	          j        t                    rt	          j	        t                    ndt	          j	        |          d
z  }d	d
|iz  }t          t	          j        |                    d x} x}x}x}x}x}}d} t          |           }d}t          |          }t          ||          }t          j        }||k    }|st	          j        d|fd||f          dt          j                    v st	          j        t                    rt	          j	        t                    nddt          j                    v st	          j        t                     rt	          j	        t                     ndt	          j	        |           t	          j	        |          dt          j                    v st	          j        t                     rt	          j	        t                     ndt	          j	        |          t	          j	        |          t	          j	        |          dt          j                    v st	          j        t                    rt	          j	        t                    ndt	          j	        |          d
z  }d	d
|iz  }t          t	          j        |                    d x} x}x}x}x}x}}d} t          |           }d}t          |          }t          ||          }t          j        }||k    }|st	          j        d|fd||f          dt          j                    v st	          j        t                    rt	          j	        t                    nddt          j                    v st	          j        t                     rt	          j	        t                     ndt	          j	        |           t	          j	        |          dt          j                    v st	          j        t                     rt	          j	        t                     ndt	          j	        |          t	          j	        |          t	          j	        |          dt          j                    v st	          j        t                    rt	          j	        t                    ndt	          j	        |          d
z  }d	d
|iz  }t          t	          j        |                    d x} x}x}x}x}x}}d} t          |           }d}t          |          }t          ||          }t          j        }||k    }|st	          j        d|fd||f          dt          j                    v st	          j        t                    rt	          j	        t                    nddt          j                    v st	          j        t                     rt	          j	        t                     ndt	          j	        |           t	          j	        |          dt          j                    v st	          j        t                     rt	          j	        t                     ndt	          j	        |          t	          j	        |          t	          j	        |          dt          j                    v st	          j        t                    rt	          j	        t                    ndt	          j	        |          d
z  }d	d
|iz  }t          t	          j        |                    d x} x}x}x}x}x}}d S )N0r   ==)z%(py12)s
{%(py12)s = %(py0)s(%(py5)s
{%(py5)s = %(py1)s(%(py3)s)
}, %(py10)s
{%(py10)s = %(py6)s(%(py8)s)
})
} == %(py16)s
{%(py16)s = %(py14)s.NEW_POSITION
}r
   r   r   )
py0py1py3py5py6py8py10py12py14py16zassert %(py18)spy182)z%(py12)s
{%(py12)s = %(py0)s(%(py5)s
{%(py5)s = %(py1)s(%(py3)s)
}, %(py10)s
{%(py10)s = %(py6)s(%(py8)s)
})
} == %(py16)s
{%(py16)s = %(py14)s.INCREASE_POSITION
})z%(py12)s
{%(py12)s = %(py0)s(%(py5)s
{%(py5)s = %(py1)s(%(py3)s)
}, %(py10)s
{%(py10)s = %(py6)s(%(py8)s)
})
} == %(py16)s
{%(py16)s = %(py14)s.DECREASE_POSITION
})z%(py12)s
{%(py12)s = %(py0)s(%(py5)s
{%(py5)s = %(py1)s(%(py3)s)
}, %(py10)s
{%(py10)s = %(py6)s(%(py8)s)
})
} == %(py16)s
{%(py16)s = %(py14)s.CLOSE_POSITION
}z-1)z%(py12)s
{%(py12)s = %(py0)s(%(py5)s
{%(py5)s = %(py1)s(%(py3)s)
}, %(py10)s
{%(py10)s = %(py6)s(%(py8)s)
})
} == %(py16)s
{%(py16)s = %(py14)s.FLIP_POSITION
})z%(py12)s
{%(py12)s = %(py0)s(%(py5)s
{%(py5)s = %(py1)s(%(py3)s)
}, %(py10)s
{%(py10)s = %(py6)s(%(py8)s)
})
} == %(py16)s
{%(py16)s = %(py14)s.UNCHANGED_POSITION
})r   r
   r   NEW_POSITION
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationINCREASE_POSITIONDECREASE_POSITIONCLOSE_POSITIONFLIP_POSITIONUNCHANGED_POSITION)	@py_assert2@py_assert4@py_assert7@py_assert9@py_assert11@py_assert15@py_assert13@py_format17@py_format19s	            r-   test_delta_types_are_detectedrY   *   sP   "%U'#,,UUU>,55U9UU59UUUUUUUUUUU59UUUUUUUUUUUUU>UUUUU>UUUUUUUUUUUUU'UUUUU'UUUUUU#UUUU,UUUUUUUUUUUUUUUUUUUUUUUUUUUUUU5UUUUUUUUUUUUUUUUUUUUUU9UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU"%Z'#,,ZZZ>,55Z9ZZ59ZZZZZZZZZZZ59ZZZZZZZZZZZZZ>ZZZZZ>ZZZZZZZZZZZZZ'ZZZZZ'ZZZZZZ#ZZZZ,ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ5ZZZZZZZZZZZZZZZZZZZZZZ9ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"%Z'#,,ZZZ>,55Z9ZZ59ZZZZZZZZZZZ59ZZZZZZZZZZZZZ>ZZZZZ>ZZZZZZZZZZZZZ'ZZZZZ'ZZZZZZ#ZZZZ,ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ5ZZZZZZZZZZZZZZZZZZZZZZ9ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"%W'#,,WWW>,55W9WW59WWWWWWWWWWW59WWWWWWWWWWWWW>WWWWW>WWWWWWWWWWWWW'WWWWW'WWWWWW#WWWW,WWWWWWWWWWWWWWWWWWWWWWWWWWWWWW5WWWWWWWWWWWWWWWWWWWWWW9WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"%W'#,,WWW>,66W/:WW6:WWWWWWWWWWW6:WWWWWWWWWWWWW>WWWWW>WWWWWWWWWWWWW'WWWWW'WWWWWW#WWWW,WWWWWWWWWWWWWWWWWWWWWWWWWWWWWW6WWWWWWWWWWW/WWWWW/WWWWWW:WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"%['#,,[[[>,55[9[[59[[[[[[[[[[[59[[[[[[[[[[[[[>[[[[[>[[[[[[[[[[[[['[[[[['[[[[[[#[[[[,[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[5[[[[[[[[[[[[[[[[[[[[[[9[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[r/   c                    t          dd          t          dd          t          dd          t          dd          t          dd          g} t          d	d          t          dd          t          dd          t          ddd
          t          dd          g}d t          | |          D             }|d	         }t          j        }||k    }|st	          j        d|fd||f          t	          j        |          dt          j                    v st	          j	        t                    rt	          j        t                    ndt	          j        |          dz  }dd|iz  }t          t	          j        |                    d x}x}}|d         }t          j        }||k    }|st	          j        d|fd||f          t	          j        |          dt          j                    v st	          j	        t                    rt	          j        t                    ndt	          j        |          dz  }dd|iz  }t          t	          j        |                    d x}x}}|d         }t          j        }||k    }|st	          j        d|fd||f          t	          j        |          dt          j                    v st	          j	        t                    rt	          j        t                    ndt	          j        |          dz  }dd|iz  }t          t	          j        |                    d x}x}}|d         }t          j        }||k    }|st	          j        d|fd||f          t	          j        |          dt          j                    v st	          j	        t                    rt	          j        t                    ndt	          j        |          dz  }dd|iz  }t          t	          j        |                    d x}x}}|d         }t          j        }||k    }|st	          j        d|fd||f          t	          j        |          dt          j                    v st	          j	        t                    rt	          j        t                    ndt	          j        |          dz  }dd|iz  }t          t	          j        |                    d x}x}}|d         }t          j        }||k    }|st	          j        d|fd||f          t	          j        |          dt          j                    v st	          j	        t                    rt	          j        t                    ndt	          j        |          dz  }dd|iz  }t          t	          j        |                    d x}x}}d S )NINCr   r   DECrA   CLOSEFLIPUNCHNEWshortr   r   c                (    i | ]}|j         |j        S r)   )r   
delta_type).0deltas     r-   
<dictcomp>zZtest_compute_deltas_for_new_increase_decrease_close_flip_and_unchanged.<locals>.<dictcomp>C   s    \\\elE,\\\r/   r4   )z4%(py1)s == %(py5)s
{%(py5)s = %(py3)s.NEW_POSITION
}r   r7   r8   r9   assert %(py7)spy7)z9%(py1)s == %(py5)s
{%(py5)s = %(py3)s.INCREASE_POSITION
})z9%(py1)s == %(py5)s
{%(py5)s = %(py3)s.DECREASE_POSITION
})z6%(py1)s == %(py5)s
{%(py5)s = %(py3)s.CLOSE_POSITION
})z5%(py1)s == %(py5)s
{%(py5)s = %(py3)s.FLIP_POSITION
})z:%(py1)s == %(py5)s
{%(py5)s = %(py3)s.UNCHANGED_POSITION
})r.   r   r   rB   rC   rD   rH   rE   rF   rG   rI   rJ   rK   rL   rM   rN   rO   )previouscurrentdeltas@py_assert0rQ   rP   @py_format6@py_format8s           r-   Ftest_compute_deltas_for_new_increase_decrease_close_flip_and_unchangedrr   3   s9   EEG#FFH 	EEEF7+++FG ]\.SZ:[:[\\\F%=8O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8O88888O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%==O=================================O=====O==================================%==O=================================O=====O=================================='?<o<<?<<<<<<<<<<<?<<<<<<?<<<<<<<<<<<o<<<<<o<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<&>:_::>:::::::::::>::::::>:::::::::::_:::::_::::::::::::::::::::::::::::::::::&>?_??>???????????>??????>???????????_?????_????????????????????????????????????r/   rm   r   c                d    t          d |           }t                                          |          S )N)r   r   evaluate_delta)rm   rg   s     r-   decision_forru   M   s+    "411E!!00777r/   c                    d} d}t          |          }t          |          }t          |          }|j        }| |v }|st	          j        d|fd| |f          t	          j        |           dt          j                    v st	          j	        t                    rt	          j        t                    nddt          j                    v st	          j	        t                    rt	          j        t                    nddt          j                    v st	          j	        t                     rt	          j        t                     ndt	          j        |          t	          j        |          t	          j        |          t	          j        |          t	          j        |          d		z  }d
d|iz  }t          t	          j        |                    d x} x}x}x}x}x}}d} d}t          |          }t          |          }t          |          }|j        }| |v }|st	          j        d|fd| |f          t	          j        |           dt          j                    v st	          j	        t                    rt	          j        t                    nddt          j                    v st	          j	        t                    rt	          j        t                    nddt          j                    v st	          j	        t                     rt	          j        t                     ndt	          j        |          t	          j        |          t	          j        |          t	          j        |          t	          j        |          d		z  }d
d|iz  }t          t	          j        |                    d x} x}x}x}x}x}}d} d}t          |          }t          |          }t          |          }|j        }| |v }|st	          j        d|fd| |f          t	          j        |           dt          j                    v st	          j	        t                    rt	          j        t                    nddt          j                    v st	          j	        t                    rt	          j        t                    nddt          j                    v st	          j	        t                     rt	          j        t                     ndt	          j        |          t	          j        |          t	          j        |          t	          j        |          t	          j        |          d		z  }d
d|iz  }t          t	          j        |                    d x} x}x}x}x}x}}d} d}t          |          }t          |          }t          |          }|j        }| |v }|st	          j        d|fd| |f          t	          j        |           dt          j                    v st	          j	        t                    rt	          j        t                    nddt          j                    v st	          j	        t                    rt	          j        t                    nddt          j                    v st	          j	        t                     rt	          j        t                     ndt	          j        |          t	          j        |          t	          j        |          t	          j        |          t	          j        |          d		z  }d
d|iz  }t          t	          j        |                    d x} x}x}x}x}x}}d S )NBLOCK_POSITION_TOO_YOUNGr   )r"   in)z%(py1)s in %(py15)s
{%(py15)s = %(py13)s
{%(py13)s = %(py3)s(%(py11)s
{%(py11)s = %(py4)s(position_age_hours=%(py9)s
{%(py9)s = %(py5)s(%(py7)s)
})
})
}.reason_codes
}ru   r.   r   )	r7   r8   py4r9   rk   py9py11py13py15zassert %(py17)spy17BLOCK_LEADER_TOO_FAR_IN_PROFIT)r#   )z%(py1)s in %(py15)s
{%(py15)s = %(py13)s
{%(py13)s = %(py3)s(%(py11)s
{%(py11)s = %(py4)s(leader_unrealized_pnl_pct=%(py9)s
{%(py9)s = %(py5)s(%(py7)s)
})
})
}.reason_codes
}BLOCK_SPREAD_TOO_WIDEz0.5)r&   )z%(py1)s in %(py15)s
{%(py15)s = %(py13)s
{%(py13)s = %(py3)s(%(py11)s
{%(py11)s = %(py4)s(spread_pct=%(py9)s
{%(py9)s = %(py5)s(%(py7)s)
})
})
}.reason_codes
}BLOCK_DEPTH_TOO_THIN10)r'   )z%(py1)s in %(py15)s
{%(py15)s = %(py13)s
{%(py13)s = %(py3)s(%(py11)s
{%(py11)s = %(py4)s(top_depth_usd=%(py9)s
{%(py9)s = %(py5)s(%(py7)s)
})
})
}.reason_codes
})r   r.   ru   reason_codesrC   rD   rH   rE   rF   rG   rI   rJ   )	ro   @py_assert6@py_assert8@py_assert10@py_assert12@py_assert14rP   @py_format16@py_format18s	            r-   .test_pretrade_blocks_young_profit_spread_depthr   R   sy   %hUXhWUX\\hc\6Z6Z6Zh6Z)[)[h)[)hh%)hhhhhhhhhhh%)hhhhhh%hhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhchhhhhhhhhhhhhWhhhhhWhhhhhhUXhhhh\hhhh6Zhhhh)[hhhh)hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh+ubeuZabeZfZfuCZf<g<g<gu|<g/h/hu/h/uu+/uuuuuuuuuuu+/uuuuuu+uuuuuuuuuuu|uuuuu|uuuuuuuuuuuuuCuuuuuCuuuuuuuuuuuuuZauuuuuZauuuuuubeuuuuZfuuuu<guuuu/huuuu/uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu"_%_'%.._3.3Q3Q3Q_l3Q&R&R_&R&__"&___________"&______"___________l_____l_____________3_____3_____________'_____'______%____.____3Q____&R____&____________________________________!`D`GDMM`#M2R2R2R`\2R%S%S`%S%``!%```````````!%``````!```````````\`````\`````````````#`````#`````````````G`````G``````D````M````2R````%S````%``````````````````````````````````````r/   c                    t          t                                } | j        }t          j        }||k    }|st          j        d|fd||f          dt          j                    v st          j	        |           rt          j
        |           ndt          j
        |          dt          j                    v st          j	        t                    rt          j
        t                    ndt          j
        |          dz  }dd|iz  }t          t          j        |                    d x}x}}| j        }d}||k    }|st          j        d|fd	||f          dt          j                    v st          j	        |           rt          j
        |           ndt          j
        |          t          j
        |          d
z  }dd|iz  }t          t          j        |                    d x}x}}| j        }d }||u}|st          j        d|fd||f          dt          j                    v st          j	        |           rt          j
        |           ndt          j
        |          t          j
        |          d
z  }dd|iz  }t          t          j        |                    d x}x}}| j        }d}t!          |          }	||	k    }|st          j        d|fd||	f          dt          j                    v st          j	        |           rt          j
        |           ndt          j
        |          dt          j                    v st          j	        t                     rt          j
        t                     ndt          j
        |          t          j
        |	          dz  }dd|iz  }
t          t          j        |
                    d x}x}x}}	| j        }| j        }||k    }|st          j        d|fd||f          dt          j                    v st          j	        |           rt          j
        |           ndt          j
        |          dt          j                    v st          j	        |           rt          j
        |           ndt          j
        |          dz  }dd|iz  }t          t          j        |                    d x}x}}| j        d         }d}||u }|slt          j        d|fd||f          t          j
        |          t          j
        |          dz  }dd|iz  }t          t          j        |                    d x}x}}t'          | g          }|j        }d}t!          |          }	||	k    }|st          j        d|fd||	f          d t          j                    v st          j	        |          rt          j
        |          nd t          j
        |          dt          j                    v st          j	        t                     rt          j
        t                     ndt          j
        |          t          j
        |	          dz  }dd|iz  }
t          t          j        |
                    d x}x}x}}	|j        d!         }|j        }d"}||k    }|st          j        d|fd#||f          t          j
        |          t          j
        |          t          j
        |          d$z  }dd|iz  }t          t          j        |                    d x}x}x}}d S )%Nr4   )zM%(py2)s
{%(py2)s = %(py0)s.decision
} == %(py6)s
{%(py6)s = %(py4)s.ALLOWED
}decisionr   r6   py2rz   r:   assert %(py8)sr;   )ALLOW_SHADOW_POSITION)z4%(py2)s
{%(py2)s = %(py0)s.reason_codes
} == %(py5)sr6   r   r9   rj   rk   )is not)zD%(py2)s
{%(py2)s = %(py0)s.follower_sim_entry_price
} is not %(py5)sr3   )>)zc%(py2)s
{%(py2)s = %(py0)s.estimated_total_entry_cost_pct
} > %(py8)s
{%(py8)s = %(py4)s(%(py6)s)
}r   )r6   r   rz   r:   r;   zassert %(py10)sr<   )zw%(py2)s
{%(py2)s = %(py0)s.estimated_roundtrip_cost_pct
} > %(py6)s
{%(py6)s = %(py4)s.estimated_total_entry_cost_pct
}	read_onlyTisz%(py1)s is %(py4)sr7   rz   assert %(py6)sr:   r   )zX%(py2)s
{%(py2)s = %(py0)s.total_notional_usd
} == %(py8)s
{%(py8)s = %(py4)s(%(py6)s)
}	portfolior   r   )z.%(py3)s
{%(py3)s = %(py1)s.symbol
} == %(py6)s)r7   r8   r:   )ru   r.   r   r   ALLOWEDrC   rD   rE   rF   rG   rH   rI   rJ   r   follower_sim_entry_priceestimated_total_entry_cost_pctr   estimated_roundtrip_cost_pctread_only_guardr	   total_notional_usd	positionsr   )r   @py_assert1@py_assert5@py_assert3@py_format7@py_format9rQ   rp   rq   rR   @py_format11ro   rP   @py_format5r   s                  r-   9test_allowed_decision_generates_simulated_entry_and_costsr   Y   s   CEE""H: 2 :: ::::::::::: :::::::::::::8:::::8::::::::::::::::: 2::::: 2:::::: :::::::::::::::::::::::::::: >$>> $>>>>>>>>>>> $>>>>>>>>>>>>>8>>>>>8>>>>>> >>>>$>>>>>>>>>>>>>>>>>>>>>>>>>>>>,8D8,D8888888888,D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8D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2ASAWS\\A2\AAAAAAAAAA2\AAAAAAAAAAAA8AAAAA8AAAAAA2AAAAAAAAAAAWAAAAAWAAAAAASAAAA\AAAAAAAAAAAAAAAAAAAAAAAAAAAAA0Z83ZZ03ZZZZZZZZZZZ03ZZZZZZZZZZZZZ8ZZZZZ8ZZZZZZ0ZZZZZZZZZZZ8ZZZZZ8ZZZZZZ3ZZZZZZZZZZZZZZZZZZZZZZZZZZZZ#K08D80D88888888880D8888808888D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&z22I'95975>>9'>9999999999'>9999999999999999999999999'9999999999979999979999995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9999q!1!(1E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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1111r/   c                 J   t          d          } t          dd          }t                                          t          | |                    }|j        }t
          j        }||k    }|st          j        d|fd||f          dt          j
                    v st          j        |          rt          j        |          ndt          j        |          d	t          j
                    v st          j        t
                    rt          j        t
                    nd	t          j        |          d
z  }dd|iz  }t          t          j        |                    d x}x}}d}|j        }	||	v }
|
st          j        d|
fd||	f          t          j        |          dt          j
                    v st          j        |          rt          j        |          ndt          j        |	          dz  }dd|iz  }t          t          j        |                    d x}x}
}	d S )Nr   r\   r3   flatrc   r4   )zM%(py2)s
{%(py2)s = %(py0)s.decision
} == %(py6)s
{%(py6)s = %(py4)s.IGNORED
}r   r   r   r   r;   IGNORE_CLOSE_POSITIONrx   z4%(py1)s in %(py5)s
{%(py5)s = %(py3)s.reason_codes
}ri   rj   rk   )r.   r   rt   r   r   r   IGNOREDrC   rD   rE   rF   rG   rH   rI   rJ   r   )rl   rm   r   r   r   r   r   r   ro   rQ   rP   rp   rq   s                r-   %test_non_candidate_deltas_are_ignoredr   g   sT   }}}Hs(((G#%%445KHV]5^5^__H: 2 :: ::::::::::: :::::::::::::8:::::8::::::::::::::::: 2::::: 2:::::: ::::::::::::::::::::::::::::";h&;;"&;;;;;;;;;;;"&;;;;;;";;;;;;;;;;;h;;;;;h;;;;;;&;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;r/   c                 D   t          t          d                    } |                     t          d t	                                          }|j        }t          j        }||k    }|st          j	        d|fd||f          dt          j                    v st          j        |          rt          j        |          ndt          j        |          dt          j                    v st          j        t                    rt          j        t                    ndt          j        |          dz  }d	d
|iz  }t          t          j        |                    d x}x}}d}|j        }||v }	|	st          j	        d|	fd||f          t          j        |          dt          j                    v st          j        |          rt          j        |          ndt          j        |          dz  }
dd|
iz  }t          t          j        |                    d x}x}	}d S )NF)r   )guardr4   )zM%(py2)s
{%(py2)s = %(py0)s.decision
} == %(py6)s
{%(py6)s = %(py4)s.BLOCKED
}r   r   r   r   r;   BLOCK_READ_ONLY_GUARD_FAILEDrx   r   ri   rj   rk   )r   r   rt   r   r.   r   r   BLOCKEDrC   rD   rE   rF   rG   rH   rI   rJ   r   )enginer   r   r   r   r   r   ro   rQ   rP   rp   rq   s               r-   #test_read_only_guard_failure_blocksr   o   sM   !(F(F(FGGGF$$%;D#%%%H%HIIH: 2 :: ::::::::::: :::::::::::::8:::::8::::::::::::::::: 2::::: 2:::::: ::::::::::::::::::::::::::::)BX-BB)-BBBBBBBBBBB)-BBBBBB)BBBBBBBBBBBXBBBBBXBBBBBB-BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBr/   c                	   t          | dz            }t          g t                      g|d          }|j        }d}||k    }|st	          j        d|fd||f          dt          j                    v st	          j        |          rt	          j	        |          ndt	          j	        |          t	          j	        |          dz  }d	d
|iz  }t          t	          j        |                    d x}x}}|j        }d}||k    }|st	          j        d|fd||f          dt          j                    v st	          j        |          rt	          j	        |          ndt	          j	        |          t	          j	        |          dz  }d	d
|iz  }t          t	          j        |                    d x}x}}|j        }d}||k    }|st	          j        d|fd||f          dt          j                    v st	          j        |          rt	          j	        |          ndt	          j	        |          t	          j	        |          dz  }d	d
|iz  }t          t	          j        |                    d x}x}}d}|j        }||v}	|	st	          j        d|	fd||f          t	          j	        |          dt          j                    v st	          j        |          rt	          j	        |          ndt	          j	        |          dz  }d	d
|iz  }t          t	          j        |                    d x}x}	}d |                    d                                                                          D             }
|
d         d         }d}||k    }	|	slt	          j        d|	fd||f          t	          j	        |          t	          j	        |          dz  }dd|iz  }t          t	          j        |                    d x}x}	}d |                    d                                                                          D             }|d         d         }d}||k    }	|	slt	          j        d|	fd||f          t	          j	        |          t	          j	        |          dz  }dd|iz  }t          t	          j        |                    d x}x}	}d S )Ncopy_research
2026-06-14)dayokr4   )z.%(py2)s
{%(py2)s = %(py0)s.status
} == %(py5)ssummaryr   rj   rk      )z7%(py2)s
{%(py2)s = %(py0)s.decisions_count
} == %(py5)s)z5%(py2)s
{%(py2)s = %(py0)s.allowed_count
} == %(py5)sCrypto_Agent)not in)zA%(py1)s not in %(py5)s
{%(py5)s = %(py3)s.decision_journal_path
}ri   c                6    g | ]}t          j        |          S r)   jsonloadsrf   lines     r-   
<listcomp>zTtest_run_shadow_engine_once_writes_runtime_journals_outside_repo.<locals>.<listcomp>~   s"    uuuDJtuuur/   r   r   allowedz%(py1)s == %(py4)sr   r   r:   c                6    g | ]}t          j        |          S r)   r   r   s     r-   r   zTtest_run_shadow_engine_once_writes_runtime_journals_outside_repo.<locals>.<listcomp>   s"    vvv4dj&&vvvr/   r   r   )r   r   r.   statusrC   rD   rE   rF   rG   rH   rI   rJ   decisions_countallowed_countdecision_journal_pathshadow_position_decisions_file	read_text
splitlinesshadow_portfolio_file)tmp_pathpathsr   r   rQ   r   rp   rq   ro   rP   rowsr   r   portfolio_rowss                 r-   @test_run_shadow_engine_once_writes_runtime_journals_outside_repor   v   s   h899E$R#%%%\JJJG>!T!>T!!!!!!!!!!>T!!!!!!!!!!!!7!!!!!7!!!!!!>!!!!T!!!!!!!!!!!!!!!!!!!!!!!!!!!"'a'"a''''''''''"a''''''''''''7'''''7''''''"''''a''''''''''''''''''''''''''' %A% A%%%%%%%%%% A%%%%%%%%%%%%7%%%%%7%%%%%% %%%%A%%%%%%%%%%%%%%%%%%%%%%%%%%%>!>>>!>>>>>>>>>>>>!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>!>>>>>>>>>>>>>>>>>>>>>>>>>>>>uu)M)Ml)[)[)e)e)g)g)r)r)t)tuuuD7:+)+)++++++++++)+++++++++)+++++++++++++++++++++++++++vv53N3N|3\3\3f3f3h3h3s3s3u3uvvvN!12;e;2e;;;;;;;;;;2e;;;;;2;;;;e;;;;;;;;;;;;;;;;;;;;;;;;;;;;;r/   c                   t          dt          | dz            ddg          }d}||k    }|st          j        d|fd||f          dt	          j                    v st          j        |          rt          j        |          ndt          j        |          d	z  }d
d|iz  }t          t          j	        |                    d x}}t          j        |                                j                  }|d         }d}	||	k    }|slt          j        d|fd||	f          t          j        |          t          j        |	          dz  }
dd|
iz  }t          t          j	        |                    d x}x}}	|d         }d}	||	k    }|slt          j        d|fd||	f          t          j        |          t          j        |	          dz  }
dd|
iz  }t          t          j	        |                    d x}x}}	|d         d         }d}	||	u }|slt          j        d|fd||	f          t          j        |          t          j        |	          dz  }
dd|
iz  }t          t          j	        |                    d x}x}}	d S )N--runtime-dirr   --dayr   r   r4   z%(py0)s == %(py3)srcr6   r8   assert %(py5)sr9   r   ok_no_wallet_snapshotsr   r   r   r:   r   r   r   Tr   r   )run_shadow_mainstrrC   rD   rE   rF   rG   rH   rI   rJ   r   r   
readouterrout)r   capsysr   rP   r   @py_format4rp   payloadro   r   r   r   s               r-   8test_run_shadow_once_without_wallet_snapshots_returns_okr      s   	/3x//I+J+JGUab	c	cBN27NNNNNNNNN2NNNNNNNNNNNN2NNNNN2NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNj**,,011G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8888888888$%**%**********%*****%*******************************$%k2:d:2d::::::::::2d:::::2::::d:::::::::::::::::::::::::::::r/   c                8   t          | dz            }|                    dd          }|j                            dd           dddd	g iid
}dddd	g iid
}|                    t          j        |          dz   t          j        |          z   dz   d           t          dt          |j	                  ddg          }d}||k    }|st          j        d|fd||f          dt          j                    v st          j        |          rt          j        |          ndt          j        |          dz  }	dd|	iz  }
t!          t          j        |
                    d x}}t          j        |                                j                  }|d         }d}||k    }|slt          j        d|fd||f          t          j        |          t          j        |          dz  }dd|iz  }t!          t          j        |                    d x}x}}|d         }d}||k    }|slt          j        d|fd||f          t          j        |          t          j        |          dz  }dd|iz  }t!          t          j        |                    d x}x}}d S )Nr   walletsr   T)parentsexist_ok*0x1111111111111111111111111111111111111111r   clearinghouseStateassetPositions)wallet_addressobserved_at_msraw*0x2222222222222222222222222222222222222222
zutf-8)encodingr   r   r   r4   r   r   r   r   r9   r   ok_no_position_deltasr   r   r   r:   r   )r   snapshot_fileparentmkdir
write_textr   dumpsr   r   rootrC   rD   rE   rF   rG   rH   rI   rJ   r   r   r   )r   r   r   wallet_pathrow_arow_br   rP   r   r   rp   r   ro   r   r   r   s                   r-   6test_run_shadow_once_requires_two_snapshots_per_walletr      s   h899E%%i>>KTD999.!MadtvxcyLz{{E.!MadtvxcyLz{{E4:e,,t3dj6G6GG$NY`aaa	/3uz??G\R	S	SBN27NNNNNNNNN2NNNNNNNNNNNN2NNNNN2NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNj**,,011G8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$%**%**********%*****%*********************************r/   )r   r   r   )r0   r1   )rm   r   )(
__future__r   builtinsrE   _pytest.assertion.rewrite	assertionrewriterC   decimalr   r   src.ctb_copy.read_only_guardr   src.ctb_copy.runtime_pathsr   src.ctb_copy.run_shadow_oncer   r   #src.ctb_copy.shadow.position_enginer   r	   r
   r   r   r   !src.ctb_copy.shadow.shadow_modelsr   r   r   r.   rY   rr   ru   r   r   r   r   r   r   r   r)   r/   r-   <module>r     s   " " " " " "                      6 6 6 6 6 6 8 8 8 8 8 8 @ @ @ @ @ @                h g g g g g g g g g, , , ,,\ \ \ \@ @ @ @48 8 8 8
a a a a2 2 2 2< < < <C C C C< < < <; ; ; ;+ + + + + +r/   