Fixed bug with token transactions

This commit is contained in:
RanchiMall Dev 2023-09-24 11:23:05 +00:00
parent b1c3851564
commit 3629ff6cea

View File

@ -26,7 +26,7 @@ app.clients = set()
app = cors(app, allow_origin="*") app = cors(app, allow_origin="*")
# Global values and configg # Global values and configg
internalTransactionTypes = [ 'tokenswapDepositSettlement', 'tokenswapParticipationSettlement'] internalTransactionTypes = [ 'tokenswapDepositSettlement', 'tokenswapParticipationSettlement', 'smartContractDepositReturn']
if net == 'mainnet': if net == 'mainnet':
is_testnet = False is_testnet = False
@ -91,7 +91,7 @@ def transactiondetailhelper(transactionHash):
# open the latest block database # open the latest block database
conn = sqlite3.connect(os.path.join(dbfolder, 'latestCache.db')) conn = sqlite3.connect(os.path.join(dbfolder, 'latestCache.db'))
c = conn.cursor() c = conn.cursor()
c.execute(f"select jsonData, parsedFloData, transactionType, db_reference from latestTransactions where transactionHash='{transactionHash}'") c.execute(f"SELECT jsonData, parsedFloData, transactionType, db_reference FROM latestTransactions WHERE transactionHash='{transactionHash}'")
transactionJsonData = c.fetchall() transactionJsonData = c.fetchall()
return transactionJsonData return transactionJsonData
@ -376,13 +376,19 @@ def fetch_contract_status_time_info(contractName, contractAddress):
contract_status_time_info = c.fetchall() contract_status_time_info = c.fetchall()
return contract_status_time_info return contract_status_time_info
def checkIF_commitee_trigger_tranasaction(transactionDetails):
if transactionDetails[3] == 'trigger':
pass
def transaction_post_processing(transactionJsonData): def transaction_post_processing(transactionJsonData):
rowarray_list = [] rowarray_list = []
for row in transactionJsonData: for row in transactionJsonData:
transactions_object = {} transactions_object = {}
parsedFloData = json.loads(row[1]) parsedFloData = json.loads(row[1])
transactionDetails = json.loads(row[0]) transactionDetails = json.loads(row[0])
if row[3] in internalTransactionTypes:
if row[3] in internalTransactionTypes or (row[3]=='trigger' and row[8]!='committee'):
internal_info = {} internal_info = {}
internal_info['senderAddress'] = row[4] internal_info['senderAddress'] = row[4]
internal_info['receiverAddress'] = row[5] internal_info['receiverAddress'] = row[5]
@ -398,7 +404,9 @@ def transaction_post_processing(transactionJsonData):
transactions_object = {**parsedFloData, **transactionDetails} transactions_object = {**parsedFloData, **transactionDetails}
transactions_object = update_transaction_confirmations(transactions_object) transactions_object = update_transaction_confirmations(transactions_object)
transactions_object['onChain'] = True transactions_object['onChain'] = True
rowarray_list.append(transactions_object) rowarray_list.append(transactions_object)
return rowarray_list return rowarray_list
def fetch_token_transactions(token, senderFloAddress=None, destFloAddress=None, limit=None, use_and=False): def fetch_token_transactions(token, senderFloAddress=None, destFloAddress=None, limit=None, use_and=False):
@ -411,7 +419,7 @@ def fetch_token_transactions(token, senderFloAddress=None, destFloAddress=None,
return jsonify(description="Token doesn't exist"), 404 return jsonify(description="Token doesn't exist"), 404
# Build the base SQL query # Build the base SQL query
query = f"SELECT jsonData, parsedFloData, time, transactionType, sourceFloAddress, destFloAddress, transferAmount, '{token}' AS token FROM transactionHistory" query = f"SELECT jsonData, parsedFloData, time, transactionType, sourceFloAddress, destFloAddress, transferAmount, '{token}' AS token, '' AS transactionSubType FROM transactionHistory"
# Build the WHERE clause based on conditions # Build the WHERE clause based on conditions
conditions = [] conditions = []
@ -454,39 +462,62 @@ def fetch_contract_transactions(contractName, contractAddress):
c = conn.cursor() c = conn.cursor()
# Find token db names and attach # Find token db names and attach
contractStructure = fetchContractStructure(contractName, contractAddress) contractStructure = fetchContractStructure(contractName, contractAddress)
token1 = contractStructure['accepting_token']
token2 = contractStructure['selling_token'] if contractStructure['contractType'] == 'continuos-event':
token1_file = f"{dbfolder}/tokens/{token1}.db" token1 = contractStructure['accepting_token']
token2_file = f"{dbfolder}/tokens/{token2}.db" token2 = contractStructure['selling_token']
conn.execute(f"ATTACH DATABASE '{token1_file}' AS token1db") token1_file = f"{dbfolder}/tokens/{token1}.db"
conn.execute(f"ATTACH DATABASE '{token2_file}' AS token2db") token2_file = f"{dbfolder}/tokens/{token2}.db"
conn.execute(f"ATTACH DATABASE '{token1_file}' AS token1db")
conn.execute(f"ATTACH DATABASE '{token2_file}' AS token2db")
# Get data from db
c.execute(f'''
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
INNER JOIN token1db.transactionHistory AS t1
ON t1.transactionHash = s.transactionHash
UNION
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
INNER JOIN token2db.transactionHistory AS t2
ON t2.transactionHash = s.transactionHash''')
transactionJsonData = c.fetchall()
c.execute(f'''
SELECT jsonData, parsedFloData, time, transactionType, sourceFloAddress, destFloAddress, transferAmount, '' AS token, transactionSubType
FROM contractTransactionHistory
ORDER BY id
LIMIT 1;
''')
creation_tx = c.fetchall()
transactionJsonData = creation_tx + transactionJsonData
# Get data from db elif contractStructure['contractType'] == 'one-time-event':
c.execute(f''' #if contractStructure['subtype'] == 'time-trigger' and contractStructure['subtype'] == 'external-trigger':
SELECT t1.jsonData, t1.parsedFloData, t1.time, t1.transactionType, t1.sourceFloAddress, t1.destFloAddress, t1.transferAmount, '{token1}' AS token token1 = contractStructure['tokenIdentification']
FROM main.contractTransactionHistory AS s token1_file = f"{dbfolder}/tokens/{token1}.db"
INNER JOIN token1db.transactionHistory AS t1 conn.execute(f"ATTACH DATABASE '{token1_file}' AS token1db")
ON t1.transactionHash = s.transactionHash # Get data from db
UNION c.execute(f'''
SELECT t2.jsonData, t2.parsedFloData, t2.time, t2.transactionType, t2.sourceFloAddress, t2.destFloAddress, t2.transferAmount, '{token2}' AS token 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 token2db.transactionHistory AS t2 INNER JOIN token1db.transactionHistory AS t1
ON t2.transactionHash = s.transactionHash''') ON t1.transactionHash = s.transactionHash''')
transactionJsonData = c.fetchall() transactionJsonData = c.fetchall()
c.execute(f'''
c.execute(f''' SELECT jsonData, parsedFloData, time, transactionType, sourceFloAddress, destFloAddress, transferAmount, '' AS token, transactionSubType
SELECT jsonData, parsedFloData, time, transactionType, sourceFloAddress, destFloAddress, transferAmount, '' AS token FROM contractTransactionHistory
FROM contractTransactionHistory ORDER BY id
ORDER BY id LIMIT 1;
LIMIT 1; ''')
''') creation_tx = c.fetchall()
creation_tx = c.fetchall() transactionJsonData = creation_tx + transactionJsonData
transactionJsonData = creation_tx + transactionJsonData
return transaction_post_processing(transactionJsonData) return transaction_post_processing(transactionJsonData)
def fetch_contract_transactions_1(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)
c = conn.cursor() c = conn.cursor()
@ -501,12 +532,12 @@ def fetch_contract_transactions_1(contractName, contractAddress, transactionHash
# Get data from db # Get data from db
query = f''' query = f'''
SELECT t1.jsonData, t1.parsedFloData, t1.time, t1.transactionType, t1.sourceFloAddress, t1.destFloAddress, t1.transferAmount, '{token1}' AS token SELECT t1.jsonData, t1.parsedFloData, t1.time, t1.transactionType, t1.sourceFloAddress, t1.destFloAddress, t1.transferAmount, '{token1}' AS token, t1.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 AND s.transactionHash = '{transactionHash}' ON t1.transactionHash = s.transactionHash AND s.transactionHash = '{transactionHash}'
UNION UNION
SELECT t2.jsonData, t2.parsedFloData, t2.time, t2.transactionType, t2.sourceFloAddress, t2.destFloAddress, t2.transferAmount, '{token2}' AS token SELECT t2.jsonData, t2.parsedFloData, t2.time, t2.transactionType, t2.sourceFloAddress, t2.destFloAddress, t2.transferAmount, '{token2}' AS token, t2.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 AND s.transactionHash = '{transactionHash}' ''' ON t2.transactionHash = s.transactionHash AND s.transactionHash = '{transactionHash}' '''
@ -1848,9 +1879,11 @@ async def getContractInfo_v2():
# todo - add code to token tracker to save continuos event subtype KEY as contractSubtype as part of contractStructure and remove the following line # todo - add code to token tracker to save continuos event subtype KEY as contractSubtype as part of contractStructure and remove the following line
returnval['contractSubtype'] = 'tokenswap' returnval['contractSubtype'] = 'tokenswap'
returnval['priceType'] = returnval['pricetype'] returnval['priceType'] = returnval['pricetype']
if returnval['pricetype'] not in ['predetermined']:
returnval['price'] = fetch_dynamic_swap_price(contractStructure, {'time': datetime.now().timestamp()})
returnval['acceptingToken'] = returnval['accepting_token'] returnval['acceptingToken'] = returnval['accepting_token']
returnval['sellingToken'] = returnval['selling_token'] returnval['sellingToken'] = returnval['selling_token']
returnval['price'] = fetch_dynamic_swap_price(contractStructure, {'time': datetime.now().timestamp()})
elif contractStructure['contractType'] == 'one-time-event' and 'exitconditions' in contractStructure.keys(): elif contractStructure['contractType'] == 'one-time-event' and 'exitconditions' in contractStructure.keys():
choice_list = [] choice_list = []
for obj_key in contractStructure['exitconditions'].keys(): for obj_key in contractStructure['exitconditions'].keys():
@ -2285,7 +2318,7 @@ async def transactiondetails1(transactionHash):
contractName, contractAddress = db_reference.rsplit('-',1) contractName, contractAddress = db_reference.rsplit('-',1)
conn = sqlite3.connect(f"{dbfolder}/smartContracts/{db_reference}.db") conn = sqlite3.connect(f"{dbfolder}/smartContracts/{db_reference}.db")
c = conn.cursor() c = conn.cursor()
txhash_txs = fetch_contract_transactions_1(contractName, contractAddress, transactionHash) txhash_txs = fetch_swap_contract_transactions(contractName, contractAddress, transactionHash)
mergeTx['subTransactions'] = [] mergeTx['subTransactions'] = []
for transaction in txhash_txs: for transaction in txhash_txs:
if transaction['onChain'] == False: if transaction['onChain'] == False:
@ -2371,14 +2404,10 @@ async def blocktransactions(blockHash):
temptx = transactiondetailhelper(blocktxlist[i]['txid']) temptx = transactiondetailhelper(blocktxlist[i]['txid'])
transactionJson = json.loads(temptx[0][0]) transactionJson = json.loads(temptx[0][0])
parseResult = json.loads(temptx[0][1]) parseResult = json.loads(temptx[0][1])
# blocktxs[blocktxlist[i]] = {
# "parsedFloData" : parseResult,
# "transactionDetails" : transactionJson
# }
blocktxs.append({**parseResult , **transactionJson}) blocktxs.append({**parseResult , **transactionJson})
# TODO (CRITICAL): Write conditions to include and filter on chain and offchain transactions # TODO (CRITICAL): Write conditions to include and filter on chain and offchain transactions
blocktxs['onChain'] = True #blocktxs['onChain'] = True
return jsonify(transactions=blocktxs, blockKeyword=blockHash), 200 return jsonify(transactions=blocktxs, blockKeyword=blockHash), 200
else: else:
return jsonify(description='Block doesn\'t exist in database'), 404 return jsonify(description='Block doesn\'t exist in database'), 404