Example #1
0
async def get_token_info_by_id(tokenID: str):
    node_ip = get_node_ip()
    if node_ip == False:
        print('Connection ERROR...')
        return {'errorMsg': 'Connection error...'}

    url = get_url(node_ip)
    header = get_header()
    body = {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "contract_getTokenInfoById",
        "params": tokenID
    }

    try:
        response = requests.post(url=url, json=body, headers=header)
        if response.status_code == status.HTTP_200_OK:
            resp = response.json()
            if not 'result' in resp:
                return {'errorMsg': 'No data received'}
            if len(resp['result']) == 0:
                return {'errorMsg': 'No token details received'}

            return {'data': resp}
        else:
            return {'errorMsg': response.status_code}
    except Exception as e:
        print(e)
        return {'errorMsg': 'Exception during request.'}
Example #2
0
async def get_quota(viteAddress: str):
    nodeIP = get_node_ip()
    if nodeIP == False:
        print('Connection ERROR...')
        raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
                            detail='Could not find a node')

    url = get_url(nodeIP)
    header = get_header()
    body = {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "contract_getStakeList",
        "params": [viteAddress, 0, 100]
    }

    try:
        response = requests.post(url=url, json=body, headers=header)
        if response.status_code == status.HTTP_200_OK:
            resp = response.json()
            if not 'result' in resp:
                raise Exception('No data received')

            return resp['result']
        else:
            raise HTTPException(status_code=response.status_code)
    except Exception as e:
        print(e)
        raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
                            detail=e)
Example #3
0
async def getAccountBlocks(viteAddress: str, hash: str, tokenTypeID: str,
                           blocks: int):
    node_ip = get_node_ip()
    if node_ip == False:
        print('Connection ERROR...')
        return {'errorMsg': 'Connection error...'}

    url = get_url(node_ip)
    header = get_header()
    body = {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "ledger_getAccountBlocks",
        "params": [viteAddress, hash, tokenTypeID, blocks]
    }

    try:
        response = requests.post(url=url, json=body, headers=header)
        if response.status_code == 200:
            resp = response.json()
            if not 'result' in resp:
                return {'errorMsg': 'No data received'}
            if len(resp['result']) == 0:
                return {'errorMsg': 'No token details received'}

            return resp['result']
        else:
            return {'errorMsg': response.status_code}
    except Exception as e:
        print(e)
        return {'errorMsg': 'Exception during request.'}
Example #4
0
File: stats.py Project: theMoe/vite
async def get_all_stats(db: SessionLocal = Depends(get_db)):
    ip = get_node_ip()
    sync_info = await load_syncInfo(ip)

    block_height = sync_info['result']['current']
    transaction_count = await get_transaction_count_since_last_day(db)
    active_node_count = await get_active_node_count(db)
    total_accounts = await get_disctinct_accounts_by_transaction(db)
    total_super_nodes = len(await get_sbp(ip, False))
    token_list = await get_token_info_list(ip)
    total_tokens = len(token_list)
    for token in token_list:
        # VITE
        if token['tokenId'] == 'tti_5649544520544f4b454e6e40':
            token_supply = token['totalSupply']
            break
    exchange_rate = await load_exchangerate('VITE')
    usdt_price = exchange_rate['usdRate']

    response = {
        'block_height': block_height,
        'transactions_last_day': transaction_count,
        'super_nodes': total_super_nodes,
        'online_nodes': active_node_count,
        'tokens': total_tokens,
        'price': usdt_price,
        'total_supply': token_supply,
        'total_accounts': total_accounts
    }
    return response
Example #5
0
async def get_sbp_reward_by_timestamp(sbpName: str):
    node_ip = get_node_ip()
    if node_ip == False:
        print('Connection ERROR...')
        raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
                            detail='No nodes available.')

    url = get_url(node_ip)
    header = get_header()
    body = {
        "jsonrpc": "2.0",
        "id": 2,
        "method": "contract_getSBP",
        "params": [sbpName]
    }

    try:
        response = requests.post(url=url, json=body, headers=header)
        if response.status_code == status.HTTP_200_OK:
            resp = response.json()
            if not 'result' in resp or len(resp['result']) == 0:
                raise HTTPException(status_code=status.HTTP_204_NO_CONTENT,
                                    detail='No data received')

            return resp
        else:
            raise HTTPException(status_code=response.status_code)
    except Exception as e:
        print(e)
        raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR)
