§
    æ˜ºhM  ã                   ó’   — 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S )ÚBlockchainTypez(Enumerator of the supported blockchains.zeth-mainnetz
eth-goerlizpolygon-mainnetzpolygon-mumbaiN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚETH_MAINNETÚ
ETH_GOERLIÚPOLYGON_MAINNETÚPOLYGON_MUMBAI© ó    úw/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/langchain_community/document_loaders/blockchain.pyr	   r	      s(   € € € € € Ø2Ð2à€KØ€JØ'€OØ%€N€N€Nr   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 )ÚBlockchainDocumentLoadera  Load elements from a blockchain smart contract.

    The supported blockchains are: Ethereum mainnet, Ethereum Goerli testnet,
    Polygon mainnet, and Polygon Mumbai testnet.

    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 blockain 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__1   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   Úrequestsr#   Ústatus_coder$   ÚjsonÚstrÚappendr   r   Ú_get_next_tokenIdr2   r   ÚRuntimeError)r'   ÚresultÚcurrent_start_tokenÚ
start_timeÚurlÚresponseÚitemsÚitemÚcontentr.   r2   s              r   ÚloadzBlockchainDocumentLoader.loadQ   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Úformatr8   Úlen)r'   r.   Ú
value_typeÚ	value_intr<   s        r   r:   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 )NrQ   rK   rF   rN   rH   )Ú
isinstancerQ   Ú
startswith)r.   s    r   rP   z+BlockchainDocumentLoader._detect_value_typeŸ   sT   € å�g�sÑ#Ô#ð 	Ø�5Ø×Ò Ñ%Ô%ð 	Ø�8Ø×Ò Ñ'Ô'ð 	Ø�:à�:r   )r
   r   r   r   r	   r   r8   Úboolr   rQ   r(   r   r   rD   r:   ÚstaticmethodrP   r   r   r   r   r      s  € € € € € ðð ð: *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   )r!   r%   r4   Úenumr   Útypingr   r   r5   Úlangchain_core.documentsr   Ú)langchain_community.document_loaders.baser   r	   r   r   r   r   ú<module>r_      sß   ðØ 	€	€	€	Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ð !Ð !à €€€Ø -Ð -Ð -Ð -Ð -Ð -à @Ð @Ð @Ð @Ð @Ð @ð&ð &ð &ð &ð &�Tñ &ô &ð &ðRð Rð Rð Rð R˜zñ Rô Rð Rð Rð Rr   