Fixed bugs in dynamic price processing

This commit is contained in:
Vivek Teega 2023-03-27 13:57:40 +00:00
parent 7abafd2c2c
commit b82e35153f

View File

@ -247,31 +247,44 @@ def is_a_contract_address(floAddress):
return True
def fetchDynamicSwapPrice(contractStructure):
def fetchDynamicSwapPrice(contractStructure, transaction_data, blockinfo):
oracle_address = contractStructure['oracle_address']
# fetch transactions from the blockchain where from address : oracle-address... to address: contract address
# find the first contract transaction which adheres to price change format
# {"price-update":{"contract-name": "", "contract-address": "", "price": 3}}
response = requests.get(f'{api_url}api/addr/{oracle_address}')
response = requests.get(f'{neturl}api/addr/{oracle_address}')
if response.status_code == 200:
response = response.json()
transactions = response['transactions']
for transaction_hash in transactions:
transaction_response = requests.get(f'{api_url}api/tx/{oracle_address}')
if transaction_response.status_code == 200:
transaction = transaction_response.json()
floData = transaction['floData']
# If flodata is in the format we are looking for
try:
floData = json.loads(floData)
# Check if the contract name and address are right
return float(floData['price-update']['price'])
except:
continue
else:
logger.info('API error while fetchDynamicSwapPrice')
sys.exit(0)
if 'transactions' not in response.keys(): # API doesn't return 'transactions' key, if 0 txs present on address
return float(contractStructure['price'])
else:
transactions = response['transactions']
for transaction_hash in transactions:
transaction_response = requests.get(f'{neturl}api/tx/{transaction_hash}')
if transaction_response.status_code == 200:
transaction = transaction_response.json()
floData = transaction['floData']
# If the blocktime of the transaction is < than the current block time
if transaction['time'] < blockinfo['time']:
# Check if flodata is in the format we are looking for
# ie. {"price-update":{"contract-name": "", "contract-address": "", "price": 3}}
# and receiver address should be contractAddress
try:
assert transaction_data['receiverAddress'] == contractStructure['contractAddress']
floData = json.loads(floData)
# Check if the contract name and address are right
assert floData['price-update']['contract-name'] == contractStructure['contractName']
assert floData['price-update']['contract-address'] == contractStructure['contractAddress']
floData['contractName check']
return float(floData['price-update']['price'])
except:
continue
else:
continue
else:
logger.info('API error while fetchDynamicSwapPrice')
sys.exit(0)
return float(contractStructure['price'])
else:
logger.info('API error fetchDynamicSwapPrice')
sys.exit(0)
@ -308,7 +321,12 @@ def processBlock(blockindex=None, blockhash=None):
current_index = -1
if transaction in ['a9dedd024ee40239caf30c782abd4561c291c95fef3229e640ca8ec0dc7081d6', '2bcdd259f642cf5a901a814b5dafddec62dcdd0848732e7384ba087939c915ac', 'e9a305b20eaa3a4e6e778ec51c4137061ed8e630bdec271944760bd0b9fcc6a8', '606fcad4e73311cc441a494c7e35ad5f8c900f9107bcba3da5076ffa8e243913', '5ef8b7229956b8dceefbdc6087d17012e6555c67de06ba503e19f6f6bf563a76', '732c184d240ee173e08ab8cdbe7a2a19714fe14ae0d868a88041cff12586e9d3',
'11571ce7e5eed0bce30e24de89bb1ba6cc432df7b5b40bbc9f0225b98968cb47']:
'11571ce7e5eed0bce30e24de89bb1ba6cc432df7b5b40bbc9f0225b98968cb47',
'd48590f6907976b63b4d5eac8082fe0bbed3b8a68e30de960e77619d29e32e78',
'ff355c3384e2568e1dd230d5c9073618b9033c7c8b20f9e8533b5837f76bc65d',
'8a146e7ccbb6d6eeab49cfd25da805223335c6908e506c5d68aae9184b863e1e',
'b1a2c463988cdf881779f4bf292b9a0385b78150dccf8562ee8e4d1850ea7dd3']:
#pdb.set_trace()
pass
# TODO CLEANUP - REMOVE THIS WHILE SECTION, WHY IS IT HERE?
@ -791,6 +809,7 @@ def checkLocal_expiry_trigger_deposit(blockinfo):
close_expire_contract(contractStructure, 'closed', query.transactionHash, query.blockNumber, blockinfo['hash'], 'query.incorporationDate', blockinfo['time'], blockinfo['time'], query.time, query.activity, query.contractName, query.contractAddress, query.contractType, query.tokens_db, query.parsed_data, blockinfo['height'])
return
def extract_contractStructure(contractName, contractAddress):
connection = create_database_connection('smart_contract', {'contract_name':f"{contractName}", 'contract_address':f"{contractAddress}"})
@ -1206,11 +1225,12 @@ def processTransaction(transaction_data, parsed_data, blockinfo):
# Pass information to SSE channel
pushData_SSEapi(f"Error| Mismatch in contract address specified in flodata and the output address of the transaction {transaction_data['txid']}")
return 0
pdb.set_trace()
if contractStructure['pricetype'] in ['predetermined','determined']:
swapPrice = float(contractStructure['price'])
elif contractStructure['pricetype'] == 'dynamic':
swapPrice = fetchDynamicSwapPrice(contractStructure)
swapPrice = fetchDynamicSwapPrice(contractStructure, transaction_data, blockinfo)
swapAmount = float(parsed_data['tokenAmount'])/swapPrice
@ -1225,6 +1245,7 @@ def processTransaction(transaction_data, parsed_data, blockinfo):
available_deposit_sum = 0
for entry in active_contract_deposits:
pdb.set_trace()
if entry.id in [consumed_deposit_ids] or arrow.get(entry.unix_expiryTime)<arrow.get(blockinfo['time']):
index = active_contract_deposits.index(entry)
del available_deposits[index]
@ -1584,87 +1605,92 @@ def processTransaction(transaction_data, parsed_data, blockinfo):
if 'subtype' in parsed_data['contractConditions']:
# todo: Check if the both the tokens mentioned exist if its a token swap
if (parsed_data['contractConditions']['subtype'] == 'tokenswap') and (check_database_existence('token', {'token_name':f"{parsed_data['contractConditions']['selling_token'].split('#')[0]}"})) and (check_database_existence('token', {'token_name':f"{parsed_data['contractConditions']['accepting_token'].split('#')[0]}"})):
#if (parsed_data['contractConditions']['subtype'] == 'tokenswap'):
if parsed_data['contractConditions']['pricetype'] in ['predetermined','statef','dynamic']:
session.add(ContractStructure(attribute='subtype', index=0, value=parsed_data['contractConditions']['subtype']))
session.add(ContractStructure(attribute='accepting_token', index=0, value=parsed_data['contractConditions']['accepting_token']))
session.add(ContractStructure(attribute='selling_token', index=0, value=parsed_data['contractConditions']['selling_token']))
# determine price
session.add(ContractStructure(attribute='pricetype', index=0, value=parsed_data['contractConditions']['pricetype']))
session.add(ContractStructure(attribute='price', index=0, value=parsed_data['contractConditions']['price']))
# Store transfer as part of ContractTransactionHistory
blockchainReference = neturl + 'tx/' + transaction_data['txid']
session.add(ContractTransactionHistory(transactionType='incorporation',
sourceFloAddress=inputadd,
destFloAddress=outputlist[0],
transferAmount=None,
blockNumber=transaction_data['blockheight'],
blockHash=transaction_data['blockhash'],
blocktime=transaction_data['blocktime'],
transactionHash=transaction_data['txid'],
blockchainReference=blockchainReference,
jsonData=json.dumps(transaction_data),
parsedFloData=json.dumps(parsed_data)
))
session.commit()
session.close()
session.add(ContractStructure(attribute='subtype', index=0, value=parsed_data['contractConditions']['subtype']))
session.add(ContractStructure(attribute='accepting_token', index=0, value=parsed_data['contractConditions']['accepting_token']))
session.add(ContractStructure(attribute='selling_token', index=0, value=parsed_data['contractConditions']['selling_token']))
# add Smart Contract name in token contract association
accepting_sending_tokenlist = [parsed_data['contractConditions']['accepting_token'], parsed_data['contractConditions']['selling_token']]
for token_name in accepting_sending_tokenlist:
token_name = token_name.split('#')[0]
session = create_database_session_orm('token', {'token_name': f"{token_name}"}, TokenBase)
session.add(TokenContractAssociation(tokenIdentification=token_name,
contractName=parsed_data['contractName'],
contractAddress=parsed_data['contractAddress'],
blockNumber=transaction_data['blockheight'],
blockHash=transaction_data['blockhash'],
time=transaction_data['blocktime'],
transactionHash=transaction_data['txid'],
blockchainReference=blockchainReference,
jsonData=json.dumps(transaction_data),
transactionType=parsed_data['type'],
parsedFloData=json.dumps(parsed_data)))
session.commit()
session.close()
# Store smart contract address in system's db, to be ignored during future transfers
session = create_database_session_orm('system_dbs', {'db_name': "system"}, SystemBase)
session.add(ActiveContracts(contractName=parsed_data['contractName'],
contractAddress=parsed_data['contractAddress'], status='active',
tokenIdentification=str(accepting_sending_tokenlist),
contractType=parsed_data['contractType'],
transactionHash=transaction_data['txid'],
blockNumber=transaction_data['blockheight'],
blockHash=transaction_data['blockhash'],
incorporationDate=transaction_data['blocktime']))
session.commit()
# todo - Add a condition for rejected contract transaction on the else loop for this condition
session.add(ContractAddressMapping(address=inputadd, addressType='incorporation',
tokenAmount=None,
contractName=parsed_data['contractName'],
contractAddress=inputadd,
transactionHash=transaction_data['txid'],
blockNumber=transaction_data['blockheight'],
blockHash=transaction_data['blockhash']))
session.add(DatabaseTypeMapping(db_name=f"{parsed_data['contractName']}-{inputadd}",
db_type='smartcontract',
keyword='',
object_format='',
blockNumber=transaction_data['blockheight']))
session.commit()
session.close()
updateLatestTransaction(transaction_data, parsed_data, f"{parsed_data['contractName']}-{parsed_data['contractAddress']}")
pushData_SSEapi('Contract | Contract incorporated at transaction {} with name {}-{}'.format(transaction_data['txid'], parsed_data['contractName'], parsed_data['contractAddress']))
return 1
else:
if parsed_data['contractConditions']['pricetype'] not in ['predetermined','statef','dynamic']:
rejectComment = f"pricetype is not part of accepted parameters for a continuos event contract of the type token swap.\nSmart contract incorporation on transaction {transaction_data['txid']} rejected"
logger.info(rejectComment)
rejected_contract_transaction_history(transaction_data, parsed_data, 'incorporation', inputadd, inputadd, outputlist[0], rejectComment)
delete_contract_database({'contract_name': parsed_data['contractName'], 'contract_address': parsed_data['contractAddress']})
return 0
# determine price
session.add(ContractStructure(attribute='pricetype', index=0, value=parsed_data['contractConditions']['pricetype']))
if parsed_data['contractConditions']['pricetype'] in ['predetermined','statef']:
session.add(ContractStructure(attribute='price', index=0, value=parsed_data['contractConditions']['price']))
elif parsed_data['contractConditions']['pricetype'] in ['dynamic']:
session.add(ContractStructure(attribute='price', index=0, value=parsed_data['contractConditions']['price']))
session.add(ContractStructure(attribute='oracle_address', index=0, value=parsed_data['contractConditions']['oracle_address']))
# Store transfer as part of ContractTransactionHistory
blockchainReference = neturl + 'tx/' + transaction_data['txid']
session.add(ContractTransactionHistory(transactionType='incorporation',
sourceFloAddress=inputadd,
destFloAddress=outputlist[0],
transferAmount=None,
blockNumber=transaction_data['blockheight'],
blockHash=transaction_data['blockhash'],
blocktime=transaction_data['blocktime'],
transactionHash=transaction_data['txid'],
blockchainReference=blockchainReference,
jsonData=json.dumps(transaction_data),
parsedFloData=json.dumps(parsed_data)
))
session.commit()
session.close()
# add Smart Contract name in token contract association
accepting_sending_tokenlist = [parsed_data['contractConditions']['accepting_token'], parsed_data['contractConditions']['selling_token']]
for token_name in accepting_sending_tokenlist:
token_name = token_name.split('#')[0]
session = create_database_session_orm('token', {'token_name': f"{token_name}"}, TokenBase)
session.add(TokenContractAssociation(tokenIdentification=token_name,
contractName=parsed_data['contractName'],
contractAddress=parsed_data['contractAddress'],
blockNumber=transaction_data['blockheight'],
blockHash=transaction_data['blockhash'],
time=transaction_data['blocktime'],
transactionHash=transaction_data['txid'],
blockchainReference=blockchainReference,
jsonData=json.dumps(transaction_data),
transactionType=parsed_data['type'],
parsedFloData=json.dumps(parsed_data)))
session.commit()
session.close()
# Store smart contract address in system's db, to be ignored during future transfers
session = create_database_session_orm('system_dbs', {'db_name': "system"}, SystemBase)
session.add(ActiveContracts(contractName=parsed_data['contractName'],
contractAddress=parsed_data['contractAddress'], status='active',
tokenIdentification=str(accepting_sending_tokenlist),
contractType=parsed_data['contractType'],
transactionHash=transaction_data['txid'],
blockNumber=transaction_data['blockheight'],
blockHash=transaction_data['blockhash'],
incorporationDate=transaction_data['blocktime']))
session.commit()
# todo - Add a condition for rejected contract transaction on the else loop for this condition
session.add(ContractAddressMapping(address=inputadd, addressType='incorporation',
tokenAmount=None,
contractName=parsed_data['contractName'],
contractAddress=inputadd,
transactionHash=transaction_data['txid'],
blockNumber=transaction_data['blockheight'],
blockHash=transaction_data['blockhash']))
session.add(DatabaseTypeMapping(db_name=f"{parsed_data['contractName']}-{inputadd}",
db_type='smartcontract',
keyword='',
object_format='',
blockNumber=transaction_data['blockheight']))
session.commit()
session.close()
updateLatestTransaction(transaction_data, parsed_data, f"{parsed_data['contractName']}-{parsed_data['contractAddress']}")
pushData_SSEapi('Contract | Contract incorporated at transaction {} with name {}-{}'.format(transaction_data['txid'], parsed_data['contractName'], parsed_data['contractAddress']))
return 1
else:
rejectComment = f"One of the token for the swap does not exist.\nSmart contract incorporation on transaction {transaction_data['txid']} rejected"