Example #6
0
async def get_quota(viteAddress: str):
    nodeIP = get_node_ip()
    if nodeIP == False:
        print('Connection ERROR...')
        raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
                            detail='Could not find a node')

    url = get_url(nodeIP)
    header = get_header()
    body = {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "contract_getQuotaByAccount",
        "params": [viteAddress]
    }

    try:
        response = requests.post(url=url, json=body, headers=header)
        response2 = requests.get(
            url=
            f'https://vitex.vite.net/reward/pledge/full/list?address={viteAddress}'
        )
        account_info = await get_account_info(viteAddress)
        if response.status_code == status.HTTP_200_OK:
            resp = response.json()
            if not 'result' in resp:
                raise Exception('No data received')
            quota = resp['result']['maxQuota']
            currentQuota = resp['result']['currentQuota']
            stakeAmountQuota = resp['result']['stakeAmount']
            vite_amount = account_info['balanceInfoMap'][
                'tti_5649544520544f4b454e6e40']['balance'] or 0
            pledgedata = response2.json()['data']
            pledge_infos = pledgedata[
                'fullNodePledgeInfos'] if pledgedata is not None else None
            stakedVite = sum(
                float(x['amount']) / 10**18
                for x in pledge_infos) if pledge_infos is not None else 0

            basic = {
                'viteBalance': float(vite_amount) / 10**18,
                'quota': int(quota) / 21000,
                'maxQuota': quota,
                'currentQuota': currentQuota,
                'stakeAmountQuota': float(stakeAmountQuota) / 10**18,
                'stakedVite': stakedVite
            }
            return basic
        else:
            raise HTTPException(status_code=response.status_code)
    except Exception as e:
        print(e)
        raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
                            detail=e)
Example #7
0
async def get_vote_details_by_cycle(
    cycle: int, blockProducerNames: Optional[List[str]] = Query(None)):
    node_ip = get_node_ip()
    if node_ip == False:
        raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
                            detail='No nodes available.')

    url = get_url(node_ip)
    header = get_header()
    body = get_body(cycle)

    results = []

    try:
        response = requests.post(url=url, json=body, headers=header)

        if response.status_code == status.HTTP_200_OK:
            resp = response.json()
            for result in resp['result']:
                print(result)
                block_producer_name = result['blockProducerName']
                if (blockProducerNames == None
                        or block_producer_name in blockProducerNames):
                    for key, value in result['addressVoteMap'].items():
                        data = {
                            'cycle': cycle,
                            'blockProducerName': block_producer_name,
                            'voteAddress': key,
                            'votes': value,
                            'votesDecimals': float(value) / 10**18
                        }
                        results.append(data)

    except Exception as e:
        print(e)
        raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
                            detail='Exception during request.')

    if len(results) > 0:
        generated_message = generate_return_file_msg(results)
        response = StreamingResponse(content=generated_message['file'],
                                     media_type='text/csv',
                                     headers={
                                         'Content-Disposition':
                                         'filename=sbpVoteDetails_{cycle}.csv'
                                     })
        return response
    else:
        raise HTTPException(status_code=status.HTTP_204_NO_CONTENT,
                            detail='No transactions available')
Example #8
0
async def get_token_info_list(node_ip: Optional[str] = None):
    if node_ip == None:
        node_ip = get_node_ip()
    if node_ip == False:
        print('Connection ERROR...')
        return {'errorMsg': 'Connection error...'}

    url = get_url(node_ip)
    header = get_header()
    body = {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "contract_getTokenInfoList",
        "params": [0, 500]
    }

    try:
        response = requests.post(url=url, json=body, headers=header)
        if response.status_code == status.HTTP_200_OK:
            resp = response.json()
            #print(resp)
            if not 'result' in resp:
                return {'errorMsg': 'No data received'}
            if len(resp['result']) == 0:
                return {'errorMsg': 'No token details received'}
            token_info_list = resp['result']['tokenInfoList']
            requested_list = []
            for element in token_info_list:
                requested_list.append({
          "tokenName": element['tokenName'],
          "tokenSymbol": element['tokenSymbol'],
          "totalSupply": float(element['totalSupply']) / 10**element['decimals'],
          "decimals": element['decimals'],
          "owner": element['owner'],
          "tokenId": element['tokenId'],
          "maxSupply": element['maxSupply'],
          "ownerBurnOnly": element['ownerBurnOnly'],
          "isReIssuable": element['isReIssuable'],
          "index": element['index'],
          "isOwnerBurnOnly": element['isOwnerBurnOnly']
        })
            
            return requested_list
        else:
            return {'errorMsg': response.status_code}
    except Exception as e:
        print(e)
        return {'errorMsg': 'Exception during request.'}
