Added pagination to contract transactions

This commit is contained in:
RanchiMall Dev 2023-11-22 18:57:32 +00:00
parent 5dfb75417f
commit a9f691f82f

View File

@ -21,7 +21,6 @@ import pdb
import ast import ast
import time import time
app = Quart(__name__) app = Quart(__name__)
app.clients = set() app.clients = set()
app = cors(app, allow_origin="*") app = cors(app, allow_origin="*")
@ -459,7 +458,7 @@ def fetch_token_transactions(token, senderFloAddress=None, destFloAddress=None,
conn.close() conn.close()
return transaction_post_processing(transactionJsonData) return transaction_post_processing(transactionJsonData)
def fetch_contract_transactions(contractName, contractAddress): def fetch_contract_transactions(contractName, contractAddress, _from=0, to=100):
sc_file = os.path.join(dbfolder, 'smartContracts', '{}-{}.db'.format(contractName, contractAddress)) sc_file = os.path.join(dbfolder, 'smartContracts', '{}-{}.db'.format(contractName, contractAddress))
conn = sqlite3.connect(sc_file) conn = sqlite3.connect(sc_file)
c = conn.cursor() c = conn.cursor()
@ -473,8 +472,8 @@ def fetch_contract_transactions(contractName, contractAddress):
token2_file = f"{dbfolder}/tokens/{token2}.db" token2_file = f"{dbfolder}/tokens/{token2}.db"
conn.execute(f"ATTACH DATABASE '{token1_file}' AS token1db") conn.execute(f"ATTACH DATABASE '{token1_file}' AS token1db")
conn.execute(f"ATTACH DATABASE '{token2_file}' AS token2db") conn.execute(f"ATTACH DATABASE '{token2_file}' AS token2db")
# Get data from db
c.execute(f''' transaction_query = f'''
SELECT t1.jsonData, t1.parsedFloData, t1.time, t1.transactionType, t1.sourceFloAddress, t1.destFloAddress, t1.transferAmount, '{token1}' AS token, s.transactionSubType SELECT t1.jsonData, t1.parsedFloData, t1.time, t1.transactionType, t1.sourceFloAddress, t1.destFloAddress, t1.transferAmount, '{token1}' AS token, s.transactionSubType
FROM main.contractTransactionHistory AS s FROM main.contractTransactionHistory AS s
INNER JOIN token1db.transactionHistory AS t1 INNER JOIN token1db.transactionHistory AS t1
@ -483,42 +482,47 @@ def fetch_contract_transactions(contractName, contractAddress):
SELECT t2.jsonData, t2.parsedFloData, t2.time, t2.transactionType, t2.sourceFloAddress, t2.destFloAddress, t2.transferAmount, '{token2}' AS token, s.transactionSubType SELECT t2.jsonData, t2.parsedFloData, t2.time, t2.transactionType, t2.sourceFloAddress, t2.destFloAddress, t2.transferAmount, '{token2}' AS token, s.transactionSubType
FROM main.contractTransactionHistory AS s FROM main.contractTransactionHistory AS s
INNER JOIN token2db.transactionHistory AS t2 INNER JOIN token2db.transactionHistory AS t2
ON t2.transactionHash = s.transactionHash''') ON t2.transactionHash = s.transactionHash
WHERE s.id BETWEEN {_from} AND {to}
'''
transactionJsonData = c.fetchall() creation_tx_query = '''
c.execute(f''' SELECT jsonData, parsedFloData, time, transactionType, sourceFloAddress, destFloAddress, transferAmount, '' AS token, transactionSubType
SELECT jsonData, parsedFloData, time, transactionType, sourceFloAddress, destFloAddress, transferAmount, '' AS token, transactionSubType FROM contractTransactionHistory
FROM contractTransactionHistory ORDER BY id
ORDER BY id LIMIT 1;
LIMIT 1; '''
''')
creation_tx = c.fetchall()
transactionJsonData = creation_tx + transactionJsonData
elif contractStructure['contractType'] == 'one-time-event': elif contractStructure['contractType'] == 'one-time-event':
#if contractStructure['subtype'] == 'time-trigger' and contractStructure['subtype'] == 'external-trigger':
token1 = contractStructure['tokenIdentification'] token1 = contractStructure['tokenIdentification']
token1_file = f"{dbfolder}/tokens/{token1}.db" token1_file = f"{dbfolder}/tokens/{token1}.db"
conn.execute(f"ATTACH DATABASE '{token1_file}' AS token1db") conn.execute(f"ATTACH DATABASE '{token1_file}' AS token1db")
# Get data from db
c.execute(f''' transaction_query = f'''
SELECT t1.jsonData, t1.parsedFloData, t1.time, t1.transactionType, t1.sourceFloAddress, t1.destFloAddress, t1.transferAmount, '{token1}' AS token, s.transactionSubType SELECT t1.jsonData, t1.parsedFloData, t1.time, t1.transactionType, t1.sourceFloAddress, t1.destFloAddress, t1.transferAmount, '{token1}' AS token, s.transactionSubType
FROM main.contractTransactionHistory AS s FROM main.contractTransactionHistory AS s
INNER JOIN token1db.transactionHistory AS t1 INNER JOIN token1db.transactionHistory AS t1
ON t1.transactionHash = s.transactionHash''') ON t1.transactionHash = s.transactionHash
WHERE s.id BETWEEN {_from} AND {to}
'''
transactionJsonData = c.fetchall() creation_tx_query = '''
c.execute(f''' SELECT jsonData, parsedFloData, time, transactionType, sourceFloAddress, destFloAddress, transferAmount, '' AS token, transactionSubType
SELECT jsonData, parsedFloData, time, transactionType, sourceFloAddress, destFloAddress, transferAmount, '' AS token, transactionSubType FROM contractTransactionHistory
FROM contractTransactionHistory ORDER BY id
ORDER BY id LIMIT 1;
LIMIT 1; '''
''')
creation_tx = c.fetchall() c.execute(transaction_query)
transactionJsonData = creation_tx + transactionJsonData transactionJsonData = c.fetchall()
c.execute(creation_tx_query)
creation_tx = c.fetchall()
transactionJsonData = creation_tx + transactionJsonData
return transaction_post_processing(transactionJsonData) return transaction_post_processing(transactionJsonData)
def fetch_swap_contract_transactions(contractName, contractAddress, transactionHash=None): def fetch_swap_contract_transactions(contractName, contractAddress, transactionHash=None):
sc_file = os.path.join(dbfolder, 'smartContracts', '{}-{}.db'.format(contractName, contractAddress)) sc_file = os.path.join(dbfolder, 'smartContracts', '{}-{}.db'.format(contractName, contractAddress))
conn = sqlite3.connect(sc_file) conn = sqlite3.connect(sc_file)
@ -1647,7 +1651,6 @@ async def broadcastTx_v2(raw_transaction_hash):
# FLO TOKEN APIs # FLO TOKEN APIs
@app.route('/api/v2/tokenList', methods=['GET']) @app.route('/api/v2/tokenList', methods=['GET'])
async def tokenList(): async def tokenList():
filelist = [] filelist = []
@ -1712,6 +1715,14 @@ async def tokenTransactions(token):
if use_AND is not None and use_AND not in [True, False]: if use_AND is not None and use_AND not in [True, False]:
return jsonify(description='use_AND validation failed'), 400 return jsonify(description='use_AND validation failed'), 400
_from = int(request.args.get('_from', 1)) # Get page number, default is 1
to = int(request.args.get('to', 100)) # Get limit, default is 10
if _from<1:
return jsonify(description='_from validation failed'), 400
if to<1:
return jsonify(description='to validation failed'), 400
filelocation = os.path.join(dbfolder, 'tokens', f'{token}.db') filelocation = os.path.join(dbfolder, 'tokens', f'{token}.db')
if os.path.isfile(filelocation): if os.path.isfile(filelocation):
@ -2236,16 +2247,20 @@ async def smartcontracttransactions():
if not check_flo_address(contractAddress, is_testnet): if not check_flo_address(contractAddress, is_testnet):
return jsonify(description='contractAddress validation failed'), 400 return jsonify(description='contractAddress validation failed'), 400
limit = request.args.get('limit') _from = int(request.args.get('_from', 1)) # Get page number, default is 1
if limit is not None and not check_integer(limit): to = int(request.args.get('to', 100)) # Get limit, default is 10
return jsonify(description='limit validation failed'), 400
if _from<1:
return jsonify(description='_from validation failed'), 400
if to<1:
return jsonify(description='to validation failed'), 400
contractDbName = '{}-{}.db'.format(contractName, contractAddress) contractDbName = '{}-{}.db'.format(contractName, contractAddress)
filelocation = os.path.join(dbfolder, 'smartContracts', contractDbName) filelocation = os.path.join(dbfolder, 'smartContracts', contractDbName)
if os.path.isfile(filelocation): if os.path.isfile(filelocation):
# Make db connection and fetch data # Make db connection and fetch data
transactionJsonData = fetch_contract_transactions(contractName, contractAddress) transactionJsonData = fetch_contract_transactions(contractName, contractAddress, _from, to)
transactionJsonData = sort_transactions(transactionJsonData) transactionJsonData = sort_transactions(transactionJsonData)
return jsonify(contractName=contractName, contractAddress=contractAddress, contractTransactions=transactionJsonData), 200 return jsonify(contractName=contractName, contractAddress=contractAddress, contractTransactions=transactionJsonData), 200
else: else: