generate_metadata.py obeys approvals; filtered metadata-arb1.json 49kB

This commit is contained in:
tim
2024-10-07 16:01:26 -04:00
parent 532d1c846f
commit ffe92d577a
3 changed files with 43 additions and 24 deletions

File diff suppressed because one or more lines are too long

View File

@@ -1,13 +1,13 @@
# Prints a JSON string to stdout containing metadata information for all the known tokens and pools # Prints a JSON string to stdout containing metadata information for all the known tokens and pools
# #
# see metadata.py # see metadata.py
import asyncio
import logging import logging
import sys import sys
from sqlalchemy import select from sqlalchemy import select
from dexorder import db, ADDRESS_0 from dexorder import db, ADDRESS_0, config, blockchain
from dexorder.configuration import parse_args from dexorder.configuration import parse_args
from dexorder.database.model import Pool, Token from dexorder.database.model import Pool, Token
from dexorder.metadata import generate_metadata from dexorder.metadata import generate_metadata
@@ -15,15 +15,20 @@ from dexorder.metadata import generate_metadata
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
def main(): async def main():
logging.basicConfig(level=logging.INFO, stream=sys.stderr) logging.basicConfig(level=logging.INFO, stream=sys.stderr)
log.setLevel(logging.DEBUG) log.setLevel(logging.DEBUG)
parse_args() parse_args()
await blockchain.connect()
db.connect(migrate=False) db.connect(migrate=False)
tokens = db.session.scalars(select(Token)) tokens = db.session.scalars(select(Token))
pools = db.session.scalars(select(Pool).where(Pool.base!=ADDRESS_0 and Pool.quote!=ADDRESS_0)) pools = db.session.scalars(select(Pool).where(Pool.base!=ADDRESS_0 and Pool.quote!=ADDRESS_0))
if config.metadata:
with open(config.metadata, 'w') as file:
generate_metadata(tokens, pools, file=file)
else:
generate_metadata(tokens, pools) generate_metadata(tokens, pools)
if __name__ == '__main__': if __name__ == '__main__':
main() asyncio.run(main())

View File

@@ -23,7 +23,7 @@
# #
import logging import logging
import sys import sys
from typing import Union, Iterable from typing import Union, Iterable, Optional
from dexorder import config, NARG from dexorder import config, NARG
from dexorder.base.chain import current_chain from dexorder.base.chain import current_chain
@@ -46,20 +46,18 @@ def json_dump(out, **kwargs):
dump(out, json.dumps(dict(**kwargs))) dump(out, json.dumps(dict(**kwargs)))
def dump_tokens(out, tokens): def dump_tokens(out, tokens, include_unapproved=False):
first = True approved_addrs = set()
had_output = False
for token in tokens: for token in tokens:
token: Token token: Token
if first:
first = False
else:
dump(out, ',')
if isinstance(token, Token): if isinstance(token, Token):
token: Token token: Token
a = token.address a = token.address
n = token.name n = token.name
s = token.symbol s = token.symbol
d = token.decimals d = token.decimals
w = token.approved
x = None x = None
elif 'a' in token: elif 'a' in token:
token: TokenDict token: TokenDict
@@ -67,6 +65,7 @@ def dump_tokens(out, tokens):
n = token['n'] n = token['n']
s = token['s'] s = token['s']
d = token['d'] d = token['d']
w = token.get('w')
x = token.get('x') x = token.get('x')
elif 'address' in token: elif 'address' in token:
token: OldTokenDict token: OldTokenDict
@@ -74,6 +73,7 @@ def dump_tokens(out, tokens):
n = token['name'] n = token['name']
s = token['symbol'] s = token['symbol']
d = token['decimals'] d = token['decimals']
w = token.get('approved')
x = token.get('x') x = token.get('x')
else: else:
raise ValueError('Unknown token type', token) raise ValueError('Unknown token type', token)
@@ -81,16 +81,22 @@ def dump_tokens(out, tokens):
data = dict(a=a, n=n, s=s, d=d) data = dict(a=a, n=n, s=s, d=d)
if x is not None: if x is not None:
data['x'] = x data['x'] = x
json_dump(out, **data) if w is not None:
data['w'] = w
approved = data.get('w', False)
def dump_pools(out, pools): if approved:
first = True approved_addrs.add(a)
for pool in pools: if include_unapproved or approved:
if first: if had_output:
first = False
else:
dump(out, ',') dump(out, ',')
json_dump(out, **data)
had_output = True
return approved_addrs
def dump_pools(out, pools, filter_token_addrs: Optional[set[str]] = None):
had_output = False
for pool in pools:
if isinstance(pool, Pool): if isinstance(pool, Pool):
a = pool.address a = pool.address
b = pool.base b = pool.base
@@ -124,7 +130,15 @@ def dump_pools(out, pools):
data = dict(a=a, b=b, q=q, f=f, e=e, d=d) data = dict(a=a, b=b, q=q, f=f, e=e, d=d)
if x is not None: if x is not None:
data['x'] = x data['x'] = x
if filter_token_addrs is not None:
output = b in filter_token_addrs and q in filter_token_addrs
else:
output = True
if output:
if had_output:
dump(out, ',')
json_dump(out, **data) json_dump(out, **data)
had_output = True
generating_metadata = False generating_metadata = False
@@ -142,11 +156,11 @@ def is_generating_metadata():
# noinspection PyShadowingNames # noinspection PyShadowingNames
def generate_metadata(tokens: Iterable[Union[Token, OldTokenDict]], pools: Iterable[Union[Pool, OldPoolDict]], def generate_metadata(tokens: Iterable[Union[Token, OldTokenDict]], pools: Iterable[Union[Pool, OldPoolDict]],
file=sys.stdout): *, file=sys.stdout, include_unapproved=False):
dump(file, '{"' + str(current_chain.get().id) + '":{"t":[') dump(file, '{"' + str(current_chain.get().id) + '":{"t":[')
dump_tokens(file, tokens) approved_token_addrs = dump_tokens(file, tokens, include_unapproved)
dump(file, '],"p":[') dump(file, '],"p":[')
dump_pools(file, pools) dump_pools(file, pools, approved_token_addrs)
dump(file, ']}}') dump(file, ']}}')