Example #9
0
async def load_transaction(hash: str):
    node_ip = get_node_ip()
    if node_ip == False:
        raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
                            detail='No nodes available.')

    url = get_url(node_ip)
    header = get_header()
    body = {"jsonrpc": "2.0", "id": 2, "method": "ledger_getAccountBlockByHash", "params": [hash]}

    try:
        response = requests.post(url=url, json=body, headers=header)
        if response.status_code == status.HTTP_200_OK:
            resp = response.json()
            if not 'result' in resp or len(resp['result']) == 0:
                raise HTTPException(status_code=status.HTTP_204_NO_CONTENT,
                                    detail='No data received')

            return resp
        else:
            raise HTTPException(status_code=response.status_code)
    except Exception as e:
        print(e)
        raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR)
Example #10
0
async def load_transactions(viteAddress: str, fromDate: Optional[date] = None, toDate: Optional[date] = None, viteAddressSender: Optional[List[str]] = Query(None)):
    node_ip = get_node_ip()
    if node_ip == False:
        raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
                            detail='No nodes available.')

    filter_token = []  # ['VITE', 'BAN']

    url = get_url(node_ip)
    header = get_header()

    initial_page = 0
    end_page = True
    transactions = []
    transactions_per_request = 1000
    page_max = 2

    if (fromDate != None and toDate != None):
        toDate_plus_1 = toDate + timedelta(1)
    else:
        toDate_plus_1 = None
    print(viteAddressSender)
    while initial_page < page_max and end_page:
        body = get_body(viteAddress, initial_page, transactions_per_request)
        try:
            response = requests.post(url=url, json=body, headers=header)
            if response.status_code == status.HTTP_200_OK:
                resp = response.json()
                #print(resp)
                if resp['result'] == None:
                    print('Last requested page has no transaction results.')
                    end_page = False
                    break
                for result in resp['result']:
                    if result['tokenInfo'] is not None and result['tokenInfo']['tokenSymbol'] not in filter_token:
                        if (fromDate == None and toDate_plus_1 == None) or (fromDate <= date.fromtimestamp(result['timestamp']) and date.fromtimestamp(result['timestamp']) < toDate_plus_1):
                            if (viteAddressSender is None) or (viteAddressSender is not None and result['fromAddress'] in viteAddressSender):
                                toAddress = result['toAddress']
                                if toAddress == viteAddress:
                                    transaction_type = 'Recieved'
                                    transaction_multiplier = 1
                                else:
                                    transaction_type = 'Sent'
                                    transaction_multiplier = -1

                                amount = int(result['amount'])
                                decimals = int(result['tokenInfo']['decimals'])
                                decimal_amount = (
                                    amount / 10**decimals) * transaction_multiplier

                                memo = None
                                if result['data'] is not None:
                                    memo_base64 = str(result['data'])
                                    memo = base64.b64decode(memo_base64).decode('utf-8',errors='ignore')
                                dtobj = datetime.fromtimestamp(
                                    result['timestamp'], timezone.utc)

                                transaction = {
                                    'fromAddress': result['fromAddress'],
                                    'toAddress': toAddress,
                                    'transactionType': transaction_type,
                                    'decimalAmount': decimal_amount,
                                    'amount': str(amount),
                                    'decimals': decimals,
                                    'fee': result['fee'],
                                    'tokenName': result['tokenInfo']['tokenName'],
                                    'tokenSymbol': result['tokenInfo']['tokenSymbol'],
                                    'datetime': result['timestamp'],
                                    'dt': dtobj.strftime('%d/%m/%Y %H:%M:%S.%f')[:-3],
                                    'txHash': result['hash'],
                                    'memo': memo
                                }
                                transactions.append(transaction)
                        elif (fromDate > date.fromtimestamp(result['timestamp'])):
                            end_page = False
                            break
            else:
                print(response.status_code)
                end_page = False
                break
        except Exception as e:
            print(e)
            raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
                                detail='Exception during request.')

        initial_page = initial_page + 1

    if len(transactions) > 0:
        generated_message = generate_return_file_msg(transactions)
        response = StreamingResponse(content=generated_message['file'],
                                     media_type='text/csv',
                                     headers={'Content-Disposition': 'filename=transactions_{viteAddress}.csv'})
        return response
    else:
        raise HTTPException(status_code=status.HTTP_204_NO_CONTENT,
                            detail='No transactions available')
