
    [i                     2   d Z ddlZddlmZmZ ddlmZ ddlmZ ddl	Z	ddl
mZmZmZ ddlmZ ddlmZmZmZ  ed	g
          Zd Z G d de          Z G d de          Z G d de          Z G d de          Ze                    dee                   defd            Ze                    de          defd            Ze                    de          defd            Z  G d de          Z! G d d e          Z" G d! d"e          Z# G d# d$e          Z$e                    d%e#          de"fd&            Z%e                    d'ee$                   d(             Z&e                    d)ee$                   d*             Z'dS )+z
LuckySt Syndicate - Report & Schedule API Endpoints

FastAPI router for:
- Listing and reading encrypted on-chain trading reports
- Scheduling games with Base on-chain commitment
    N)	APIRouterHTTPException)	BaseModel)Optional)ReportKeyManagerEncryptedReportdecrypt_report)fetch_tx_calldata)create_schedulelist_pending_gameslist_active_gameszsyndicate-reports)tagsc                  T   t          j        t          j                            dd          t          t          j                            dd                    t          j                            d          t          t          j                            dd                              S )	z"Get Redis client from environment.
REDIS_HOST	localhost
REDIS_PORTi  REDIS_PASSWORDREDIS_DBr   )hostportpassworddb)redisRedisosenvirongetint     $/app/agentic/syndicate/report_api.py
_get_redisr"      sv    ;Z^^L+66d3344 011rz~~j!,,--	   r    c                   .    e Zd ZU eed<   eed<   eed<   dS )AccessRequesttx_hashrequester_addressauthor_addressN__name__
__module____qualname__str__annotations__r   r    r!   r$   r$   +   s3         LLLr    r$   c                   D    e Zd ZU dZee         ed<   dZee         ed<   dS )AccessResponseNaes_key_hexerror)r)   r*   r+   r0   r   r,   r-   r1   r   r    r!   r/   r/   1   s:         !%K#%%%E8C=r    r/   c                   N    e Zd ZU eed<   eed<   eed<   ee         ed<   eed<   dS )ReportListItemr%   authorinstance_idmarkets	timestampN)r)   r*   r+   r,   r-   r   listr   r    r!   r3   r3   6   sG         LLLKKK#YNNNNNr    r3   c                   $    e Zd ZU eed<   eed<   dS )DecryptedReportr%   	plaintextNr(   r   r    r!   r:   r:   >   s"         LLLNNNNNr    r:   z/reports/by-author/{address})response_modeladdressc                    K   t                      }t          |          }|                    |           }d |D             S )z5List all report tx hashes for a given author address.c                     g | ]z}t          |                    d d          |                    dd          |                    dd          |                    dg           |                    dd                    {S )r%    r4   r5   r   r6   r7   )r%   r4   r5   r6   r7   )r3   r   ).0rpts     r!   
<listcomp>z*list_reports_by_author.<locals>.<listcomp>M   s     	 	 	  	GGIr**778R((q11GGIr**ggk2..	
 	
 	
	 	 	r    )r"   r   list_reports_by_author)r=   rmanagerreportss       r!   rD   rD   G   sT       	Aq!!G,,W55G	 	 	 	 	 	r    z/reports/request-accessreqc                    K   t                      }t          |          }|                    | j        | j        | j                  }|rt          |          S t          d          S )z
    Request a 24-hour decryption key for a report.

    The requester must be a pledged syndicate member (checked against registry.yaml).
    Authors always get access to their own reports.
    r%   r&   r'   )r0   z<Access denied. Requester must be a pledged syndicate member.)r1   )r"   r   grant_accessr%   r&   r'   r/   )rH   rE   rF   key_hexs       r!   request_report_accessrM   Y   sw       	Aq!!G""/) #  G  d'2222$bccccr    z/reports/decryptc                   K   t                      }t          |          }|                    | j        | j        | j                  }|st          dd          t          | j                   d{V }|st          dd          	 t          j	        |          \  }}}t                              |          }t          |||          }	t          | j        |	          S # t          $ r}
t          d	d
|
           d}
~
ww xY w)z
    Full read flow: request access key, fetch calldata from Base, decrypt.

    Convenience endpoint that combines access request + fetch + decrypt.
    rJ   i  z.Access denied. Not a pledged syndicate member.status_codedetailNi  z)Transaction not found or has no calldata.)r%   r;   i  zDecryption failed: )r"   r   rK   r%   r&   r'   r   r
   r   parse_chain_bytesbytesfromhexr	   r:   	Exception)rH   rE   rF   rL   raw_dataversionnonce
ciphertext	key_bytesr;   es              r!   decrypt_onchain_reportr\   p   s=      	Aq!!G ""/) #  G
  f4deeee 's{33333333H a4_````O%4%Fx%P%P"
