43 lines
1.7 KiB
Python
43 lines
1.7 KiB
Python
import logging
|
|
|
|
from dexorder import dec
|
|
from dexorder.base.chain import current_chain
|
|
from dexorder.blockstate import BlockDict
|
|
from dexorder.blockstate.blockdata import K, V
|
|
from dexorder.util import json
|
|
|
|
# pub=... publishes to a channel for web clients to consume. argument is (key,value) and return must be (event,room,args)
|
|
# if pub is True, then event is the current series name, room is the key, and args is [value]
|
|
# values of DELETE are serialized as nulls
|
|
|
|
def pub_vault_balances(k, v):
|
|
chain_id = current_chain.get().chain_id
|
|
try:
|
|
return f'{chain_id}|{vault_owners[k]}', 'vb', (chain_id, k, json.dumps({k2: str(v2) for k2, v2 in v.items()}))
|
|
except KeyError:
|
|
logging.warning(f'No vault owner record for {k}')
|
|
return None # no vault on record
|
|
|
|
|
|
vault_owners: BlockDict[str, str] = BlockDict('v', db=True, redis=True)
|
|
vault_balances: BlockDict[str, dict[str, int]] = BlockDict(
|
|
f'vb', db=True, redis=True,
|
|
value2str=lambda d: json.dumps({k: str(v) for k, v in d.items()}), # ints can be large so we need to stringify them in JSON
|
|
str2value=lambda s: {k: int(v) for k, v in json.loads(s).items()},
|
|
pub=pub_vault_balances
|
|
)
|
|
|
|
|
|
class PoolPrices (BlockDict[str, dec]):
|
|
def __setitem__(self, item: K, value: V) -> None:
|
|
super().__setitem__(item, value)
|
|
new_pool_prices[item] = value
|
|
|
|
|
|
def pub_pool_price(k,v):
|
|
chain_id = current_chain.get().chain_id
|
|
return f'{chain_id}|{k}', 'p', (chain_id, k, str(v))
|
|
|
|
new_pool_prices: dict[str, dec] = {} # tracks which prices were set during the current block. cleared every block.
|
|
pool_prices: PoolPrices = PoolPrices('p', db=True, redis=True, pub=pub_pool_price, value2str=lambda d: f'{d:f}', str2value=dec)
|