def find_txn_on_sia_explorer(fulfillment): token_name = fulfillment.token_name funderAddress = fulfillment.funder_address amount = fulfillment.payout_amount if token_name != 'SC': return None url = f'{BASE_URL}/hash/{funderAddress}' response = requests.get(url).json() if response: last100_txns = response[1]['last100Transactions'] if response[0]['Type'] == 'address' and last100_txns: for txn in last100_txns: if ( txn['TxType'] == 'ScTx' and txn['ScChange'] < 0 and abs(txn['ScChange']) / 10 ** 24 == amount / 10 ** 24 and not txn_already_used(txn['MasterHash'], token_name) ): return txn return None
def find_txn_on_harmony_explorer(fulfillment): token_name = fulfillment.token_name funderAddress = fulfillment.bounty.bounty_owner_address amount = fulfillment.payout_amount payeeAddress = fulfillment.fulfiller_address if token_name != 'ONE': return None url = f'https://explorer.harmony.one:8888/address?id={payeeAddress}&pageIndex=0&pageSize=20' response = requests.get(url).json() if ( response and 'address' in response and 'shardData' in response['address'] ): for shard in response['address']['shardData']: for tx in shard['txs']: if ( tx['from'] == funderAddress.lower() and tx['to'] == payeeAddress.lower() and tx['value'] == float(amount) * 10 ** 18 and not txn_already_used(tx['hash'], token_name) ): return tx return None
def find_txn_on_filecoin_explorer(fulfillment): token_name = fulfillment.token_name payeeAddress = fulfillment.fulfiller_address if token_name != 'FIL': return None url = 'https://api.filscan.io:8700/rpc/v1' data = { "id": 1, "jsonrpc": "2.0", "params": [{ "address": payeeAddress, "offset_range": { "start": 0, "count": 25 } }], "method": "filscan.MessageByAddress" } response = requests.post(url, headers=headers, data=json.dumps(data)).json() if (response and 'result' in response and 'data' in response['result']): for txn in response['result']['data']: if (isValidTxn(fulfillment, txn) == 'success' and not txn_already_used(txn['cid'], token_name)): return txn return None
def find_txn_on_btc_explorer(fulfillment, network='mainnet'): funderAddress = fulfillment.bounty.bounty_owner_address token = Token.objects.filter(symbol='BTC').first() decimal = token.decimals if token else 8 amount = fulfillment.payout_amount * 10**decimal payeeAddress = fulfillment.fulfiller_address n = Net(provider='Blockstream', network=network) txlist = n.txs(funderAddress) # validate BTC address is_valid = validate.is_valid_address(funderAddress) if is_valid == False: logger.error(f'error: invalid BTC address - {funderAddress}') else: if network == 'mainnet': blockstream_url = 'https://blockstream.info/api/tx/' else: blockstream_url = 'https://blockstream.info/testnet/api/tx/' if txlist != []: for txn in txlist: blockstream_response = requests.get(blockstream_url + txn).json() if (blockstream_response['vin'][0]['prevout'] ['scriptpubkey_address'] == str(funderAddress) and blockstream_response['vout'][0]['scriptpubkey_address'] == str(payeeAddress) and float(blockstream_response['vout'][0]['value']) == float(amount) and not txn_already_used(txn, 'BTC')): return txn return None
def get_harmony_txn_status(fulfillment): txnid = fulfillment.payout_tx_id token_name = fulfillment.token_name funderAddress = fulfillment.funder_address amount = fulfillment.payout_amount payeeAddress = fulfillment.fulfiller_address if token_name != 'ONE': return None if not txnid or txnid == "0x0": return None url = f'https://explorer.harmony.one:8888/tx?id={txnid}' response = requests.get(url).json() if (response and 'tx' in response): tx = response['tx'] if 'err' in tx: return 'expired' if ( tx['from'] == funderAddress.lower() and tx['to'] == payeeAddress.lower() and tx['value'] == float(amount) * 10 ** 18 and not txn_already_used(tx['hash'], token_name) ): if tx['status'] == 'SUCCESS': return 'success' return None
def get_algorand_txn_status(fulfillment): txnid = fulfillment.payout_tx_id token_name = fulfillment.token_name funderAddress = fulfillment.bounty.bounty_owner_address payeeAddress = fulfillment.fulfiller_address amount = fulfillment.payout_amount url = f'https://api.algoexplorer.io/v2/transactions/pending/{txnid}?format=json' response = requests.get(url).json() if response: if response.get('confirmed-round') and response.get('txn') and response.get('txn').get('txn'): txn = response["txn"]['txn'] if not response["pool-error"] == "": return None # asset / algo token rcv = txn['rcv'] if txn.get('rcv') else txn['arcv'] amt = txn['amt'] if txn.get('amt') else txn['aamt'] if ( txn['snd'].lower() == funderAddress.lower() and rcv.lower() == payeeAddress.lower() and float(float(amt)/ 10**6) == float(amount) and not txn_already_used(txnid, token_name) ): return 'success' elif response.get('message') and API_KEY != '': # txn is too old and cannot be found on algoexplorer return get_algorand_txn_status_paid_explorer(fulfillment)
def get_algorand_txn_status_paid_explorer(fulfillment): txnid = fulfillment.payout_tx_id token_name = fulfillment.token_name funderAddress = fulfillment.bounty.bounty_owner_address payeeAddress = fulfillment.fulfiller_address amount = fulfillment.payout_amount headers = { 'accept': 'application/json', 'x-api-key': API_KEY } url = f'https://mainnet-algorand.api.purestake.io/idx2/v2/transactions/{txnid}' response = requests.get(url=url, headers=headers).json() if response: if response.get("current-round") and response.get("transaction"): txn = response["transaction"] # asset / algo token payment_txn = txn['payment-transaction'] if txn.get('payment-transaction') else txn['asset-transfer-transaction'] if ( txn['confirmed-round'] > 0 and txn['sender'].lower() == funderAddress.lower() and payment_txn['receiver'].lower() == payeeAddress.lower() and float(float(payment_txn['amount'])/ 10**6) == float(amount) and not txn_already_used(txnid, token_name) ): return 'success' return None
def get_rsk_txn_status(fulfillment): txnid = fulfillment.payout_tx_id token_name = fulfillment.token_name funderAddress = fulfillment.bounty.bounty_owner_address payeeAddress = fulfillment.fulfiller_address # amount = fulfillment.payout_amount if token_name not in ['RBTC', 'RDOC', 'DOC', 'RIF', 'SOV']: return None if not txnid or txnid == "0x0": return None url = f'https://blockscout.com/rsk/mainnet/api?module=transaction&action=gettxinfo&txhash={txnid}' response = requests.get(url).json() if response['status'] and response['result']: txn = response['result'] to_address_match = txn['to'] == payeeAddress.lower( ) if token_name == 'RBTC' else True if (txn['from'] == funderAddress.lower() and to_address_match and # float(txn['value']) == float(amount * 10 ** 18) and not txn_already_used(txn['hash'], token_name) and int(txn['confirmations']) > 0): if txn['success']: return 'success' return 'expired' return None
def find_txn_on_rsk_explorer(fulfillment): token_name = fulfillment.token_name funderAddress = fulfillment.bounty.bounty_owner_address # amount = fulfillment.payout_amount payeeAddress = fulfillment.fulfiller_address if token_name not in ['RBTC', 'RDOC', 'DOC', 'RIF', 'SOV']: return None url = f'https://blockscout.com/rsk/mainnet/api?module=account&action=txlist&address={funderAddress}' response = requests.get(url).json() if response['message'] and response['result']: for txn in response['result']: to_address_match = txn['to'] == payeeAddress.lower() if token_name == 'RBTC' else True if ( txn['from'] == funderAddress.lower() and to_address_match and # float(txn['value']) == float(amount * 10 ** 18) and not txn_already_used(txn['hash'], token_name) ): return txn return None
def find_txn_on_etc_explorer(fulfillment, network='mainnet'): token_name = fulfillment.token_name if token_name != 'ETC': return None funderAddress = fulfillment.bounty.bounty_owner_address amount = fulfillment.payout_amount payeeAddress = fulfillment.fulfiller_address blockscout_url = f'https://blockscout.com/etc/{network}/api?module=account&action=txlist&address={funderAddress}' blockscout_response = requests.get(blockscout_url).json() if blockscout_response['message'] and blockscout_response['result']: for txn in blockscout_response['result']: if (txn['from'] == funderAddress.lower() and txn['to'] == payeeAddress.lower() and float(txn['value']) == float(amount) and not txn_already_used(txn['hash'], token_name)): return txn return None
def find_txn_on_zil_explorer(fulfillment, network='mainnet'): token_name = fulfillment.token_name if token_name != 'ZIL': return None funderAddress = fulfillment.bounty.bounty_owner_address amount = fulfillment.payout_amount payeeAddress = fulfillment.fulfiller_address url = f'https://api.viewblock.io/v1/zilliqa/addresses/{funderAddress}/txs?network={network}' response = requests.get(url, headers=headers).json() if len(response): for txn in response: if (txn['from'] == funderAddress.lower() and txn['to'] == payeeAddress.lower() and txn['direction'] == 'out' and float(txn['value']) == float(amount) and not txn_already_used(txn['hash'], token_name)): return txn return None
def find_txn_on_celo_explorer(fulfillment, network='mainnet'): token_name = fulfillment.token_name if token_name != 'cGLD' and token_name != 'cUSD': return None funderAddress = fulfillment.bounty.bounty_owner_address amount = fulfillment.payout_amount payeeAddress = fulfillment.fulfiller_address # TODO: UPDATE WITH MAINNET URL. Using alfajores until then blockscout_url = f'https://alfajores-blockscout.celo-testnet.org/api?module=account&action=tokentx&address={funderAddress}' blockscout_response = requests.get(blockscout_url).json() if blockscout_response['message'] and blockscout_response['result']: for txn in blockscout_response['result']: if (txn['from'] == funderAddress.lower() and txn['to'] == payeeAddress.lower() and float(txn['value']) == float(amount) and not txn_already_used(txn['hash'], token_name)): return txn return None
def find_txn_on_tezos_explorer(fulfillment): token_name = fulfillment.token_name funderAddress = fulfillment.funder_address payeeAddress = fulfillment.fulfiller_address amount = fulfillment.payout_amount txnid = fulfillment.payout_txid if token_name != 'XTZ': return None url = f'{BASE_URL}/accounts/{funderAddress}' response = requests.get(url).json() if response: for txn in response['operations']: if (txn['type'] == 'transaction' and txn['hash'].strip() == txnid and txn['sender']['address'] == funderAddress and txn['target']['address'] == payeeAddress and txn['amount'] == float(amount) * 10**6 and not txn_already_used(txn['hash'], token_name)): return txn return None
def find_txn_on_celo_explorer(fulfillment, network='mainnet'): token_name = fulfillment.token_name if token_name != 'cUSD' and token_name != 'CELO': return None funderAddress = fulfillment.bounty.bounty_owner_address token = Token.objects.filter(symbol=token_name).first() decimal = token.decimals if token else 18 amount = fulfillment.payout_amount * 10**decimal payeeAddress = fulfillment.fulfiller_address blockscout_url = f'https://explorer.celo.org/api?module=account&action=tokentx&address={funderAddress}' blockscout_response = requests.get(blockscout_url).json() if blockscout_response['message'] and blockscout_response['result']: for txn in blockscout_response['result']: if (txn['from'] == funderAddress.lower() and txn['to'] == payeeAddress.lower() and float(txn['value']) == float(amount) and not txn_already_used(txn['hash'], token_name)): return txn return None
def find_txn_on_btc_explorer(fulfillment, network='mainnet'): funderAddress = fulfillment.bounty.bounty_owner_address amount = fulfillment.payout_amount payeeAddress = fulfillment.fulfiller_address n = Net(provider='Blockstream', network=network) txlist = n.txs(funderAddress) if network == 'mainnet': blockstream_url = 'https://blockstream.info/api/tx/' else: blockstream_url = 'https://blockstream.info/testnet/api/tx/' if txlist != []: for txn in txlist: blockstream_response = requests.get(blockstream_url + txn).json() if (blockstream_response['vin'][0]['prevout'] ['scriptpubkey_address'] == str(funderAddress) and blockstream_response['vout'][0]['scriptpubkey_address'] == str(payeeAddress) and float(blockstream_response['vout'][0]['value']) == float(amount) and not txn_already_used(txn, 'BTC')): return txn return None