Ë
    µŒj�  ã                   ó„   — 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y)
é    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y)Ú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© ó    úy/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/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                   ó’   — 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y)Ú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                 óL  — || _         |j                  | _        t        j                  j                  d«      xs || _        || _        || _        || _	        | j                  st        d«      ‚t        j                  d| j                   «      st        d| j                   › �«      ‚y)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Ñ2ˆÔÜ—z‘z—~‘~Ð&7Ó8ÒC¸GˆŒØ$ˆŒØ,ˆÔØ"4ˆÔà�|Š|ÜÐ<Ó=Ð=ä�x‰xÐ.°×0EÑ0EÔFÜÐ8¸×9NÑ9NÐ8OÐPÓQÐQð Gr"   Úreturnc                 óò  — g }| j                   }t        j                  «       }	 d| j                  › d| j                  › d| j                  › d|› �}t        j                  |«      }|j                  dk7  rt        d|j                  › �«      ‚|j                  «       d   }|sn»|D ]K  }t        |«      }|d   d	   }	| j                  | j                  |	d
œ}
|j                  t        ||
¬«      «       ŒM | j                  sn^| j                  |d   j                  d	   «      }| j                   �/t        j                  «       |z
  | j                   kD  rt#        d«      ‚�Œ9|st        d| j                  › �«      ‚|S )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Ú
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™oÐä—Y‘Y“[ˆ
àà˜4×.Ñ.Ð/Ð/EØ—<‘<�.ð !(Ø(,×(=Ñ(=Ð'>ØÐ2Ð3ð5ð ô  —|‘| CÓ(ˆHà×#Ñ# sÒ*Ü Ø6°x×7KÑ7KÐ6LÐMóð ð —M‘M“O FÑ+ˆEáØã�Ü˜d›)�Ø˜t™* YÑ/�à"×3Ñ3Ø"&×"5Ñ"5Ø&ñ�ð
 —‘œh°GÀhÔOÕPð ð ×&Ò&Øð #'×"8Ñ"8¸À¹×9LÑ9LÈYÑ9WÓ"XÐð ×'Ñ'Ð3Ü—Y‘Y“[ :Ñ-°×1HÑ1HÒHä"Ð#TÓUÐUñS ñV ÜØ5°d×6KÑ6KÐ5LÐMóð ð ˆr"   r=   c           
      ód  — | j                  |«      }|dk(  rt        |d«      }n |dk(  rt        |dd  d«      }nt        |«      }|dz   }|dk(  r*dt        |dt        t	        |«      dz
  «      z   dz   «      z   S |dk(  r*d	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ˆ
à˜Ò!Ü˜G RÓ(‰IØ˜:Ò%Ü˜G A B˜K¨Ó,‰Iä˜G›ˆIà˜Q‘ˆà˜Ò!Øœ& ¨¬s´3°w³<À!Ñ3CÓ/DÑ)DÀsÑ)JÓKÑKÐKØ˜:Ò%ØœF 6¨3´´S¸³\ÀAÑ5EÓ1FÑ+FÈÑ+LÓMÑMÐMä�v“;Ðr"   c                 ón   — t        | t        «      ry| j                  d«      ry| j                  d«      ryy)Nr`   rZ   rU   r]   rW   )Ú
isinstancer`   Ú
startswith)r=   s    r#   r_   z+BlockchainDocumentLoader._detect_value_type­   s4   € ä�gœsÔ#ØØ×Ñ Ô%ØØ×Ñ Ô'Øà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Ñ)CØ"ØØ$Ø,0ñRàðRð 'ðRð ð	Rð
 ðRð ðRð % S™MóRð@7�d˜8‘nó 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      s7   ðÛ 	Û 	Û Ý ß !ã Ý -å @ô"�Tô "ô0Q˜zõ Qr"   