§
    šŠtj�  ã                   ó’   — d dl Z d dlZd dlZd dlmZ d dlmZmZ d dlZd dl	m
Z
 d dlmZ  G d„ de¦  «        Z G d„ d	e¦  «        ZdS )
é    N)ÚEnum)ÚListÚOptional)ÚDocument)Ú
BaseLoaderc                   ó^   — e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdS )ÚBlockchainTypez(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-sepoliaN)Ú__name__Ú
__module__Ú__qualname__Ú__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© ó    úm/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/document_loaders/blockchain.pyr	   r	      ss   € € € € € Ø2Ð2à€KØ€JØ€KØ€KØ'€OØ%€NØ!€LØ€KØ€KØ€JØ€JØ!€LØ!€LØ#€MØ#€MØ%€NØ%€NØ!€LØ!€L€L€Lr"   r	   c                   óœ   — e Zd ZdZej        ddddfdededed	ed
edee	         fd„Z
dee         fd„Zdedefd„Zededefd„¦   «         ZdS )ÚBlockchainDocumentLoadera9  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                 ó0  — || _         |j        | _        t          j                             d¦  «        p|| _        || _        || _        || _	        | j        st          d¦  «        ‚t          j        d| j         ¦  «        st          d| j         › �¦  «        ‚dS )au  

        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+   r,   Ú
ValueErrorÚreÚmatch)Úselfr'   r(   r)   r*   r+   r,   s          r#   Ú__init__z!BlockchainDocumentLoader.__init__?   s¡   € ð& !1ˆÔØ,Ô2ˆÔÝ”z—~’~Ð&7Ñ8Ô8ÐC¸GˆŒØ$ˆŒØ,ˆÔØ"4ˆÔàŒ|ð 	>ÝÐ<Ñ=Ô=Ð=åŒxÐ.°Ô0EÑFÔFð 	RÝÐP¸Ô9NÐPÐPÑQÔQÐQð	Rð 	Rr"   Úreturnc                 óÈ  — g }| j         }t          j        ¦   «         }	 d| j        › d| j        › d| j        › d|› �}t          j        |¦  «        }|j        dk    rt          d|j        › �¦  «        ‚| 	                    ¦   «         d         }|sn»|D ]S}t          |¦  «        }|d	         d
         }	| j        | j        |	dœ}
|                     t          ||
¬¦  «        ¦  «         ŒT| j        sn]|                      |d         j        d
         ¦  «        }| j        �.t          j        ¦   «         |z
  | j        k    rt#          d¦  «        ‚�Œ+|st          d| j        › �¦  «        ‚|S )NTzhttps://z.g.alchemy.com/nft/v2/z8/getNFTsForCollection?withMetadata=True&contractAddress=z&startToken=éÈ   z Request failed with status code ÚnftsÚidÚtokenId)ÚsourceÚ
blockchainr=   )Úpage_contentÚmetadataéÿÿÿÿz/Execution time exceeded the allowed time limit.z#No NFTs found for contract address )r*   Útimer(   r)   r'   Úrequestsr2   Ústatus_coder3   ÚjsonÚstrÚappendr   r+   Ú_get_next_tokenIdrA   r,   ÚRuntimeError)r6   ÚresultÚcurrent_start_tokenÚ
start_timeÚurlÚresponseÚitemsÚitemÚcontentr=   rA   s              r#   ÚloadzBlockchainDocumentLoader.load_   sÌ  € Øˆà"œoÐå”Y‘[”[ˆ
ð)	Vð5˜4Ô.ð 5ð 5Ø”<ð5ð 5à(,Ô(=ð5ð 5ð  3ð5ð 5ð õ  ”| CÑ(Ô(ˆHàÔ# sÒ*Ð*Ý ØM°xÔ7KÐMÐMñô ð ð —M’M‘O”O FÔ+ˆEàð Øàð Qð Q�Ý˜d™)œ)�Ø˜tœ* YÔ/�à"Ô3Ø"&Ô"5Ø&ðð �ð
 —’�h°GÀhÐOÑOÔOÑPÔPÐPÐPð Ô&ð Øð #'×"8Ò"8¸À¼Ô9LÈYÔ9WÑ"XÔ"XÐð Ô'Ð3Ý”Y‘[”[ :Ñ-°Ô1HÒHÐHå"Ð#TÑUÔUÐUñS)	VðV ð 	ÝØM°dÔ6KÐMÐMñô ð ð ˆr"   r=   c           
      óÎ  — |                       |¦  «        }|dk    rt          |d¦  «        }n.|dk    rt          |dd …         d¦  «        }nt          |¦  «        }|dz   }|dk    r6dt          |dt          t	          |¦  «        dz
  ¦  «        z   dz   ¦  «        z   S |dk    r6d	t          |dt          t	          |¦  «        d
z
  ¦  «        z   dz   ¦  «        z   S t          |¦  «        S )NÚhex_0xé   Úhex_0xbfé   é   Ú0xÚ0ÚxÚ0xbfé   )Ú_detect_value_typeÚintÚformatrG   Úlen)r6   r=   Ú
value_typeÚ	value_intrK   s        r#   rI   z*BlockchainDocumentLoader._get_next_tokenId™   sï   € Ø×,Ò,¨WÑ5Ô5ˆ
à˜Ò!Ð!Ý˜G RÑ(Ô(ˆIˆIØ˜:Ò%Ð%Ý˜G A B BœK¨Ñ,Ô,ˆIˆIå˜G™œˆIà˜Q‘ˆà˜Ò!Ð!Ø�& ¨­sµ3°w±<´<À!Ñ3CÑ/DÔ/DÑ)DÀsÑ)JÑKÔKÑKÐKØ˜:Ò%Ð%Ø�F 6¨3µµS¸±\´\ÀAÑ5EÑ1FÔ1FÑ+FÈÑ+LÑMÔMÑMÐMå�v‘;”;Ðr"   c                 ó�   — t          | t          ¦  «        rdS |                      d¦  «        rdS |                      d¦  «        rdS dS )Nr`   rZ   rU   r]   rW   )Ú
isinstancer`   Ú
startswith)r=   s    r#   r_   z+BlockchainDocumentLoader._detect_value_type­   sT   € å�g�sÑ#Ô#ð 	Ø�5Ø×Ò Ñ%Ô%ð 	Ø�8Ø×Ò Ñ'Ô'ð 	Ø�:à�:r"   )r
   r   r   r   r	   r   rG   Úboolr   r`   r7   r   r   rS   rI   Ústaticmethodr_   r!   r"   r#   r%   r%   %   s  € € € € € ðð ð8 *8Ô)CØ"ØØ$Ø,0ðRð RàðRð 'ðRð ð	Rð
 ðRð ðRð % SœMðRð Rð Rð Rð@7�d˜8”nð 7ð 7ð 7ð 7ðt¨ð °ð ð ð ð ð( ð Cð ¨Cð ð ð ñ „\ðð ð r"   r%   )r0   r4   rC   Úenumr   Útypingr   r   rD   Úlangchain_core.documentsr   Ú)langchain_community.document_loaders.baser   r	   r%   r!   r"   r#   ú<module>rn      sß   ðØ 	€	€	€	Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ð !Ð !à €€€Ø -Ð -Ð -Ð -Ð -Ð -à @Ð @Ð @Ð @Ð @Ð @ð"ð "ð "ð "ð "�Tñ "ô "ð "ð0Qð Qð Qð Qð Q˜zñ Qô Qð Qð Qð Qr"   