y.prices.utils package

Submodules

y.prices.utils.buckets module

ASyncFunctiony.prices.utils.buckets.check_bucket(token: str | hexbytes.main.HexBytes | AnyAddress | brownie.convert.datatypes.EthAddress | brownie.network.contract.Contract | int) str[source]

Determine the category or ‘bucket’ of a given token.

This function attempts to classify a token into a specific category based on its characteristics. It first checks the database for a cached bucket using y._db.utils.token.get_bucket(). If not found, it performs a series of checks that may involve string comparisons, calls to the blockchain, and contract initializations. The determined bucket is then stored using db.set_bucket().

Args:

token: The token address to classify.

Examples:
>>> bucket = check_bucket("0x6B175474E89094C44Da98b954EedeAC495271d0F")
>>> print(bucket)
'stable usd'
See Also:

Since check_bucket is an ASyncFunctionSyncDefault, you can optionally pass sync=False or asynchronous=True to force it to return a coroutine. Without either kwarg, it will run synchronously.

Parameters:

token (str | HexBytes | AnyAddress | EthAddress | Contract | int)

Return type:

str

y.prices.utils.sense_check module

This module contains utilities for sense checking prices returned from the library.

A user will not need to use anything here.

Developers can skip the sense check for additional tokens by manually adding them to the ACCEPTABLE_HIGH_PRICES mapping in the source code. This involves directly editing the mapping to include the new token addresses under the appropriate network. Note that this requires modifying the source code, which may not be ideal for all users.

async y.prices.utils.sense_check.sense_check(token_address, block, price)[source]

Performs a sense check on the given token price and logs a warning if it is unexpectedly high.

This is just to help catch potential bugs before they cause issues.

Parameters:
  • token_address (str) – The address of the token.

  • block (int | None) – The optional block number to use for the error message.

  • price (float) – The price to check.

Example

>>> await sense_check("0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", 14_000_000, 123450000.00)
unusually high price ($123450000.00) returned for USDC "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" on Mainnet block 14000000. This does not necessarily mean that the price is wrong, but you may want to validate the price for yourself before proceeding.

Note

This function checks if the price is within acceptable ranges based on the token type and network. It will not log for various special cases such as ETH-like tokens, BTC-like tokens, LP tokens, and vault tokens where the underlying is exempt from the sense check.

See also

_exit_sense_check() for details on tokens that are exempt from the sense check.

