a
    6§jÆ  ã                   @   sn   d Z ddlZddlZddlZddlmZmZ ej dd¡ ddl	Z
dZdd„ Zdd	„ Zed
krje eƒ ¡ dS )aU  Move cash between Kalshi subaccounts.

    python main\kalshi_transfer.py            -> sweep ALL of subaccount 1 into 0
    python main\kalshi_transfer.py 1 0 12.50  -> move $12.50 from 1 to 0

WHY A SCRIPT. The balances endpoint returns DOLLARS as a decimal string
("33.8623") while the transfer endpoint takes an INTEGER amount_cents, so the
conversion is a place to silently lose or invent money. Decimal + ROUND_DOWN
here: never transfer more than the account actually holds, and leave the
sub-cent remainder behind rather than risk a rejection.

SAFE TO RE-RUN. The sweep moves whatever is there; once swept the balance is
~0 and a second run transfers nothing. Each run sends a fresh
client_transfer_id, so this is NOT protection against a deliberate double
transfer -- it just means an accidental re-run is a no-op.

Open positions do NOT need the cash: Kalshi contracts are paid for at purchase,
so a long position is unaffected by sweeping the balance. Proceeds from a
position that settles LATER land in the subaccount that held it, so a swept
subaccount can show a balance again after settlement.
é    N)ÚDecimalÚ
ROUND_DOWNzE:\soccer\mainz/portfolio/subaccounts/transferc                  C   s@   i } t  d¡ dg ¡pg D ] }tt|d ƒƒ| t|d ƒ< q| S )Nz/portfolio/subaccounts/balancesZsubaccount_balancesZbalanceZsubaccount_number)ÚktZ_getÚgetr   ÚstrÚint)ÚoutÚb© r
   úmain/kalshi_transfer.pyÚbalances!   s    
ÿÿr   c               
   C   s$  t jdd … } t| ƒdkr&t| d ƒnd}t| ƒdkrBt| d ƒnd}tƒ }||vrptd|› dt|ƒ› �ƒ dS t| ƒdkr¸t| d ƒ}||| krÀtd|› d|› d|| › �ƒ dS n|| }t|d	 jt	d
�ƒ}tdd 
dd„ t| ¡ ƒD ƒ¡ ƒ |dk�rtdƒ dS td|› d|d	 d›d|› d|› �ƒ tt ¡ ƒ|||dœ}zt t|¡}W nB t�yœ } z(tdt|ƒj› d|› �ƒ W Y d }~dS d }~0 0 td|�rºt |¡d d… nd ƒ tƒ }	tdd 
dd„ t|	 ¡ ƒD ƒ¡ ƒ |	 |tdƒ¡| |tdƒ¡ }
td|› d|
› �ƒ dS )Né   r   zsubaccount z not found; have é   zrefusing: asked $z but subaccount z holds $éd   )ZroundingzBEFORE: z  c                 s   s"   | ]\}}d |› d|› �V  qdS ©ú#z $Nr
   ©Ú.0ÚkÚvr
   r
   r   Ú	<genexpr>;   ó    zmain.<locals>.<genexpr>znothing to transferztransferring z	 cents ($z.2fz) from #z -> #)Zclient_transfer_idZfrom_subaccountZto_subaccountZamount_centszTRANSFER FAILED: z: z
response: i,  z(empty)zAFTER : c                 s   s"   | ]\}}d |› d|› �V  qdS r   r
   r   r
   r
   r   r   M   r   r   z changed by $)ÚsysÚargvÚlenr   r   ÚprintÚsortedr   Zto_integral_valuer   ÚjoinÚitemsr   ÚuuidZuuid4r   Z_postÚTRANSFER_PATHÚ	ExceptionÚtypeÚ__name__ÚjsonÚdumpsr   )ÚaÚsrcZdstZbeforeZamountZcentsÚbodyÚrÚeZafterZmovedr
   r
   r   Úmain)   sP    ÿ$
ÿÿ
þ$$ r+   Ú__main__)Ú__doc__r$   r   r   Zdecimalr   r   ÚpathÚinsertZkalshi_traderr   r    r   r+   r#   Úexitr
   r
   r
   r   Ú<module>   s   *