def find_txn_on_rsk_explorer(contribution): subscription = contribution.subscription grant = subscription.grant token_symbol = subscription.token_symbol if subscription.tenant != 'RSK': return None if token_symbol not in ['RBTC', 'RDOC', 'DOC', 'RIF', 'SOV']: return None to_address = grant.rsk_payout_address from_address = subscription.contributor_address # amount = subscription.amount_per_period url = f'https://blockscout.com/rsk/mainnet/api?module=account&action=txlist&address={to_address}' response = requests.get(url).json() if (response and response['message'] and response['result']): for txn in response['result']: to_address_match = txn['to'] == to_address.lower( ) if token_symbol == 'RBTC' else True if (txn['from'] == from_address.lower() and to_address_match and # float(txn['value']) == float(amount * 10 ** 18) and not txn_already_used(txn['hash'], token_symbol)): return txn return None
def is_valid_zcash_txn(contribution): subscription = contribution.subscription grant = subscription.grant txn_id = contribution.tx_id to_address = grant.zcash_payout_address amount = subscription.amount_per_period token_symbol = subscription.token_symbol if not txn_id or txn_id == '0x0': return None url = f'https://sochain.com/api/v2/tx/ZEC/{txn_id}' response = requests.get(url).json() if (response['status'] == 'success' and response['data'] and response['data']['outputs']): for txn in response['data']['outputs']: if (txn['address'] == to_address and float(txn['value']) == float(amount) and is_txn_done_recently(response['data']['time']) and not txn_already_used(txn_id, token_symbol)): return True return None
def find_txn_on_zil_explorer(contribution): subscription = contribution.subscription grant = subscription.grant token_symbol = subscription.token_symbol if subscription.tenant != 'ZIL': return None if token_symbol != 'ZIL': return None to_address = grant.zil_payout_address from_address = subscription.contributor_address amount = subscription.amount_per_period url = f'https://api.viewblock.io/v1/zilliqa/addresses/{to_address}/txs?network=mainnet' response = requests.get(url, headers=headers).json() if len(response): for txn in response: if ( txn['from'] == from_address.lower() and txn['to'] == to_address.lower() and txn['direction'] == 'in' and float(txn['value']) / 10 ** DECIMALS == float(amount) and is_txn_done_recently(txn['timestamp']/1000) and not txn_already_used(txn['hash'], token_symbol) ): return txn['hash'] return None
def find_txn_on_harmony_explorer(contribution): subscription = contribution.subscription grant = subscription.grant token_symbol = subscription.token_symbol if subscription.tenant != 'HARMONY': return None if token_symbol != 'ONE': return None to_address = grant.harmony_payout_address from_address = subscription.contributor_address amount = subscription.amount_per_period url = f'https://explorer.hmny.io:8888/address?id={to_address}&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'] == from_address.lower() and tx['to'] == to_address.lower() and tx['value'] == float(amount) * 10 ** 18 and not txn_already_used(tx['hash'], token_symbol) ): return tx return None
def get_harmony_txn_status(contribution, network='mainnet'): txnid = contribution.tx_id if not txnid or txnid == "0x0": return None subscription = contribution.subscription grant = subscription.grant token_symbol = subscription.token_symbol to_address = grant.harmony_payout_address from_address = subscription.contributor_address amount = subscription.amount_per_period url = f'https://explorer.hmny.io:8888/tx?id={txnid}' response = requests.get(url).json() if (response and 'tx' in response): tx = response['tx'] if 'err' in tx: # txn hasn't been published to chain yet return None if ( tx['from'] == from_address.lower() and tx['to'] == to_address.lower() and tx['value']== float(amount) * 10 ** 18 and not txn_already_used(tx['hash'], token_symbol) ): if tx['status'] == 'SUCCESS': return 'success' return None
def find_txn_on_celo_explorer(contribution): subscription = contribution.subscription grant = subscription.grant token_symbol = subscription.token_symbol if subscription.tenant != 'CELO': return None if token_symbol != 'cUSD' and token_symbol != 'CELO': return None to_address = grant.celo_payout_address from_address = subscription.contributor_address amount = subscription.amount_per_period blockscout_url = f'https://explorer.celo.org/api?module=account&action=tokentx&address={to_address}' blockscout_response = requests.get(blockscout_url).json() if blockscout_response['message'] and blockscout_response['result']: for txn in blockscout_response['result']: if (txn['from'] == from_address.lower() and txn['to'] == to_address.lower() and int(txn['value']) / 10**int(txn['tokenDecimal']) == amount and is_txn_done_recently(txn['timeStamp']) and not txn_already_used(txn['hash'], token_symbol)): return txn['hash'] return None
def find_txn_on_zcash_explorer(contribution): subscription = contribution.subscription grant = subscription.grant token_symbol = subscription.token_symbol if subscription.tenant != 'ZCASH': return None if token_symbol != 'ZEC': return None to_address = grant.zcash_payout_address from_address = subscription.contributor_address amount = subscription.amount_per_period url = f'https://sochain.com/api/v2/address/ZEC/{from_address}' response = requests.get(url).json() # Check contributors txn history if response['status'] == 'success' and response['data'] and response[ 'data']['txs']: txns = response['data']['txs'] for txn in txns: if txn.get('outgoing') and txn['outgoing']['outputs']: for output in txn['outgoing']['outputs']: if contribution.tx_id and contribution.tx_id != '0x0': if txn['txid'] == contribution.tx_id: if (output['address'] == to_address and float(output['value']) == float(amount) and is_txn_done_recently(txn['time'])): return txn['txid'] else: if (output['address'] == to_address and response['data']['address'] == from_address and float(output['value']) == float(amount) and is_txn_done_recently(txn['time']) and not txn_already_used( txn['txid'], token_symbol)): return txn['txid'] url = f'https://sochain.com/api/v2/address/ZEC/{to_address}' response = requests.get(url).json() # Check funders txn history # if response['status'] == 'success' and response['data'] and response['data']['txs']: # txns = response['data']['txs'] # for txn in txns: # if txn.get('incoming') and txn['incoming']['inputs']: # for input_tx in txn['incoming']['inputs']: # if ( # input_tx['address'] == from_address and # response['data']['address'] == to_address and # is_txn_done_recently(txn['time']) and # not txn_already_used(txn['txid'], token_symbol) # ): # return txn['txid'] return None
def get_rsk_txn_status(contribution, network='mainnet'): txnid = contribution.tx_id if not txnid or txnid == "0x0": return None subscription = contribution.subscription grant = subscription.grant token_symbol = subscription.token_symbol to_address = grant.rsk_payout_address from_address = subscription.contributor_address # amount = subscription.amount_per_period if token_symbol not in ['RBTC', 'RDOC', 'DOC']: 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'] == to_address.lower() if token_symbol == 'RBTC' else True if ( txn['from'] == from_address.lower() and to_address_match and # float(txn['value']) == float(amount * 10 ** 18) and not txn_already_used(txn['hash'], token_symbol) and int(txn['confirmations']) > 0 ): if txn['success']: return 'success' return 'expired' return None
def get_algorand_txn_status(contribution): txnid = contribution.tx_id if not txnid or txnid == "0x0": return None subscription = contribution.subscription grant = subscription.grant token_symbol = subscription.token_symbol amount = subscription.amount_per_period to_address = grant.algorand_payout_address from_address = subscription.contributor_address url = f'https://api.algoexplorer.io/v2/transactions/pending/{txnid}?format=json' response = requests.get(url).json() 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() == from_address.lower() and rcv.lower() == to_address.lower() and float(float(amt) / 10**6) == float(amount) and not txn_already_used(txnid, token_symbol)): 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(contribution) return None
def get_algorand_txn_status_paid_explorer(contribution): txnid = contribution.tx_id if not txnid or txnid == "0x0": return None subscription = contribution.subscription grant = subscription.grant token_symbol = subscription.token_symbol amount = subscription.amount_per_period to_address = grant.algorand_payout_address from_address = subscription.contributor_address 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() == from_address.lower() and payment_txn['receiver'].lower() == to_address.lower() and float( float(payment_txn['amount']) / 10**6) == float(amount) and not txn_already_used(txnid, token_symbol)): return 'success' return None