Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 29 additions & 11 deletions aspirelib/lib/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,21 +37,25 @@
from aspirelib.lib import message_type
from aspirelib.lib.messages import send
from aspirelib.lib.messages import issuance
from aspirelib.lib.messages import order
from aspirelib.lib.messages import broadcast
from aspirelib.lib.messages import bet
from aspirelib.lib.messages import cancel
from aspirelib.lib.messages import dividend
from aspirelib.lib.messages import proofofwork
from aspirelib.lib.messages import publish
from aspirelib.lib.messages import execute

D = decimal.Decimal

API_TABLES = ['assets', 'balances', 'credits', 'debits',
'broadcasts', 'proofofwork',
API_TABLES = ['assets', 'balances', 'credits', 'debits', 'bets', 'bet_matches',
'broadcasts', 'proofofwork', 'cancels', 'bet_expirations', 'order_expirations', 'bet_match_expirations',
'order_match_expirations', 'bet_match_resolutions',
'dividends', 'issuances', 'sends',
'mempool']

API_TRANSACTIONS = ['broadcast', 'proofofwork',
'dividend', 'issuance', 'send',
API_TRANSACTIONS = [ 'bet', 'broadcast', 'proofofwork', 'cancel',
'dividend', 'issuance', 'send', 'order'
'publish', 'execute']

COMMONS_ARGS = ['encoding', 'fee_per_kb', 'regular_dust_size',
Expand Down Expand Up @@ -208,13 +212,20 @@ def value_to_marker(value):
bindings.append(filter_['value'])
# AND filters
more_conditions = []
if table not in ['balances']:
if start_block is not None:
if table not in ['balances', 'order_matches', 'bet_matches']:
if start_block != None:
more_conditions.append('''block_index >= ?''')
bindings.append(start_block)
if end_block is not None:
more_conditions.append('''block_index <= ?''')
bindings.append(end_block)
elif table in ['order_matches', 'bet_matches']:
if start_block != None:
more_conditions.append('''tx0_block_index >= ?''')
bindings.append(start_block)
if end_block != None:
more_conditions.append('''tx1_block_index <= ?''')
bindings.append(end_block)

# status
if isinstance(status, list) and len(status) > 0:
Expand All @@ -224,6 +235,12 @@ def value_to_marker(value):
more_conditions.append('''status == ?''')
bindings.append(status)

# legacy filters
if not show_expired and table == 'orders':
#Ignore BTC orders one block early.
expire_index = util.CURRENT_BLOCK_INDEX + 1
more_conditions.append('''((give_asset == ? AND expire_index > ?) OR give_asset != ?)''')
bindings += [config.BTC, expire_index, config.BTC]

if (len(conditions) + len(more_conditions)) > 0:
statement += ''' WHERE'''
Expand All @@ -235,12 +252,12 @@ def value_to_marker(value):
statement += ''' {}'''.format(''' AND '''.join(all_conditions))

# ORDER BY
if order_by is not None:
if order_by != None:
statement += ''' ORDER BY {}'''.format(order_by)
if order_dir is not None:
if order_dir != None:
statement += ''' {}'''.format(order_dir.upper())
# LIMIT
if limit:
if limit and limit > 0:
statement += ''' LIMIT {}'''.format(limit)
if offset:
statement += ''' OFFSET {}'''.format(offset)
Expand Down Expand Up @@ -698,8 +715,9 @@ def get_running_info():
def get_element_counts():
counts = {}
cursor = db.cursor()
for element in ['transactions', 'blocks', 'debits', 'credits', 'balances', 'sends',
'issuances', 'broadcasts', 'dividends', 'proofofwork', 'messages']:
for element in ['transactions', 'blocks', 'debits', 'credits', 'balances', 'sends', 'orders',
'order_matches', 'issuances', 'broadcasts', 'dividends', 'proofofwork', 'bets', 'bet_matches', 'cancels',
'order_expirations', 'bet_expirations', 'order_match_expirations', 'bet_match_expirations', 'messages']:
cursor.execute("SELECT COUNT(*) AS count FROM %s" % element)
count_list = cursor.fetchall()
assert len(count_list) == 1
Expand Down
20 changes: 19 additions & 1 deletion aspirelib/lib/blocks.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,9 @@

# Order matters for FOREIGN KEY constraints.
TABLES = ['credits', 'debits', 'messages'] + \
['broadcasts', 'proofofwork',
['bet_match_resolutions', 'order_match_expirations', 'order_matches',
'order_expirations', 'orders', 'bet_match_expirations', 'bet_matches',
'bet_expirations', 'bets', 'broadcasts', 'proofofwork', 'cancels',
'dividends', 'issuances', 'sends',
'executions', 'storage', 'suicides', 'nonces',
'postqueue', 'contracts', 'destructions', 'assets', 'addresses']
Expand Down Expand Up @@ -92,14 +94,22 @@ def parse_tx(db, tx):
send.parse(db, tx, message)
elif message_type_id == enhanced_send.ID and util.enabled('enhanced_sends', block_index=tx['block_index']):
enhanced_send.parse(db, tx, message)
elif message_type_id == order.ID:
order.parse(db, tx, message)
elif message_type_id == btcpay.ID:
btcpay.parse(db, tx, message)
elif message_type_id == issuance.ID:
issuance.parse(db, tx, message, message_type_id)
elif message_type_id == issuance.SUBASSET_ID and util.enabled('subassets', block_index=tx['block_index']):
issuance.parse(db, tx, message, message_type_id)
elif message_type_id == broadcast.ID:
broadcast.parse(db, tx, message)
elif message_type_id == bet.ID:
bet.parse(db, tx, message)
elif message_type_id == dividend.ID:
dividend.parse(db, tx, message)
elif message_type_id == cancel.ID:
cancel.parse(db, tx, message)
elif message_type_id == publish.ID and tx['block_index'] != config.MEMPOOL_BLOCK_INDEX:
publish.parse(db, tx, message)
elif message_type_id == execute.ID and tx['block_index'] != config.MEMPOOL_BLOCK_INDEX:
Expand Down Expand Up @@ -153,6 +163,10 @@ def parse_block(db, block_index, block_time,
undolog_cursor.execute('''INSERT OR REPLACE INTO undolog_block(block_index, first_undo_index) VALUES(?,?)''', (block_index, 1,))
undolog_cursor.close()

# Expire orders, jgoregjorgjeoe
order.expire(db, block_index)
bet.expire(db, block_index, block_time)

# Parse transactions, sorting them by type.
cursor = db.cursor()
cursor.execute('''SELECT * FROM transactions WHERE block_index=? ORDER BY tx_index''', (block_index,))
Expand Down Expand Up @@ -351,11 +365,15 @@ def initialise(db):
# Consolidated
send.initialise(db)
destroy.initialise(db)
order.initialise(db)
btcpay.initialise(db)
issuance.initialise(db)
broadcast.initialise(db)
bet.initialise(db)
publish.initialise(db)
execute.initialise(db)
dividend.initialise(db)
cancel.initialise(db)
proofofwork.initialise(db)

# Messages
Expand Down
53 changes: 52 additions & 1 deletion aspirelib/lib/log.py
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,15 @@ def output(quantity, asset):
return '<None>'

if command == 'update':
if category == 'proofofwork':
if category == 'order':
logger.debug('Database: set status of order {} to {}.'.format(bindings['tx_hash'], bindings['status']))
elif category == 'bet':
logger.debug('Database: set status of bet {} to {}.'.format(bindings['tx_hash'], bindings['status']))
elif category == 'order_matches':
logger.debug('Database: set status of order_match {} to {}.'.format(bindings['order_match_id'], bindings['status']))
elif category == 'bet_matches':
logger.debug('Database: set status of bet_match {} to {}.'.format(bindings['bet_match_id'], bindings['status']))
elif category == 'proofofwork':
logger.info('POW: block {} {}'.format(bindings['block_index'], bindings['status']))

# TODO: elif category == 'balances':
Expand All @@ -237,6 +245,12 @@ def output(quantity, asset):
elif category == 'sends':
logger.info('Send: {} from {} to {} ({}) [{}]'.format(output(bindings['quantity'], bindings['asset']), bindings['source'], bindings['destination'], bindings['tx_hash'], bindings['status']))

elif category == 'orders':
logger.info('Order: {} ordered {} for {} in {} blocks, with a provided fee of {:.8f} {} and a required fee of {:.8f} {} ({}) [{}]'.format(bindings['source'], output(bindings['give_quantity'], bindings['give_asset']), output(bindings['get_quantity'], bindings['get_asset']), bindings['expiration'], bindings['fee_provided'] / config.UNIT, config.BTC, bindings['fee_required'] / config.UNIT, config.BTC, bindings['tx_hash'], bindings['status']))

elif category == 'order_matches':
logger.info('Order Match: {} for {} ({}) [{}]'.format(output(bindings['forward_quantity'], bindings['forward_asset']), output(bindings['backward_quantity'], bindings['backward_asset']), bindings['id'], bindings['status']))

elif category == 'issuances':
if bindings['transfer']:
logger.info('Issuance: {} transfered asset {} to {} ({}) [{}]'.format(bindings['source'], bindings['asset'], bindings['issuer'], bindings['tx_hash'], bindings['status']))
Expand All @@ -262,6 +276,17 @@ def output(quantity, asset):
else:
logger.info('Broadcast: ' + bindings['source'] + ' at ' + isodt(bindings['timestamp']) + ' with a fee of {}%'.format(output(D(bindings['fee_fraction_int'] / 1e8) * D(100), 'fraction')) + ' (' + bindings['tx_hash'] + ')' + ' [{}]'.format(bindings['status']))

elif category == 'bets':
logger.info('Bet: {} against {}, by {}, on {}'.format(output(bindings['wager_quantity'], config.XCP), output(bindings['counterwager_quantity'], config.XCP), bindings['source'], bindings['feed_address']))

elif category == 'bet_matches':
placeholder = ''
if bindings['target_value'] >= 0: # Only non‐negative values are valid.
placeholder = ' that ' + str(output(bindings['target_value'], 'value'))
if bindings['leverage']:
placeholder += ', leveraged {}x'.format(output(bindings['leverage'] / 5040, 'leverage'))
logger.info('Bet Match: {} for {} against {} for {} on {} at {}{} ({}) [{}]'.format(util.BET_TYPE_NAME[bindings['tx0_bet_type']], output(bindings['forward_quantity'], config.XCP), util.BET_TYPE_NAME[bindings['tx1_bet_type']], output(bindings['backward_quantity'], config.XCP), bindings['feed_address'], isodt(bindings['deadline']), placeholder, bindings['id'], bindings['status']))

elif category == 'dividends':
logger.info('Dividend: {} paid {} per unit of {} ({}) [{}]'.format(bindings['source'], output(bindings['quantity_per_unit'], bindings['dividend_asset']), bindings['asset'], bindings['tx_hash'], bindings['status']))

Expand All @@ -271,6 +296,32 @@ def output(quantity, asset):
elif category == 'cancels':
logger.info('Cancel: {} ({}) [{}]'.format(bindings['offer_hash'], bindings['tx_hash'], bindings['status']))

elif category == 'order_expirations':
logger.info('Expired order: {}'.format(bindings['order_hash']))

elif category == 'order_match_expirations':
logger.info('Expired Order Match awaiting payment: {}'.format(bindings['order_match_id']))

elif category == 'bet_expirations':
logger.info('Expired bet: {}'.format(bindings['bet_hash']))

elif category == 'bet_match_expirations':
logger.info('Expired Bet Match: {}'.format(bindings['bet_match_id']))

elif category == 'bet_match_resolutions':
# DUPE
cfd_type_id = util.BET_TYPE_ID['BullCFD'] + util.BET_TYPE_ID['BearCFD']
equal_type_id = util.BET_TYPE_ID['Equal'] + util.BET_TYPE_ID['NotEqual']

if bindings['bet_match_type_id'] == cfd_type_id:
if bindings['settled']:
logger.info('Bet Match Settled: {} credited to the bull, {} credited to the bear, and {} credited to the feed address ({})'.format(output(bindings['bull_credit'], config.XCP), output(bindings['bear_credit'], config.XCP), output(bindings['fee'], config.XCP), bindings['bet_match_id']))
else:
logger.info('Bet Match Force‐Liquidated: {} credited to the bull, {} credited to the bear, and {} credited to the feed address ({})'.format(output(bindings['bull_credit'], config.XCP), output(bindings['bear_credit'], config.XCP), output(bindings['fee'], config.XCP), bindings['bet_match_id']))

elif bindings['bet_match_type_id'] == equal_type_id:
logger.info('Bet Match Settled: {} won the pot of {}; {} credited to the feed address ({})'.format(bindings['winner'], output(bindings['escrow_less_fee'], config.XCP), output(bindings['fee'], config.XCP), bindings['bet_match_id']))

elif category == 'contracts':
logger.info('New Contract: {}'.format(bindings['contract_id']))

Expand Down
Loading