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
#
# see metadata.py
import asyncio
import logging
import sys
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.database.model import Pool, Token
from dexorder.metadata import generate_metadata
@@ -15,15 +15,20 @@ from dexorder.metadata import generate_metadata
log = logging.getLogger(__name__)
def main():
async def main():
logging.basicConfig(level=logging.INFO, stream=sys.stderr)
log.setLevel(logging.DEBUG)
parse_args()
await blockchain.connect()
db.connect(migrate=False)
tokens = db.session.scalars(select(Token))
pools = db.session.scalars(select(Pool).where(Pool.base!=ADDRESS_0 and Pool.quote!=ADDRESS_0))
generate_metadata(tokens, pools)
if config.metadata:
with open(config.metadata, 'w') as file:
generate_metadata(tokens, pools, file=file)
else:
generate_metadata(tokens, pools)
if __name__ == '__main__':
main()
asyncio.run(main())

View File

@@ -23,7 +23,7 @@
#
import logging
import sys
from typing import Union, Iterable
from typing import Union, Iterable, Optional
from dexorder import config, NARG
from dexorder.base.chain import current_chain
@@ -46,20 +46,18 @@ def json_dump(out, **kwargs):
dump(out, json.dumps(dict(**kwargs)))
def dump_tokens(out, tokens):
first = True
def dump_tokens(out, tokens, include_unapproved=False):
approved_addrs = set()
had_output = False
for token in tokens:
token: Token
if first:
first = False
else:
dump(out, ',')
if isinstance(token, Token):
token: Token
a = token.address
n = token.name
s = token.symbol
d = token.decimals
w = token.approved
x = None
elif 'a' in token:
token: TokenDict
@@ -67,6 +65,7 @@ def dump_tokens(out, tokens):
n = token['n']
s = token['s']
d = token['d']
w = token.get('w')
x = token.get('x')
elif 'address' in token:
token: OldTokenDict
@@ -74,6 +73,7 @@ def dump_tokens(out, tokens):
n = token['name']
s = token['symbol']
d = token['decimals']
w = token.get('approved')
x = token.get('x')
else:
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)
if x is not None:
data['x'] = x
json_dump(out, **data)
if w is not None:
data['w'] = w
approved = data.get('w', False)
if approved:
approved_addrs.add(a)
if include_unapproved or approved:
if had_output:
dump(out, ',')
json_dump(out, **data)
had_output = True
return approved_addrs
def dump_pools(out, pools):
first = True
def dump_pools(out, pools, filter_token_addrs: Optional[set[str]] = None):
had_output = False
for pool in pools:
if first:
first = False
else:
dump(out, ',')
if isinstance(pool, Pool):
a = pool.address
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)
if x is not None:
data['x'] = x
json_dump(out, **data)
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)
had_output = True
generating_metadata = False
@@ -142,11 +156,11 @@ def is_generating_metadata():
# noinspection PyShadowingNames
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_tokens(file, tokens)
approved_token_addrs = dump_tokens(file, tokens, include_unapproved)
dump(file, '],"p":[')
dump_pools(file, pools)
dump_pools(file, pools, approved_token_addrs)
dump(file, ']}}')