MM'**	":ui@@	s{iHHHH O O O4M!4M4MNNNNOs   AC! !
D+C??Dc                   f    e Zd ZU ee         ed<   eed<   dZee         ed<   dZe	ed<   dZ
eed<   dS )	GameEntrySchemar6   
start_timeN	stop_time   contract_sizeFhigher_first)r)   r*   r+   r8   r,   r-   r`   r   rb   r   rc   boolr   r    r!   r^   r^      s_         #YOOO#Ix}###M3L$r    r^   c                   &    e Zd ZU ee         ed<   dS )ScheduleRequestgamesN)r)   r*   r+   r8   r^   r-   r   r    r!   rf   rf      s#               r    rf   c                   >    e Zd ZU eed<   eed<   dZee         ed<   dS )ScheduleResponseschedule_id
game_countNbase_tx)r)   r*   r+   r,   r-   r   rl   r   r   r    r!   ri   ri      s;         OOO!GXc]!!!!!r    ri   c                       e Zd ZU eed<   eed<   ee         ed<   eed<   dZee         ed<   eed<   dZ	ee         ed<   dZ
ee         ed	<   dS )
ScheduleListItemrj   
game_indexr6   r_   Nr`   statusr5   rl   )r)   r*   r+   r,   r-   r   r8   r`   r   r5   rl   r   r    r!   rn   rn      s         OOO#YOOO#Ix}###KKK!%K#%%%!GXc]!!!!!r    rn   z/schedule/gamesc                   K   | j         st          dd          t          | j                   dk    rt          dd          t                      }t          j                            d          }t          j                            d          }d | j         D             }t          ||||	           d
{V }t          |j	        t          |j                   |j
                  S )a  
    Schedule a list of games for automated trading.

    Each game specifies market tickers, start time, and optional stop time.
    The schedule is committed to Base as an immutable on-chain record,
    then stored in Redis for the execution engine to deploy at game time.
    i  zNo games provided.rO      zMaximum 20 games per schedule.LUCKBOT_BASE_ADDRESSLUCKBOT_BASE_PRIVATE_KEYc                 6    g | ]}|                                 S r   )
model_dumprA   gs     r!   rC   z"schedule_games.<locals>.<listcomp>   s     555a1<<>>555r    )rg   redis_clientbase_addressbase_keyN)rj   rk   rl   )rg   r   lenr"   r   r   r   r   ri   rj   rl   )rH   rE   rz   r{   games_dicts
commitments         r!   schedule_gamesr      s      9 J4HIIII
39~~4TUUUUA:>>"899Lz~~899H5539555K&!	        J *z'(("   r    z/schedule/pendingc                  X   K   t                      } t          |           }d |D             S )z4List all pending scheduled games (not yet deployed).c                 N   g | ]}t          |                    d d          |                    dd          |                    dg           |                    dd          |                    d          |                    dd          |                    d	          
          S )rj   r@   ro   r   r6   r_   r`   rp   pendingrl   )rj   ro   r6   r_   r`   rp   rl   rn   r   rw   s     r!   rC   z(get_pending_schedule.<locals>.<listcomp>   s         	mR00uu\1--EE)R((uu\2..eeK((559--EE)$$	
 	
 	
  r    )r"   r   rE   rg   s     r!   get_pending_scheduler      sA       	Aq!!E     r    z/schedule/activec                  X   K   t                      } t          |           }d |D             S )z+List all currently running scheduled games.c                 v   g | ]}t          |                    d d          |                    dd          |                    dg           |                    dd          |                    d          |                    dd          |                    d	          |                    d
                    S )rj   r@   ro   r   r6   r_   r`   rp   runningr5   rl   )rj   ro   r6   r_   r`   rp   r5   rl   r   rw   s     r!   rC   z'get_active_schedule.<locals>.<listcomp>   s         	mR00uu\1--EE)R((uu\2..eeK((559--m,,EE)$$		
 		
 		
  r    )r"   r   r   s     r!   get_active_scheduler      sA       	Aa  E     r    )(__doc__r   fastapir   r   pydanticr   typingr   r   agentic.syndicate.report_cryptor   r   r	   agentic.syndicate.chain_writerr
    agentic.syndicate.game_schedulerr   r   r   routerr"   r$   r/   r3   r:   r   r8   r,   rD   postrM   r\   r^   rf   ri   rn   r   r   r   r   r    r!   <module>r      s    
			 , , , , , , , ,              ] ] ] ] ] ] ] ] ] ] < < < < < <          
,-	.	.	.      I            Y      
    Y       i    *4;OPP#    QP" &~FFd] d d d GFd, @@Om O O O A@OJ    i   ! ! ! ! !i ! ! !" " " " "y " " "" " " " "y " " " /?@@o    A@@ 5E0FGG  HG$ t4D/EFF  GF  r    