Example #11
0
async def get_account_info(viteAddress: str):
    nodeIP = get_node_ip()
    if nodeIP == False:
        print('Connection ERROR...')
        raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
                            detail='Could not find a node')

    url = get_url(nodeIP)
    header = get_header()
    body = {
        "jsonrpc": "2.0",
        "id": 2,
        "method": "ledger_getAccountInfoByAddress",
        "params": [viteAddress]
    }

    try:
        response = requests.post(url=url, json=body, headers=header)
        if response.status_code == status.HTTP_200_OK:
            resp = response.json()
            if not 'result' in resp:
                raise Exception('No data received')
            balance_info_map = resp['result']['balanceInfoMap'].values()
            token_list = []
            for each in balance_info_map:
                symbol = each['tokenInfo']['tokenSymbol']
                decimals = each['tokenInfo']['decimals']
                token_index = each['tokenInfo']['index']
                amount = float(each['balance']) / 10**decimals

                if (symbol not in ['VITE', 'VX', 'VCP']):
                    symbol = symbol + '-' + \
                        '{:03}'.format(token_index)

                if amount > 0:
                    usd_value = 0
                    if (symbol != 'USDT'):
                        try:
                            value_request_json = requests.get(
                                f'https://api.vitex.net/api/v2/exchange-rate?tokenSymbols={symbol}'
                            ).json()['data'][0]
                            usd_rate = value_request_json['usdRate']
                            usd_value = float(amount) * float(usd_rate)
                        except:
                            print('maybe illegal symbol')
                    else:
                        usd_value = float(amount) * 1

                    usd_value = round(usd_value, 2)

                    available_token = {
                        "symbol": symbol,
                        "amount": amount,
                        "usdt_value": usd_value
                    }
                    token_list.append(available_token)
            token_list.sort(key=lambda json: json['usdt_value'], reverse=True)
            return token_list
        else:
            raise HTTPException(status_code=response.status_code)
    except Exception as e:
        print(e)
        raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
                            detail=e)
Example #12
0
async def get_sbp(node_ip: Optional[str] = None,
                  sbp_details: Optional[bool] = True):
    if node_ip == None:
        node_ip = get_node_ip()
    dt = datetime.now(timezone.utc)
    utc_time = dt.replace(tzinfo=timezone.utc)
    utc_timestamp = utc_time.timestamp()
    last_cycle = int((utc_timestamp - 1558411200) / 24 / 3600) - 1

    if node_ip == False:
        print('Connection ERROR...')
        raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
                            detail='No nodes available.')

    url = get_url(node_ip)
    header = get_header()
    body = {
        "jsonrpc": "2.0",
        "id": 2,
        "method": "contract_getSBPVoteList",
        "params": None
    }

    try:
        response = requests.post(url=url, json=body, headers=header)
        if response.status_code == status.HTTP_200_OK:
            resp = response.json()
            if not 'result' in resp or len(resp['result']) == 0:
                raise HTTPException(status_code=status.HTTP_204_NO_CONTENT,
                                    detail='No data received')
            if sbp_details:
                sbp_cycle = (await get_sbp_reward_by_cycle(
                    last_cycle, node_ip))['result']['rewardMap']

                modified_response = []
                for e in resp['result']:
                    name = e['sbpName']
                    node_in_cycle = sbp_cycle[name]

                    sbp = SBPVotes.parse_obj({
                        'sbp_name':
                        name,
                        'block_producing_address':
                        e['blockProducingAddress'],
                        'votes':
                        e['votes'][:len(e['votes']) - 18],
                        'count':
                        node_in_cycle['producedBlocks'],
                        'ratio': (float(node_in_cycle['producedBlocks']) /
                                  float(node_in_cycle['targetBlocks'])) * 100,
                        'block_creation_rewards':
                        float(node_in_cycle['blockProducingReward']) / 10**18,
                        'rewards_of_votes':
                        float(node_in_cycle['votingReward']) / 10**18,
                        'rewards_in_total':
                        float(node_in_cycle['totalReward']) / 10**18,
                    })
                    modified_response.append(sbp)
                return modified_response
            else:
                return resp['result']
        else:
            raise HTTPException(status_code=response.status_code)
    except Exception as e:
        print(e)
        raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR)