Exemple #1
0
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
Exemple #2
0
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
Exemple #3
0
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
Exemple #4
0
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
Exemple #5
0
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
Exemple #6
0
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
Exemple #7
0
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
Exemple #8
0
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
Exemple #9
0
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
Exemple #10
0
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