y.prices.utils.sense_check.ACCEPTABLE_HIGH_PRICES = ['0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE', '0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0', '0xA3D87FffcE63B53E0d54fAa1cc983B7eB0b74A9c', '0xaA17A236F2bAdc98DDc0Cf999AbB47D47Fc0A6Cf', '0x53a901d48795C58f485cBB38df08FA96a24669D5', '0xC4C319E2D4d66CcA4464C0c2B32c9Bd23ebe784e', '0x06325440D014e39736583c165C2963BA99fAf14E', '0x5e74C9036fb86BD7eCdcb084a0673EFc32eA31cb', '0xae78736Cd615f374D3085123A210448E74Fc6393', '0xE95A203B1a91a908F9B9CE46459d101078c2c3cb', '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84', '0x9559Aaa82d9649C7A7b220E7c461d2E74c9a3593', '0x836A808d4828586A69364065A1e064609F5078c7', '0xc3D088842DcF02C13699F936BB83DFBBc6f721Ab', '0xC1330aCBbcE97cb9695B7ee161c0F95B875a8b0F', '0x5E8422345238F34275888049021821E8E08CAa1f', '0x856c4Efb76C1D1AE02e20CEB03A2A6a08b0b8dC3', '0xE72B141DF173b999AE7c1aDcbF60Cc9833Ce56a8', '0x3d1E5Cf16077F349e999d6b21A4f646e83Cd90c5', '0x0100546F2cD4C9D97f798fFC9755E47865FF7Ee6', '0xBe9895146f7AF43049ca1c1AE358B0541Ea49704', '0x7C07F7aBe10CE8e33DC6C5aD68FE033085256A84', '0xA35b1B31Ce002FBF2058D22F30f95D405200A15b', '0x64351fC9810aDAd17A690E4e1717Df5e7e085160', '0x821A278dFff762c76410264303F25bF42e195C0C', '0xa2E3356610840701BDf5611a53974510Ae27E2e1', '0x1BED97CBC3c24A4fb5C069C6E311a967386131f7', '0x3A65cbaebBFecbeA5D0CB523ab56fDbda7fF9aAA', '0x6951bDC4734b9f7F3E1B74afeBC670c736A0EDB6', '0xf1C9acDc66974dFB6dEcB12aA385b9cD01190E38', '0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee', '0x04C154b66CB340F3Ae24111CC767e0184Ed00Cc6', '0x005F893EcD7bF9667195642f7649DA8163e23658', '0xc2e660C62F72c2ad35AcE6DB78a616215E2F2222', '0xA1290d69c65A6Fe4DF752f95823fae25cB99e5A7', '0x09db87A538BD693E9d08544577d5cCfAA6373A48', '0xEB4C2781e4ebA804CE9a9803C67d0893436bB27D', '0xfE18be6b3Bd88A2D2A7f928d00292E7a9963CfC6', '0x49849C98ae39Fff122806C06791Fa73784FB3675', '0x075b1bb99792c9E1041bA13afEf80C91a1e70fB3', '0xb19059ebb43466C323583928285a49f558E572Fd', '0x64eda51d3Ad40D56b9dFc5554E06F94e1Dd786Fd', '0xDE5331AC4B3630f94853Ff322B66407e0D6331E8', '0x410e3E86ef427e30B9235497143881f717d93c2A', '0x2fE94ea3d5d4a175184081439753DE15AeF9d614', '0x0327112423F3A68efdF1fcF402F6c5CB9f7C33fd', '0x3212b29E33587A00FB1C83346f5dBFA69A458923', '0x5228a22e72ccC52d415EcFd199F99D0665E7733b', '0xFbdCA68601f835b27790D98bbb8eC7f05FDEaA9B', '0x0316EB71485b0Ab14103307bf65a021042c6d380', '0x9BE89D2a4cd102D8Fecc6BF9dA793be995C22541', '0x8064d9Ae6cDf087b1bcd5BDf3531bD5d8C537a68', '0x8dAEBADE922dF735c38C80C7eBD708Af50815fAa', '0x8751D4196027d4e6DA63716fA7786B5174F04C15', '0x66eFF5221ca926636224650Fd3B9c497FF828F7D', '0x18084fbA666a33d37592fA2633fD49a74DD93a88', '0x661c70333AA1850CcDBAe82776Bb436A0fCfeEfB', '0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf', '0x45804880De22913dAFE09f4980848ECE6EcbAf78', '0x4922a015c4407F87432B179bb209e125432E4a2A', '0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e', '0xFf71841EeFca78a64421db28060855036765c248', '0xa3f152837492340dAAf201F4dFeC6cD73A8a9760', '0x41252E8691e964f7DE35156B68493bAb6797a275', '0x1cEB5cB57C4D4E2b2433641b95Dd330A33185A44', '0xD5525D397898e5502075Ea5E830d8914f6F0affe', '0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2', '0x3A283D9c08E8b55966afb64C515f5143cf907611', '0x23B608675a2B2fB1890d3ABBd85c5775c51691d5', '0xcA3d75aC011BF5aD07a98d02f18225F9bD9A6BDF', '0xc4AD29ba4B3c580e6D59105FFf484999997675Ff', '0xd075e95423C5c4BA1E122CaE0f4CdFA19b82881b', '0xe9F84dE264E91529aF07Fa2C746e934397810334', '0xa1d0E215a23d7030842FC67cE582a6aFa3CCaB83', '0x0fe629d1E84E171f8fF0C1Ded2Cc2221Caa48a3f', '0x5F0E628B693018f639D10e4A4F59BD4d8B2B6B44', '0xdBdb4d16EdA451D0503b854CF79D55697F90c8DF', '0x3aaDA3e213aBf8529606924d8D1c55CbDc70Bf74', '0x892A6f9dF0147e5f079b0993F486F9acA3c87881', '0x0ab87046fBb341D058F17CBC4c1133F25a20a52f', '0x97983236bE88107Cc8998733Ef73D8d969c52E37', '0x68749665FF8D2d112Fa859AA293F07A622782F38', '0xf5f5B97624542D72A9E06f04804Bf81baA15e2B4', '0x7F86Bf177Dd4F3494b841a37e810A34dD56c829B', '0x2889302a794dA87fBF1D6Db415C1492194663D13', '0xBfAb6FA95E0091ed66058ad493189D2cB29385E6', '0x641927E970222B10b2E8CDBC96b1B4F427316f16', '0x9cea2eD9e47059260C97d697f82b8A14EfA61EA5', '0x269616D549D7e8Eaa82DFb17028d0B212D11232A', '0x69BbE2FA02b4D90A944fF328663667DC32786385', '0xD70240Dd62F4ea9a6A2416e0073D72139489d2AA', '0x114f1388fAB456c4bA31B1850b244Eedcd024136', '0xEA47B64e1BFCCb773A0420247C0aa0a3C1D2E5C5', '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2', '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599']

