load pools/tokens from db
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
import logging
|
import logging
|
||||||
from typing import TypedDict, Optional
|
from typing import TypedDict, Optional, NotRequired
|
||||||
|
|
||||||
from sqlalchemy.orm import Mapped, mapped_column
|
from sqlalchemy.orm import Mapped, mapped_column
|
||||||
|
|
||||||
@@ -15,7 +15,7 @@ class TokenDict (TypedDict):
|
|||||||
s: str
|
s: str
|
||||||
d: int
|
d: int
|
||||||
w: Optional[bool] # approved ("w"hitelisted)
|
w: Optional[bool] # approved ("w"hitelisted)
|
||||||
x: Optional[dict] # extra data
|
x: NotRequired[dict] # extra data
|
||||||
|
|
||||||
|
|
||||||
# OldTokenDict is the primary dict we use in-memory, with basic JSON-able types
|
# OldTokenDict is the primary dict we use in-memory, with basic JSON-able types
|
||||||
@@ -28,7 +28,7 @@ class OldTokenDict (TypedDict):
|
|||||||
symbol: str
|
symbol: str
|
||||||
decimals: int
|
decimals: int
|
||||||
approved: bool # whether this token is in the whitelist or not
|
approved: bool # whether this token is in the whitelist or not
|
||||||
x: Optional[dict] # extra data
|
x: NotRequired[dict] # extra data
|
||||||
|
|
||||||
|
|
||||||
# the database object is primarily write-only so we are able to index queries for pools-by-token from the nodejs server
|
# the database object is primarily write-only so we are able to index queries for pools-by-token from the nodejs server
|
||||||
|
|||||||
@@ -3,16 +3,18 @@ import logging
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
|
from sqlalchemy.exc import NoResultFound
|
||||||
from web3.exceptions import ContractLogicError
|
from web3.exceptions import ContractLogicError
|
||||||
from web3.types import EventData
|
from web3.types import EventData
|
||||||
|
|
||||||
from dexorder import dec, ADDRESS_0, from_timestamp
|
from dexorder import dec, ADDRESS_0, from_timestamp, db
|
||||||
from dexorder.addrmeta import address_metadata
|
from dexorder.addrmeta import address_metadata
|
||||||
from dexorder.base.chain import current_chain
|
from dexorder.base.chain import current_chain
|
||||||
from dexorder.base.orderlib import Exchange
|
from dexorder.base.orderlib import Exchange
|
||||||
from dexorder.blockstate import BlockDict
|
from dexorder.blockstate import BlockDict
|
||||||
from dexorder.blockstate.blockdata import K, V
|
from dexorder.blockstate.blockdata import K, V
|
||||||
from dexorder.blocks import get_block_timestamp
|
from dexorder.blocks import get_block_timestamp
|
||||||
|
from dexorder.database.model import Pool
|
||||||
from dexorder.database.model.pool import OldPoolDict
|
from dexorder.database.model.pool import OldPoolDict
|
||||||
from dexorder.metadata import is_generating_metadata
|
from dexorder.metadata import is_generating_metadata
|
||||||
from dexorder.tokens import get_token
|
from dexorder.tokens import get_token
|
||||||
@@ -33,6 +35,10 @@ async def load_pool(address: str) -> OldPoolDict:
|
|||||||
found = None
|
found = None
|
||||||
chain_id = current_chain.get().id
|
chain_id = current_chain.get().id
|
||||||
# todo other exchanges
|
# todo other exchanges
|
||||||
|
pool = db.session.get(Pool, (chain_id, address))
|
||||||
|
if pool is not None:
|
||||||
|
return OldPoolDict(type='Pool', chain=chain_id, address=address, exchange=pool.exchange.value,
|
||||||
|
base=pool.base, quote=pool.quote, fee=pool.fee, decimals=pool.decimals)
|
||||||
try:
|
try:
|
||||||
v3 = UniswapV3Pool(address)
|
v3 = UniswapV3Pool(address)
|
||||||
t0, t1 = await asyncio.gather(v3.token0(), v3.token1())
|
t0, t1 = await asyncio.gather(v3.token0(), v3.token1())
|
||||||
|
|||||||
@@ -4,10 +4,11 @@ from typing import Optional
|
|||||||
from eth_abi.exceptions import InsufficientDataBytes
|
from eth_abi.exceptions import InsufficientDataBytes
|
||||||
from web3.exceptions import ContractLogicError, BadFunctionCallOutput
|
from web3.exceptions import ContractLogicError, BadFunctionCallOutput
|
||||||
|
|
||||||
from dexorder import ADDRESS_0, config
|
from dexorder import ADDRESS_0, config, db
|
||||||
from dexorder.addrmeta import address_metadata
|
from dexorder.addrmeta import address_metadata
|
||||||
from dexorder.base.chain import current_chain
|
from dexorder.base.chain import current_chain
|
||||||
from dexorder.contract import ERC20, ContractProxy, CONTRACT_ERRORS
|
from dexorder.contract import ERC20, ContractProxy, CONTRACT_ERRORS
|
||||||
|
from dexorder.database.model import Token
|
||||||
from dexorder.database.model.token import OldTokenDict
|
from dexorder.database.model.token import OldTokenDict
|
||||||
from dexorder.metadata import get_metadata
|
from dexorder.metadata import get_metadata
|
||||||
|
|
||||||
@@ -27,7 +28,12 @@ async def get_token(address) -> Optional[OldTokenDict]:
|
|||||||
|
|
||||||
async def load_token(address: str) -> Optional[OldTokenDict]:
|
async def load_token(address: str) -> Optional[OldTokenDict]:
|
||||||
contract = ERC20(address)
|
contract = ERC20(address)
|
||||||
|
chain_id = current_chain.get().id
|
||||||
|
token = db.session.get(Token, (chain_id, address))
|
||||||
|
if token is not None:
|
||||||
|
return OldTokenDict(type='Token', chain=chain_id, address=address,
|
||||||
|
name=token.name, symbol=token.symbol, decimals=token.decimals,
|
||||||
|
approved=token.approved)
|
||||||
async def get_string_or_bytes32(func_name):
|
async def get_string_or_bytes32(func_name):
|
||||||
try:
|
try:
|
||||||
result = await getattr(contract, func_name)()
|
result = await getattr(contract, func_name)()
|
||||||
|
|||||||
Reference in New Issue
Block a user