
    dh                         S SK r S SKrS SKrS SKJr  S SKJrJr  S SKrS SK	J
r
  S SKJr   " S S\5      r " S S	\5      rg)
    N)Enum)ListOptional)Document)
BaseLoaderc                   d    \ rS rSrSrSrSrSrSrSr	Sr
S	rS
rSrSrSrSrSrSrSrSrSrSrSrSrg)BlockchainType   z(Enumerator of the supported blockchains.zeth-mainnetz
eth-goerlizeth-sepoliazeth-holeskyzpolygon-mainnetzpolygon-mumbaizpolygon-amoyzarb-mainnetzarb-sepoliazopt-mainnetzopt-sepoliazbase-mainnetzbase-sepoliazblast-mainnetzblast-sepoliazzksync-mainnetzzksync-sepoliazzora-mainnetzzora-sepolia N)__name__
__module____qualname____firstlineno____doc__ETH_MAINNET
ETH_GOERLIETH_SEPOLIAETH_HOLESKYPOLYGON_MAINNETPOLYGON_MUMBAIPOLYGON_AMOYARB_MAINNETARB_SEPOLIA
OP_MAINNET
OP_SEPOLIABASE_MAINNETBASE_SEPOLIABLAST_MAINNETBLAST_SEPOLIAZKSYNC_MAINNETZKSYNC_SEPOLIAZORA_MAINNETZORA_SEPOLIA__static_attributes__r       g/var/www/html/shao/venv/lib/python3.13/site-packages/langchain_community/document_loaders/blockchain.pyr	   r	      sd    2KJKK'O%N!LKKJJ!L!L#M#M%N%N!L!Lr%   r	   c                       \ rS rSrSr\R                  SSSS4S\S\S	\S
\S\S\	\
   4S jjrS\\   4S jrS\S\4S jr\S\S\4S j5       rSrg)BlockchainDocumentLoader%   a  Load elements from a blockchain smart contract.

See supported blockchains here: https://python.langchain.com/v0.2/api_reference/community/document_loaders/langchain_community.document_loaders.blockchain.BlockchainType.html

If no BlockchainType is specified, the default is Ethereum mainnet.

The Loader uses the Alchemy API to interact with the blockchain.
ALCHEMY_API_KEY environment variable must be set to use this loader.

The API returns 100 NFTs per request and can be paginated using the
startToken parameter.

If get_all_tokens is set to True, the loader will get all tokens
on the contract.  Note that for contracts with a large number of tokens,
this may take a long time (e.g. 10k tokens is 100 requests).
Default value is false for this reason.

The max_execution_time (sec) can be set to limit the execution time
of the loader.

Future versions of this loader can:
    - Support additional Alchemy APIs (e.g. getTransactions, etc.)
    - Support additional blockchain APIs (e.g. Infura, Opensea, etc.)
z	docs-demo FNcontract_addressblockchainTypeapi_key
startTokenget_all_tokensmax_execution_timec                 d   Xl         UR                  U l        [        R                  R                  S5      =(       d    UU l        X@l        XPl        X`l	        U R                  (       d  [        S5      e[        R                  " SU R                   5      (       d  [        SU R                    35      eg)a5  

Args:
    contract_address: The address of the smart contract.
    blockchainType: The blockchain type.
    api_key: The Alchemy API key.
    startToken: The start token for pagination.
    get_all_tokens: Whether to get all tokens on the contract.
    max_execution_time: The maximum execution time (sec).
ALCHEMY_API_KEYzAlchemy API key not provided.z^0x[a-fA-F0-9]{40}$zInvalid contract address N)r+   valuer,   osenvirongetr-   r.   r/   r0   
ValueErrorrematch)selfr+   r,   r-   r.   r/   r0   s          r&   __init__!BlockchainDocumentLoader.__init__?   s    & !1,22zz~~&78CG$,"4||<==xx.0E0EFF89N9N8OPQQ Gr%   returnc                    / nU R                   n[        R                  " 5       n SU R                   SU R                   SU R                   SU 3n[
        R                  " U5      nUR                  S:w  a  [        SUR                   35      eUR                  5       S   nU(       d  OU HH  n[        U5      nUS   S	   n	U R                  U R                  U	S
.n
UR                  [        XS95        MJ     U R                  (       d  ObU R                  US   R                  S	   5      nU R                   b1  [        R                  " 5       U-
  U R                   :  a  [#        S5      eGMG  U(       d  [        SU R                   35      eU$ )Nzhttps://z.g.alchemy.com/nft/v2/z8/getNFTsForCollection?withMetadata=True&contractAddress=z&startToken=   z Request failed with status code nftsidtokenId)source
blockchainrB   )page_contentmetadataz/Execution time exceeded the allowed time limit.z#No NFTs found for contract address )r.   timer,   r-   r+   requestsr6   status_coder7   jsonstrappendr   r/   _get_next_tokenIdrF   r0   RuntimeError)r:   resultcurrent_start_token
start_timeurlresponseitemsitemcontentrB   rF   s              r&   loadBlockchainDocumentLoader.load_   s   "ooYY[
4..//E<<. !((,(=(='>235   ||C(H##s* 6x7K7K6LM  MMOF+Ed)t*Y/"33"&"5"5&
 hGOP  && #'"8"89L9LY9W"X ''3YY[:-1H1HH"#TUUS V 5d6K6K5LM  r%   rB   c           
      l   U R                  U5      nUS:X  a  [        US5      nO!US:X  a  [        USS  S5      nO[        U5      nUS-   nUS:X  a*  S[        US[        [	        U5      S-
  5      -   S-   5      -   $ US:X  a*  S	[        US[        [	        U5      S
-
  5      -   S-   5      -   $ [        U5      $ )Nhex_0x   hex_0xbf      0x0x0xbf   )_detect_value_typeintformatrL   len)r:   rB   
value_type	value_intrP   s        r&   rN   *BlockchainDocumentLoader._get_next_tokenId   s    ,,W5
!GR(I:%GABK,IGIQ!&s3w<!3C/D)Ds)JKKK:%F63S\A5E1F+F+LMMMv;r%   c                     [        U [        5      (       a  gU R                  S5      (       a  gU R                  S5      (       a  gg)Nrf   r`   r[   rc   r]   )
isinstancerf   
startswith)rB   s    r&   re   +BlockchainDocumentLoader._detect_value_type   s=    gs##%%''r%   )r-   r,   r+   r/   r0   r.   )r   r   r   r   r   r	   r   rL   boolr   rf   r;   r   r   rX   rN   staticmethodre   r$   r   r%   r&   r(   r(   %   s    8 *8)C)C"$,0RR 'R 	R
 R R %SMR@7d8n 7t  ( C C  r%   r(   )r4   r8   rH   enumr   typingr   r   rI   langchain_core.documentsr   )langchain_community.document_loaders.baser   r	   r(   r   r%   r&   <module>rv      s7    	 	   !  - @"T "0Qz Qr%   