List of tokens addresses for which high prices are acceptable. Nothing will be logged for tokens in this list.

y.prices.utils.ypriceapi module

exception y.prices.utils.ypriceapi.BadResponse[source]

Bases: Exception

Exception raised for bad responses from ypriceAPI.

y.prices.utils.ypriceapi.announce_beta()[source]

Announce the beta version of ypriceAPI.

This function logs the beta announcement message, which includes information about the benefits of using ypriceAPI and testimonials from users.

Examples

>>> announce_beta()
ypriceAPI is now in beta!
...
Return type:

None

y.prices.utils.ypriceapi.chain_supported(chainid)[source]

Check if a chain is supported by ypriceAPI.

Parameters:

chainid (int) – The chain ID to check.

Returns:

True if the chain is supported, False otherwise.

Return type:

bool

Examples

>>> await chain_supported(1)
True
>>> await chain_supported(9999)
False

See also

get_chains() for retrieving the list of supported chains.

y.prices.utils.ypriceapi.get_chains()[source]

Get the supported chains from ypriceAPI.

Returns:

A dictionary mapping chain IDs to chain names.

Return type:

Dict[int, str]

Examples

>>> chains = await get_chains()
>>> chains[1]
'Ethereum Mainnet'
async y.prices.utils.ypriceapi.get_price(token, block)[source]

Get the price of a token from ypriceAPI.

Parameters:
Returns:

The price of the token in USD as an instance of UsdPrice, or None if the price cannot be retrieved.

Return type:

UsdPrice | None

This function will return None if the authorization headers are not present or if the current time is less than the resume time.

Examples

>>> price = await get_price("0xTokenAddress", 12345678)
>>> print(price)
$1234.56780000
Raises:
  • ClientConnectorSSLError – If there is an SSL error during the request.

  • asyncio.TimeoutError – If the request times out.

  • ClientError – If there is a client error during the request.

Parameters:
Return type:

UsdPrice | None

See also

UsdPrice for the price representation.

y.prices.utils.ypriceapi.get_retry_header(x)
y.prices.utils.ypriceapi.get_session()[source]

Get an aiohttp ClientSession for ypriceAPI.

This session is configured with the ypriceAPI URL, headers, and timeout.

Returns:

An aiohttp ClientSession object.

Return type:

ClientSession

Examples

>>> session = await get_session()
async y.prices.utils.ypriceapi.read_response(response, token=None, block=None)[source]

Read and process the response from ypriceAPI.

Parameters:
Returns:

The parsed response data, or None if the response is not valid.

Raises:

BadResponse – If the response content type is invalid.

Return type:

Any | None

Examples

>>> response = await session.get("/get_price/1/0xTokenAddress?block=12345678")
>>> data = await read_response(response)

Module contents