Ejemplo n.º 1
0
def curr_get_info():
    import time
    time.sleep(1)

    curr_abbrev = request.args(0)
    if not curr_abbrev:
        return {"error": "empty curr - example: curr_get_info/btc"}
    curr_abbrev = curr_abbrev.upper()
    from db_common import get_currs_by_abbrev
    curr, xcurr, e = get_currs_by_abbrev(db, curr_abbrev)
    if not xcurr:
        return {"error": "invalid curr: " + curr_abbrev}

    token_system = None
    token_key = xcurr.as_token
    if token_key:
        token = db.tokens[token_key]
        token_system = db.systems[token.system_id]
    if token_system and token_system.name == 'Erachain':
        # UESE tokenSystem
        import rpc_erachain
        res = rpc_erachain.get_info(token_system.connect_url)
        res = {
            'height':
            res,
            'balances':
            rpc_erachain.get_balances(token_system.connect_url,
                                      token_system.account),
            'from_block':
            token_system.from_block
        }
    else:
        from crypto_client import conn
        try:
            conn = conn(curr, xcurr)
            #return {'error': '%s' % conn}
        except:
            conn = None
        if not conn:
            return {
                'error':
                'Connection to ' + curr_abbrev + ' wallet is lost. Try later'
            }
        #print conn
        try:
            #getblockchaininfo, getnetworkinfo, and getwalletinfo
            #res = conn.getinfo()
            res = conn.getnetworkinfo()
            #res = conn.getblockchaininfo()
            #res = conn.getwalletinfo() (!!!!) - дает ключи?
        #except Exception as e:
        except Exception, e:
            return {
                'error':
                'Connection to ' + curr_abbrev +
                ' wallet raise error [%s]. Try later' % e
            }
Ejemplo n.º 2
0
def get_uri_in():
    response.js = "$('.go2-btn').removeClass('disabled');$('#go2').children('i').removeClass('fa-refresh fa-spin').addClass('fa-search');"

    h, result = get_rate_result(request, get_currs=True)
    print result

    addr_out = request.vars.addr
    #print request.vars
    if not addr_out:
        return mess(T('ОШИБКА: Задайте кошелек'))

    try:
        if len(addr_out) < 25 or len(addr_out) > 40:
            ##проверка на счет - если это не емайл и не ттелефон то надо длинну и на циифры
            return mess(T('ОШИБКА: неверный кошелек'))
    except:
        return mess(T('ОШИБКА: неверный кошелек 2'))

    curr_in = result['curr_in_rec']
    curr_id = curr_in.id
    xcurr_in = db(db.xcurrs.curr_id == curr_id).select().first()
    if not xcurr_in: return mess(T('xcurr in...'))

    curr_out = result['curr_out_rec']
    curr_out_id = curr_out.id
    xcurr_out = db(db.xcurrs.curr_id == curr_out_id).select().first()
    if not xcurr_out: return mess(T('xcurr out...'))

    deal_id = TO_COIN_ID
    deal = db.deals[deal_id]

    curr_in_abbrev = curr_in.abbrev
    curr_in_name = curr_in.name
    curr_out_abbrev = curr_out.abbrev
    curr_out_name = curr_out.name

    token_system_in = None
    token_key_in = xcurr_in.as_token
    if token_key_in:
        token_in = db.tokens[token_key_in]
        token_system_in = db.systems[token_in.system_id]
        import rpc_erachain

    token_system_out = None
    token_key_out = xcurr_out.as_token
    if token_key_out:
        token_out = db.tokens[token_key_out]
        token_system_out = db.systems[token_out.system_id]
        import rpc_erachain

    #print request.application[-5:]
    if request.application[:-3] != '_dvlp' and not DEVELOP_USE:
        # чето конфликт если из ipay3_dvlp вызывать то кошелек на ipay3 не коннектится
        if token_system_out:
            curr_block = rpc_erachain.get_info(token_system_out.connect_url)
            if type(curr_block) != type(1):
                return mess(
                    T('Connection to [%s] is lost, try later ') %
                    curr_out_name)
            if rpc_erachain.is_not_valid_addr(token_system_out.connect_url,
                                              addr_out):
                return mess(
                    T('address not valid for ') + curr_out_name + ' - ' +
                    addr_out)

            pass
        else:
            import crypto_client
            try:
                cc = crypto_client.conn(curr_out, xcurr_out)
            except:
                cc = None
            if not cc:
                return mess(
                    T('Connection to [%s] is lost, try later ') %
                    curr_out_name)
            if crypto_client.is_not_valid_addr(cc, addr_out):
                return mess(
                    T('address not valid for - ') + curr_out_name + ' - ' +
                    addr_out)

    try:
        session.toCoin = curr_out_abbrev
        session.toCoinA = addr_out
    except:
        print 'to_coin session error .toCoinA:', type(addr_out), addr_out

    volume_in = result['volume_in']
    try:
        session.vol = volume_in
    except:
        print 'to_coin session error .volume_in:', type(volume_in), volume_in

    if token_system_in:
        deal_acc_id, deal_acc_addr = rpc_erachain.get_deal_acc_addr(
            db, deal_id, curr_out, addr_out, token_system_in.account, xcurr_in)
        addr_in = token_system_in.account
        pass
    else:
        x_acc_label = db_client.make_x_acc(deal, addr_out, curr_out_abbrev)
        # найдем ранее созданный адресс для этого телефона, этой крипты и этого фиата
        # сначала найтем аккаунт у дела
        deal_acc_id = db_client.get_deal_acc_id(db, deal, addr_out, curr_out)
        # теперь найдем кошелек для данной крипты
        deal_acc_addr = db_client.get_deal_acc_addr_for_xcurr(
            db, deal_acc_id, curr_in, xcurr_in, x_acc_label)
        if DEVELOP_USE:
            deal_acc_addr = dict(addr='probe1DEVELOP_USE', id=1234)
        if not deal_acc_addr:
            return mess((T('Связь с сервером %s прервана') % curr_in_name) +
                        '. ' + T('Невозможно получить адрес для платежа') +
                        '. ' + T('Пожалуйста попробуйте позже'), 'warning')

        addr_in = deal_acc_addr['addr']

    okIN = session.okWt
    h += sect(
        DIV(
            okIN and DIV(H3(A(T('Правила оплаты'),
                              _onclick='$(".okIN").show("fast");',
                              _class='button warn right'),
                            _class='pull-right-'),
                         _class='col-sm-12') or '',
            DIV(
                okIN and ' ' or H3(T('ПРАВИЛА ОПЛАТЫ'), _class='center'),
                P(T('При оплате необходимо соблюдать следующие правила:')),
                UL(
                    #T('Желательно задать обратный адрес для возврата монет на случай если наша служба по каким-либо причинам не сможет совершить оплату по делу [%s]') % deal.name,
                    T('Желательно производить плату только со своего кошелька, задав адреса входов, которыми Вы действительно обладаете, а не с кошельков бирж, пулов или онлайн-кошельков. Так как при отправке со своего личного кошелька Вы всегда сможете доказать что это Ваш платеж.'
                      ),
                    T('Комиссия сети добавляется к сумме для обмена, о чем указывается ниже.'
                      ),
                    T('Если Вы оплатите другую сумму, то курс обмена может немножко измениться'
                      ),
                    T('Если Вы платите регулярно, то можете далее платить на тот же адрес кошелька криптовалюты, что получили ранее с указанием тех же деталей платежа. Хотя желательно заходить на нашу службу для получения новостей хотябы раз в пол года или подписаться на важные новости и сообщения оставив свой емайл.'
                      ),
                ),
                H4(A(T('Понятно'),
                     _onclick='$(".okIN").hide("fast");ajax("%s")' %
                     URL('aj', 'ok_to', args=['Wt']),
                     _class='button warn'),
                   _class='center'),
                _class='col-sm-12 okIN',
                _style='color:chocolate;display:%s;' %
                (okIN and 'none' or 'block')),
            _class='row'),
        'bg-warning pb-10')

    # если есть скрытый партнерский код то его забьем пользователю
    deal_acc = db.deal_accs[deal_acc_id]
    if not deal_acc.partner:
        try:
            _ = GIFT_CODE
        except:
            GIFT_CODE = session.gc

    #from gifts_lib import gift_proc
    #GIFT_CODE, gift_mess = gift_proc(db, T, deal, deal_acc, request, session, GIFT_CODE)
    #if GIFT_CODE:
    #    h += sect(XML(gift_mess), 'gift-bgc pb-10 pb-10')
    import gifts_lib
    adds_mess = XML(gifts_lib.add_mess_curr(deal_acc, curr_out, T))
    if adds_mess:
        h += sect(XML(adds_mess), 'gift-bgc pb-10 pb-10')

    hh = CAT(H2(T('Реквизиты оплаты'), _class='center'))

    if 'base_rate' in result:
        base_rate = result['base_rate']
        is_order = True
        dealer_deal = None
        volume_out, tax_rep = db_client.calc_fees(db,
                                                  deal,
                                                  dealer_deal,
                                                  curr_in,
                                                  curr_out,
                                                  volume_in,
                                                  base_rate,
                                                  is_order,
                                                  note=1)

        volume_out = common.rnd_8(volume_out)
        rate_out = volume_out / volume_in
        #print 'rate_out', rate_out, 'volume_in', volume_in, 'volume_out', volume_out

        # new make order
        order_id = db.orders.insert(
            ref_=deal_acc_addr['id'],
            volume_in=volume_in,
            volume_out=volume_out,
        )
        # теперь стек добавим, который будем удалять потом
        db.orders_stack.insert(ref_=order_id)
        txfee = float(xcurr_out.txfee or 0.0001)
        hh += DIV(P(
            T('Создан заказ №%s') % order_id, ' ',
            T('на заморозку обменного курса по'), ' ', rate_out, ' (',
            T('обратный курс'), ' ', round(1.0 / float(rate_out), 8), ') ',
            T('для объема'), ' ', volume_out, ' ', curr_out_abbrev, ' (',
            T('с учётом комиссии сети'), ' ', txfee, ').',
            H5(
                '*',
                T('Данный курс будет заморожен для Вас на 20 минут для объёма криптовалюты не больше указанного. Проверить можно по номеру заказа в списке платежей.'
                  ))),
                  _class='row')
    else:
        base_rate = volume_out = rate_out = tax_rep = None

    _, url_uri = common.uri_make(
        curr_in.name2, addr_in, {
            'amount': volume_in,
            'label': db_client.make_x_acc_label(deal, addr_out,
                                                curr_out_abbrev)
        })

    if token_system_in:
        addr_out_full = curr_out_abbrev + ':' + addr_out
    else:
        addr_out_full = addr_out

    free_bal = result['free_bal']
    hh += DIV(
        P(
            T('Оплата обмена на'), ' ', curr_out_abbrev, ' ',
            T('с выплатой монет на адрес'), ': ', addr_out, '. ',
            CAT(T('Текущая сумма обмена'), ' ', volume_out, ' ',
                curr_out_abbrev, ' (', T('с учётом комиссии сети'), ') ', ' ',
                T('из доступных в службе')) if volume_out else CAT(
                    T('Доступно в службе')), ' ', free_bal, '. '),
        P(
            T('Вы можете делать ещё платежи на созданый %s адрес для совершения автоматического обмена %s на %s по текущему курсу.'
              ) % (curr_in_name, curr_in_name, curr_out_name), ),
        DIV(CENTER(
            A(SPAN(
                T('Оплатить'), ' ', volume_in or '', ' ',
                IMG(_src=URL('static', 'images/currs/' + curr_in_abbrev +
                             '.png'),
                    _width=50)),
              _class='block button blue-bgc',
              _style='font-size:x-large; max-width:500px; margin:0px 7px;',
              _href=url_uri),
            H5(
                T('Если кошелек не запускается автоматически, произведите оплату вручную по указанным ниже реквизитам, см. ниже'
                  )),
        ),
            _class='row') if True or not token_system_in else '',
        BR(),
        DIV(H3(A(
            T('Показать QR-код'),
            _onclick=
            "jQuery(this).parent().html('<i class=\"fa fa-spin fa-refresh\" />')",
            callback=URL('plugins', 'qr', vars={'mess': url_uri}),
            target='tagQR',
            _class='button blue-bgc right'),
               _class='pull-right-'),
            _class='col-sm-12',
            _id='tagQR'),
        T('Для оплаты вручную скопируйте детали платежа в свой кошелек'),
        ': ',
        H5(
            T("Двойной клик по полю или нажмите Ctrl-A внутри поля для выделения в поле всех данных. Далее нажмите Ctrl-C для копирования выделенного в буфер обмена"
              )),
        FORM(  ## ВНИМАНИЕ !!! тут имена полей надо другие указывать или
            # FORM в основной делать тоже иначе они складываются
            LABEL(T("Volume"), ":"),
            " ",
            INPUT(_name='v', value=volume_in, _class="pay_val", _readonly=''),
            curr_in_abbrev,
            BR(),
            LABEL(T("Получатель"), ":"),
            " ",
            INPUT(_name='addr_in',
                  _value=addr_in,
                  _class='wallet',
                  _readonly=''),
            BR(),
            CAT(
                LABEL(
                    T("Назначение (вставьте в заголовок платежа или в тело сообщения, которое так же можно зашифровать)"
                      ), ":"), " ",
                INPUT(_name='addr_out',
                      _value=addr_out_full,
                      _class='wallet',
                      _readonly=''), BR()) if token_system_in else '',
            #T('Резервы службы'), ' ', B(free_bal), ' ', T('рублей'), BR(),
            #LOAD('where', 'for_addr', vars={'addr': addr_in}, ajax=True, times=100, timeout=20000,
            #    content=IMG(_src=URL('static','images/loading.gif'), _width=48)),
            INPUT(
                _type='submit',
                _class='button blue-bgc',
                _value=T('Подробный просмотр платежей'),
                _size=6,
            ),
            _action=URL('where', 'index'),
            _method='post',
        ))

    h += sect(hh, 'bg-info pb-10')

    if base_rate:
        h += sect(
            DIV(DIV(
                H3(T('Почему получился такой курс?')),
                tax_rep,
                BR(),
                T('При этом Вы получаете следующие преимущества при обмене криптовалют у нас'
                  ),
                ':',
                UL([
                    T('Вы можете теперь постоянно делать обмен со своего кошелька на полученный адрес даже не заходя на наш сайт'
                      ),
                    T('не нужно нигде регистрироваться'),
                    T('не нужно делать подтверждения по СМС или по емайл'),
                    T('обмен производится быстро и автоматически'),
                    T('Вам не нужно хранить свои деньги у нас'),
                ]),
                T('Время - деньги!'),
                _class='col-sm-12'),
                _class='row'))

    h += SCRIPT('''
        $('html, body').animate( { scrollTop: $('#tag2').offset().top - $('#aside1').height() }, 500 );
      ''')

    response.js += '$("#tag").html("");'

    return h
Ejemplo n.º 3
0
def get_incomed(db, token_system, from_block_in=None):

    erachain_addr = token_system.account
    erachain_rpc = token_system.connect_url

    tab = []
    curr_block = rpc_erachain.get_info(erachain_rpc)
    print curr_block
    if type(curr_block) != type(1):
        # кошелек еще не запустился
        print 'not started else'
        return tab, from_block_in # если переиндексация то возможно что и меньше

    from_block = from_block_in or token_system.from_block
    if from_block:
        if not curr_block > from_block:
            print 'not curr_block > from_block', curr_block, from_block
            return tab, from_block # если переиндексация то возможно что и меньше
        print from_block, '-->', curr_block, erachain_addr
        tab, curr_block = rpc_erachain.get_transactions(token_system, erachain_rpc, erachain_addr, from_block, token_system.conf)

        if curr_block == None:
            return [], None

    else:
        # если нет еще номера обработанного блока
        # то и делать нечего - мол служба только запущена
        # на нее нет еще переводоов, хотя можно наоборот взять все входы
        token_system.from_block = from_block = 1 # все входы со всеми подтверждениями берем
        token_system.update_record()
        tab, curr_block = rpc_erachain.get_transactions(token_system, erachain_rpc, erachain_addr, conf = token_system.conf)

        if curr_block == None:
            return [], None

    print tab, curr_block
    transactions = []
    for rec in tab:

        acc = parse_mess(db, rec.get('title'), rec.get('creator'))
        if not acc:
            acc = parse_mess(db, rec.get('message'), rec.get('creator'))
        if not acc:
            continue

        # make record INCOME from Erachain TRANSACTION 
        make_rec(erachain_addr, acc, rec, transactions)

        lines = rec.get('message')
        if lines:
            lines = lines.strip().split('\n')

        if lines and len(lines) > 1:
            for line in lines:
                #try:
                if True:
                    command = line.split(':')
                    if len(command) > 1:
                        if command[0].strip().lower() == 'add':
                            ## ADD transactions without payments details to that payment
                            ## need 
                            for txid in command[1].strip().split(' '):
                                # see this TX in DB and set DETAILS
                                pay_in = db(db.pay_ins.txid == txid).select().first()
                                if pay_in:
                                    # already assigned
                                    continue

                                recAdded = rpc_erachain.get_tx_info(token_system, txid.strip())
                                if not recAdded or 'creator' not in recAdded or recAdded['creator'] != rec['creator']:
                                    # set payment details only for this creator records
                                    continue

                                # make record INCOME from Erachain TRANSACTION 
                                make_rec(erachain_addr, acc, recAdded, transactions)


                #except Exception as e:
                else:
                    mess = 'COMMAND: %s - %s' % (line, e)
                    log(db, mess)


    return transactions, curr_block
Ejemplo n.º 4
0
def found_unconfirmed_tokens_0(db, token_system):

    pays = []

    from_block = token_system.from_block
    if not from_block:
        mess = curr.name + ': ' + T('not last block, please wait...')
        #print mess
        pays.append(mess)
        return

    confs_need = token_system.conf
    import rpc_erachain
    curr_block = rpc_erachain.get_info(token_system.connect_url)
    if type(curr_block) != type(1):
        mess = curr.name + ': ' + T('no connection to wallet')
        #print mess
        pays.append(mess)
        return

    confMax = confs_need + curr_block - from_block - 1
    #print 'confMax:', confMax

    lUnsp = rpc_erachain.get_unconf_incomes(token_system.connect_url,
                                            token_system.account)
    if type(lUnsp) != type([]):
        mess = 'ERROR: found_unconfirmed lUnsp: %s' % lUnsp
        pays.append(mess)
        return

    for r in lUnsp:
        '''
          {
  "type_name":"SEND",
  "creator":"78JFPWVVAVP3WW7S8HPgSkt24QF2vsGiS5",
  "amount":"333.00000000",
  "signature":"ebfZ7saSLZSJxVneXK1dReTGNdgC1cKmYd1hNVsSpDbWh8YGSi65duJZ2LSCRSi23pKX4kEHEQKPykvUfY4Rg6X",
  "fee":"0.00010176",
  "type":31,
  "confirmations":-1,
  "version":0,
  "record_type":"SEND",
  "property2":128,
  "action_key":1,
  "property1":0,
  "size":159,
  "recipient":"7F9cZPE1hbzMT21g96U8E1EfMimovJyyJ7",
  "asset":1,
  "sub_type_name":"PROPERTY",
  "timestamp":1520158685079,
  "height":-1
}

        '''
        if u'amount' not in r:
            continue
        if r[u'type'] != 31:
            continue
        if r[u'action_key'] != 1:
            continue

        curr = db((db.tokens.system_id == token_system.id)
                  & (db.tokens.token_key == r[u'asset'])
                  & (db.xcurrs.as_token == db.tokens.id)
                  & (db.currs.id == db.xcurrs.curr_id)).select().first()
        if not curr:
            return
        curr = curr.currs

        pays.append([
            dict(id=int(curr.id), abbrev=curr.abbrev),
            r[u'amount'],
            r[u'signature'],
            0,
            #'Подтверждений: %s, ожидаем еще %s. Время создания: %s'
            r[u'confirmations'],
            int(confs_need - r[u'confirmations']),
            datetime.datetime.fromtimestamp(r[u'timestamp'] * 0.001),
            r[u'creator']
        ])
    return pays
Ejemplo n.º 5
0
def found_unconfirmed(db, curr, xcurr, addr, pays):
    #print curr.abbrev

    confs_need = xcurr.conf

    token_system = None
    token_key = xcurr.as_token
    if token_key:
        token = db.tokens[token_key]
        token_system = db.systems[token.system_id]
    if token_system:
        import rpc_erachain
        curr_block = rpc_erachain.get_info(token_system.connect_url)
        if type(curr_block) != type(1):
            mess = curr.name + ': ' + T('no connection to wallet')
            #print mess
            pays.append(mess)
            return

    else:
        conn = crypto_client.conn(curr, xcurr)
        if not conn:
            mess = curr.name + ': ' + T('no connection to wallet')
            #print mess
            pays.append(mess)
            return
        #print xcurr.name

        try:
            curr_block = conn.getblockcount()
        except:
            mess = curr.name + ': ' + T('no blockcount connection to wallet')
            #print mess
            pays.append(mess)
            return

    #print curr_block
    if type(curr_block) != type(-1):
        pays.append(curr.name +
                    ' not started else... curr block: %s' % curr_block)
        return
    from_block = xcurr.from_block
    if not from_block:
        mess = curr.name + ': ' + T('not last block, please wait...')
        #print mess
        pays.append(mess)
        return
    confMax = confs_need + curr_block - from_block - 1
    #print 'confMax:', confMax
    if token_system:
        lUnsp = rpc_erachain.get_unconf_incomes(token_system.connect_url,
                                                token_system.account)
        if type(lUnsp) != type([]):
            mess = 'ERROR: found_unconfirmed lUnsp: %s' % lUnsp
            pays.append(mess)
            return
        for r in lUnsp:
            '''
            {
    "type_name":"SEND",
    "creator":"78JFPWVVAVP3WW7S8HPgSkt24QF2vsGiS5",
    "amount":"333.00000000",
    "signature":"ebfZ7saSLZSJxVneXK1dReTGNdgC1cKmYd1hNVsSpDbWh8YGSi65duJZ2LSCRSi23pKX4kEHEQKPykvUfY4Rg6X",
    "fee":"0.00010176",
    "type":31,
    "confirmations":-1,
    "version":0,
    "record_type":"SEND",
    "property2":128,
    "action_key":1,
    "property1":0,
    "size":159,
    "recipient":"7F9cZPE1hbzMT21g96U8E1EfMimovJyyJ7",
    "asset":1,
    "sub_type_name":"PROPERTY",
    "timestamp":1520158685079,
    "height":-1
  }

            '''
            if u'amount' not in r: continue

            # filter for
            if addr and addr != r[u'creator']:
                continue

            txid = r[u'signature']
            pays.append([
                curr,
                r[u'amount'],
                txid,
                0,
                #'Подтверждений: %s, ожидаем еще %s. Время создания: %s'
                r[u'confirmations'],
                confs_need - r[u'confirmations'],
                datetime.datetime.fromtimestamp(r[u'timestamp'] * 0.001),
                r[u'creator']
            ])

    else:
        lUnsp = conn.listunspent(0, confMax)
        #print lUnsp
        if type(lUnsp) != type([]):
            mess = 'ERROR: found_unconfirmed lUnsp: %s' % lUnsp
            pays.append(mess)
            return
        txids_used = {}
        for r in lUnsp:
            #print '\n\n',r.get(u'amount'), r
            txid = r.get(u'txid')
            if not txid:
                mess = 'found_unconfirmed GEN [%s]?' % r
                pays.append(mess)
                continue
            if txid in txids_used:
                # обработанные транзакции пропустим
                continue
            txids_used[txid] = True  #  запомним эту транзакцию
            ti = conn.gettransaction(txid)

            # тут массив - может быть несколько транзакций
            # может быть [u'category'] == u'receive' ИЛИ u'send'
            trans_details = ti['details']
            #print 'trans LEN:', len( trans_details ), 'trans_details:',trans_details
            #continue
            # так вот, в одной транзакции может быть несколько входов!
            # поэтому если есть выход - значит тут вход это сдача наша с вывода и такую
            # транзакцию пропускаем
            its_outcome = False
            for detail in trans_details:
                if detail[u'category'] == u'send':
                    its_outcome = True
                    # сдача тут
                    #print 'outcome'
                    break
            if its_outcome:
                continue

            for income in trans_details:
                if income[u'category'] != u'receive': continue
                #print addr, income[u'address']
                if addr and income[u'address'] != addr: continue
                # далее только входы будут
                #print 'income:   ',income
                # CopperLark тут нету аккаунта и нет адреса
                # а у Litecoin есть сразу в записи unspent
                ##pay_in = db(db.deal_acc_addrs.addr = addr).select().first()
                pays.append([
                    curr,
                    income[u'amount'],
                    txid,
                    r[u'vout'],
                    #'Подтверждений: %s, ожидаем еще %s. Время создания: %s'
                    r[u'confirmations'],
                    confs_need - r[u'confirmations'],
                    datetime.datetime.fromtimestamp(ti[u'time']),
                    income[u'address']
                ])

    # TEST
    if False:
        pays.append([
            curr, 23,
            'c7ea40601335a754e42b3a09f20386b1617448873882d654bdcb09bad3e920fd',
            2, 0, confs_need - 0,
            datetime.datetime.now()
        ])
Ejemplo n.º 6
0
def validate_addr():
    import time
    time.sleep(1)

    xcurr = None
    curr_abbrev = request.vars.get('curr')
    addr = request.vars.get('addr')
    if len(request.args) == 1:
        addr = request.args[0]
    if len(request.args) == 2:
        curr_abbrev = request.args[0]
        addr = addr or request.args[1]

    if not addr:
        return {
            'error':
            'need addr or curr_abbrev, example: /validate_addr.json/[addr] or /validate_addr.json/[curr_abbrev]/[addr]'
        }

    if addr and not curr_abbrev:
        from db_common import get_currs_by_addr
        curr, xcurr, _ = get_currs_by_addr(db, addr)

    if curr_abbrev:
        from db_common import get_currs_by_abbrev
        curr, xcurr, _ = get_currs_by_abbrev(db, curr_abbrev)

    if not xcurr:
        return {"error": "invalid curr_abbrev"}

    token_system_out = None
    token_key = xcurr.as_token
    if token_key:
        token = db.tokens[token_key]
        token_system = db.systems[token.system_id]

        import rpc_erachain
        curr_block = rpc_erachain.get_info(token_system.connect_url)
        if type(curr_block) != type(1):
            return {
                'error': 'Connection to [%s] is lost, try later ' % curr.name
            }
        if rpc_erachain.is_not_valid_addr(token_system.connect_url, addr):
            return {
                'error': 'address not valid for ' + curr.name + ' - ' + addr
            }

        return {'curr': curr.abbrev, 'ismine': token_system.account == addr}
    else:

        from crypto_client import conn
        try:
            conn = conn(curr, xcurr)
        except:
            conn = None
        if not conn:
            return {
                'error': 'Connection to [%s] is lost, try later ' % curr.name
            }

        valid = conn.validateaddress(addr)

        #import crypto_client
        #if crypto_client.is_not_valid_addr(conn, addr):
        #    return { 'error': 'address not valid for - ' + curr.abbrev}

        if not valid.get('isvalid'):
            return {
                "error": "invalid for [%s]" % curr.abbrev,
                'mess': '%s' % valid
            }
        return {
            'curr': curr.abbrev,
            'ismine': valid.get('ismine'),
            'mess': '%s' % valid
        }
Ejemplo n.º 7
0
def get_uri():
    import rates_lib, common

    args = request.args
    ##print args, '\n', request.vars
    if len(args) < 2: return mess('err...')
    deal_id = args(0)

    curr_id = args(1) or vars.get('curr_in')
    if not curr_id or len(curr_id) > 20:
        return mess('error curr_in')
    try:
        curr_id = int(curr_id)
        curr_in = db.currs[curr_id]
        if not curr_in:
            return mess('curr in id...')
    except:
        curr_in = db(db.currs.abbrev == curr_id).select().first()
        curr_id = curr_in.id
        if not curr_in:
            return mess('curr in id...')
        curr_id = curr_in.id

    curr_out_id = args(2) or vars.get('curr_out')
    if not curr_out_id or len(curr_out_id) > 20:
        return mess('error curr_out')
    try:
        curr_out_id = int(curr_out_id)
        curr_out = db.currs[curr_out_id]
        if not curr_out:
            return mess('curr out id...')
    except:
        curr_out = db(db.currs.abbrev == curr_out_id).select().first()
        if not curr_out:
            return mess('curr out id...')
        curr_out_id = curr_out.id

    addr_out = args(3)

    #if not deal_id.isdigit() or not curr_id.isdigit():
    #    return mess('dig...')

    vol = args(4)
    if not vol or len(vol) > 20:
        return mess('error amount')

    try:
        vol = float(vol)
    except:
        return mess('digs...')

    if not addr_out:
        return mess('error address')

    try:
        if len(addr_out) < 25 or len(addr_out) > 40:
            return mess('error address')
    except:
        return mess('error address')

    deal = db.deals[deal_id]
    if not deal: return mess('deal...')

    xcurr_in = db(db.xcurrs.curr_id == curr_id).select().first()
    if not xcurr_in: return mess('xcurr...')

    xcurr_out = db(db.xcurrs.curr_id == curr_out.id).select().first()
    if not xcurr_out: return mess('xcurr out...')
    curr_out_abbrev = curr_out.abbrev
    curr_out_name = curr_out.name

    token_system_in = None
    token_key_in = xcurr_in.as_token
    if token_key_in:
        token_in = db.tokens[token_key_in]
        token_system_in = db.systems[token_in.system_id]
        import rpc_erachain

    token_system_out = None
    token_key_out = xcurr_out.as_token
    if token_key_out:
        token_out = db.tokens[token_key_out]
        token_system_out = db.systems[token_out.system_id]
        import rpc_erachain

    #print request.application[-5:]
    if request.application[:-3] != '_dvlp':
        # conflicts to call if from [ipay3_dvlp]  - wallet not in connection...
        if token_system_out:
            curr_block = rpc_erachain.get_info(token_system_out.connect_url)
            if type(curr_block) != type(1):
                return mess('Connection to [%s] is lost, try later ' %
                            curr_out_name)
            if rpc_erachain.is_not_valid_addr(token_system_out.connect_url,
                                              addr_out):
                return mess('address not valid for ' + curr_out_name + ' - ' +
                            addr_out)

            pass
        else:
            import crypto_client
            try:
                cc = crypto_client.conn(curr_out, xcurr_out)
            except:
                cc = None
            if not cc:
                return mess('Connection to [%s] is lost, try later ' %
                            curr_out_name)
            if crypto_client.is_not_valid_addr(cc, addr_out):
                return mess('address not valid for - ' + curr_out_name +
                            ' - ' + addr_out)

    curr_in_name = curr_in.name

    if token_system_in:
        deal_acc_id, deal_acc_addr = rpc_erachain.get_deal_acc_addr(
            db, deal_id, curr_out, addr_out, token_system_in.account, xcurr_in)
        addr_in = token_system_in.account
        pass
    else:
        x_acc_label = db_client.make_x_acc(deal, addr_out, curr_out_abbrev)
        deal_acc_id = db_client.get_deal_acc_id(db, deal, addr_out, curr_out)
        deal_acc_addr = db_client.get_deal_acc_addr_for_xcurr(
            db, deal_acc_id, curr_in, xcurr_in, x_acc_label)
        if not deal_acc_addr:
            return mess('Connection to [%s] is lost, try later ' %
                        curr_in_name)

        addr_in = deal_acc_addr.addr

    deal_acc = db.deal_accs[deal_acc_id]
    volume_out = vol

    # fast search of RATE first
    #
    pr_b, pr_s, pr_avg = rates_lib.get_average_rate_bsa(
        db, curr_in.id, curr_out.id, None)
    if pr_avg:
        vol_in = volume_out / pr_b
        amo_out, _, best_rate = rates_lib.get_rate(db, curr_in, curr_out,
                                                   vol_in)
    else:
        best_rate = None

    if best_rate:
        is_order = True
        dealer_deal = None
        # first add TAX
        txfee = float(xcurr_out.txfee or 0.0001)
        volume_out += txfee
        volume_in, mess_in = db_client.calc_fees_back(db,
                                                      deal,
                                                      dealer_deal,
                                                      curr_in,
                                                      curr_out,
                                                      volume_out,
                                                      best_rate,
                                                      is_order,
                                                      note=0)

        volume_in = common.rnd_8(volume_in)
        rate_out = volume_out / volume_in

        # new make order
        order_id = db.orders.insert(
            ref_=deal_acc_addr.id,
            volume_in=volume_in,
            volume_out=volume_out,
        )
        db.orders_stack.insert(ref_=order_id)
    else:
        volume_in = rate_out = tax_rep = None

    _, uri = common.uri_make(
        curr_in.name2, addr_in, {
            'amount': volume_in,
            'label': db_client.make_x_acc_label(deal, addr_out,
                                                curr_out_abbrev)
        })

    curr_in_abbrev = curr_in.abbrev

    #
    lim_bal, may_pay = db_client.is_limited_ball(curr_in)

    free_bal = db_client.curr_free_bal(curr_out)
    if token_system_in:
        addr_out_full = (token_system_out and ('%d' % token_out.token_key)
                         or curr_out.abbrev) + ':' + addr_out
    else:
        addr_out_full = addr_out

    out_res = dict(curr_out_abbrev=curr_out_abbrev,
                   addr_out=addr_out,
                   volume_out=volume_out,
                   bal=float(free_bal / 2),
                   rate=rate_out,
                   curr_in_name=curr_in_name,
                   volume_in=volume_in,
                   curr_in_abbrev=curr_in_abbrev,
                   addr_in=addr_in,
                   uri=uri)
    if lim_bal > 0:
        out_res['may_pay'] = float(may_pay / 2)

    if not volume_in:
        out_res['wrong'] = 'rate not found'

    if token_system_in:
        out_res['addr_out_full'] = addr_out_full

    return request.extension == 'html' and dict(
        h=DIV(BEAUTIFY(out_res), _class='container')) or out_res
Ejemplo n.º 8
0
def get():

    args = request.args
    ##print args, '\n', request.vars
    if len(args) < 2: return mess('err...')
    deal_id = args(0)
    curr_id = args(1)
    if not deal_id.isdigit() or not curr_id.isdigit(): return mess('dig...')
    # теперь можно задать открытие кнопки
    scr = "$('#cvr%s').css('display','none');$('#tag%s').show('slow');" % (curr_id, curr_id)
    response.js = scr

    vol = request.vars.vol
    if not vol or len(vol) > 20: return mess(T('ОШИБКА') + ': ' + T('Задайте количество'))
    try:
        vol = float(vol)
        curr_id = int(curr_id)
    except:
        return mess('digs...')

    addr_out = request.vars.addr
    #print request.vars
    if not addr_out:
        return mess(T('ОШИБКА: Задайте кошелек'))

    try:
        if len(addr_out) < 25 or len(addr_out) > 40:
            ##проверка на счет - если это не емайл и не ттелефон то надо длинну и на циифры
            return mess(T('ОШИБКА: неверный кошелек'))
    except:
        return mess(T('ОШИБКА: неверный кошелек 2'))

    deal = db.deals[ deal_id ]
    if not deal: return mess(T('deal...'))
    
    curr_in = db.currs[ curr_id ]
    if not curr_in: return mess(T('curr...'))
    xcurr_in = db(db.xcurrs.curr_id == curr_id).select().first()
    if not xcurr_in: return mess(T('xcurr...'))

    #print request.vars
    curr_out = db.currs[ request.vars.curr_out ]
    xcurr_out = db(db.xcurrs.curr_id == curr_out.id).select().first()
    curr_out_abbrev = curr_out.abbrev
    curr_out_name = curr_out.name

    token_system_in = None
    token_key_in = xcurr_in.as_token
    if token_key_in:
        token_in = db.tokens[token_key_in]
        token_system_in = db.systems[token_in.system_id]
        import rpc_erachain

    token_system_out = None
    token_key_out = xcurr_out.as_token
    if token_key_out:
        token_out = db.tokens[token_key_out]
        token_system_out = db.systems[token_out.system_id]
        import rpc_erachain
        
    #print request.application[-5:]
    if request.application[:-3] != '_dvlp':
        # чето конфликт если из ipay3_dvlp вызывать то кошелек на ipay3 не коннектится
        if token_system_out:
            curr_block = rpc_erachain.get_info(token_system_out.connect_url)
            if type(curr_block) != type(1):
                return mess(T('Connection to [%s] is lost, try later ') % curr_out_name)
            if rpc_erachain.is_not_valid_addr(token_system_out.connect_url, addr_out):
                return mess(T('address not valid for ') + curr_out_name + ' - ' + addr_out)
            
            pass
        else:
            import crypto_client
            try:
                cc = crypto_client.conn(curr_out, xcurr_out)
            except:
                cc = None
            if not cc:
                return mess(T('Connection to [%s] is lost, try later ') % curr_out_name)
            if crypto_client.is_not_valid_addr(cc, addr_out):
                return mess(T('address not valid for - ') + curr_out_name + ' - ' + addr_out)

    try:
        session.toCoin = curr_out_abbrev
        session.toCoinA = addr_out
    except:
        print 'to_coin session error .toCoinA:', type(addr_out), addr_out

    try:
        session.vol = vol
    except:
        print 'to_coin session error .vol:', type(vol), vol

    curr_in_name = curr_in.name
    
    if token_system_in:
        deal_acc_id, deal_acc_addr = rpc_erachain.get_deal_acc_addr(db, deal_id, curr_out, addr_out, token_system_in.account, xcurr_in)
        addr_in =  token_system_in.account
        pass
    else:
        x_acc_label = db_client.make_x_acc(deal, addr_out, curr_out_abbrev)
        # найдем ранее созданный адресс для этого телефона, этой крипты и этого фиата
        # сначала найтем аккаунт у дела
        deal_acc_id = db_client.get_deal_acc_id(db, deal, addr_out, curr_out)
        # теперь найдем кошелек для данной крипты
        deal_acc_addr = db_client.get_deal_acc_addr_for_xcurr(db, deal_acc_id, curr_in, xcurr_in, x_acc_label)
        if not deal_acc_addr:
            return mess((T('Связь с сервером %s прервана') % curr_in_name) + '. ' + T('Невозможно получить адрес для платежа') + '. ' + T('Пожалуйста попробуйте позже'), 'warning')

        addr_in = deal_acc_addr.addr
        
    h = CAT()

    okIN = session.okWt
    h += sect(DIV(
        okIN and DIV(H3(A(T('Правила оплаты'), _onclick='$(".okIN").show("fast");', _class='button warn right'),
                      _class='pull-right-'), _class='col-sm-12') or '',
        DIV(okIN and ' ' or H3(T('ПРАВИЛА ОПЛАТЫ'), _class='center'),
           P(T('При оплате необходимо соблюдать следующие правила:')),
           UL(
                T('Желательно задать обратный адрес для возврата монет на случай если наша служба по каким-либо причинам не сможет совершить оплату по делу [%s]') % deal.name,
                T('Если Вы не задали обратный адрес для возврата монет, то необходимо платить биткоины и другую криптовалюту только со своего кошелька, задав адреса входов, которыми Вы действительно обладаете, а не с кошельков бирж, пулов или разных онлайн-кошельков. Так как монеты, в случае если платеж будет отвергнут нашим партнёром, могут автоматически вернуться только на адрес отправителя.'),
                T('Комиссия сети добавляется к сумме для обмена, о чем указывается ниже.'),
                T('Если Вы оплатите другую сумму, то курс обмена может немножко измениться'),
                T('Если Вы платите регулярно, то можете платить на тот же адрес кошелька криптовалюты, что получили ранее. Хотя желательно заходить на нашу службу для получения новостей хотябы раз в пол года или подписаться на важные новости и сообщения оставив свой емайл.'),
                ),
            H4(A(T('Понятно'), _onclick='$(".okIN").hide("fast");ajax("%s")'
              % URL('aj','ok_to',args=['Wt']), _class='button warn'), _class='center'),
            _class='col-sm-12 okIN',
            _style='color:chocolate;display:%s;' % (okIN and 'none' or 'block')),
            _class='row'),
        'bg-warning pb-10')


    # если есть скрытый партнерский код то его забьем пользователю
    deal_acc = db.deal_accs[deal_acc_id]
    if not deal_acc.partner:
        try:
            _ = GIFT_CODE
        except:
            GIFT_CODE = session.gc

    #from gifts_lib import gift_proc
    #GIFT_CODE, gift_mess = gift_proc(db, T, deal, deal_acc, request, session, GIFT_CODE)
    #if GIFT_CODE:
    #    h += sect(XML(gift_mess), 'gift-bgc pb-10 pb-10')
    import gifts_lib
    adds_mess = XML(gifts_lib.add_mess_curr(deal_acc, curr_out, T))
    if adds_mess:
        h += sect(XML(adds_mess), 'gift-bgc pb-10 pb-10')
    
    volume_out = vol
    hh = CAT(H2('4. ' + T('Оплатите по данным реквизитам'), _class='center'))

    # используем быстрый поиск курса по формуле со степенью на количество входа
    # только надо найти кол-во входа от выхода
    pr_b, pr_s, pr_avg = rates_lib.get_average_rate_bsa(db, curr_in.id, curr_out.id, None)
    if pr_avg:
        vol_in = volume_out / pr_b
        amo_out, _, best_rate = rates_lib.get_rate(db, curr_in, curr_out, vol_in)
    else:
        best_rate = None

    if best_rate:
        is_order = True
        dealer_deal = None
        # сначала открутим обратную таксу
        txfee = float(xcurr_out.txfee or 0.0001)
        volume_out += txfee
        volume_in, mess_in = db_client.calc_fees_back(db, deal, dealer_deal, curr_in, curr_out, volume_out,
                                           best_rate, is_order, note=0)
        ## теперь таксы для человека получим и должна та же цифра выйти
        vol_out_new, tax_rep = db_client.calc_fees(db, deal, dealer_deal, curr_in, curr_out, volume_in,
                                           best_rate, is_order, note=1)
        vol_out_new = common.rnd_8(vol_out_new)
        if common.rnd_8(volume_out) != vol_out_new:
            print 'to_phone error_in_fees: volume_out != vol_out_new', volume_out,  vol_out_new

        volume_in = common.rnd_8(volume_in)
        rate_out = volume_out / volume_in

        # new make order
        order_id = db.orders.insert(
            ref_ = deal_acc_addr.id,
            volume_in = volume_in,
            volume_out = volume_out,
            )
        # теперь стек добавим, который будем удалять потом
        db.orders_stack.insert( ref_ = order_id )
        hh += DIV(
            T('Создан заказ №%s') % order_id,' ',
            T('на заморозку обменного курса по'), ' ', rate_out,
            ' (',T('обратный курс'), ' ', round(1.0/float(rate_out),8),') ',
            T('для объема'),' ',volume_out, ' ', curr_out_abbrev, ' (', T('с учётом комиссии сети'),' ',txfee,').',
            H5('*',T('Данный курс будет заморожен для Вас на 20 минут для объёма криптовалюты не больше указанного. Проверить можно по номеру заказа в списке платежей.')),
            _class='row')
    else:
        volume_in = rate_out = tax_rep = None
        hh += mess('[' + curr_in_name + '] -> [' + curr_out_name + ']' + T(' - лучшая цена не доступна.') + T('Но Вы можете оплатить вперед'), 'warning pb-10')

    _, url_uri = common.uri_make( curr_in.name2, addr_in, {'amount':volume_in, 'label': db_client.make_x_acc_label(deal, addr_out, curr_out_abbrev)})

    curr_in_abbrev = curr_in.abbrev
    lim_bal, may_pay = db_client.is_limited_ball(curr_in)
    if lim_bal:
        if may_pay> 0:
            lim_bal_mess = P(
                T('Внимание! Для криптовалюты %s существует предел запаса и поэтому наша служба может принять только %s [%s], Просьба не превышать это ограничение') % (curr_in.name, may_pay, curr_in_abbrev), '.',
                _style='color:black;'
                )
        else:
            lim_bal_mess = P(
                T('ВНИМАНИЕ! Наша служба НЕ может сейчас принимать %s, так как уже достугнут предел запаса её у нас. Просьба попробовать позже, после того как запасы [%s] снизятся благодаря покупке её другими пользователями') % (curr_in.name, curr_in_abbrev),
                '. ', T('Иначе Ваш платеж будет ожидать момента когда запасы снизятся ниже %s') % lim_bal,'.',
                _style='color:brown;')
    else:
        lim_bal_mess = ''

    free_bal = db_client.curr_free_bal(curr_out)
    if token_system_in:
        addr_out_full = (token_system_out and ('%d' % token_out.token_key) or curr_out.abbrev) + ':' + addr_out
    else:
        addr_out_full = addr_out

    hh += DIV(
        P(
        T('Оплата обмена на'), ' ',curr_out_abbrev, ' ', T('с выплатой монет на адрес'),  ': ',
        addr_out, '. ', T('Текущая сумма обмена'), ' ', volume_out, ' ', curr_out_abbrev,' (',
            T('с учётом комиссии сети'),') ',
        ' ', T('из доступных в службе'), ' ', free_bal, '. ',
        T('Так же Вы можете делать ещё платежи на созданый %s адрес для совершения автоматического обмена %s на %s по текущему курсу.') % (curr_in_name, curr_in_name, curr_out_name),
        ),
        volume_out > free_bal and P(
                        H3(T('Сейчас средств на балансе меньше чем Вам надо'), _style='color:crimson;'),
                        SPAN(T('Поэтому Ваш заказ будет исполнен позже'), BR(),
                        T('когда на балансе службы появится достаточно средств'), _style='color:black;'), BR(),
                        ) or '',
        lim_bal_mess,
        DIV(CENTER(
            A(SPAN(T('Оплатить'),' ', volume_in or '', ' ',
            IMG(_src=URL('static','images/currs/' + curr_in_abbrev + '.png'), _width=50)),
            _class='block button blue-bgc', _style='font-size:x-large; max-width:500px; margin:0px 7px;',
            _href=url_uri),
                    ),
            _class='row'
            ) if not token_system_in else '',
        BR(),
        DIV(
            A(T('Показать QR-код'),  _class='btn btn-info',
               ##_onclick="jQuery(this).parent().html('%s')" % IMG(_src=URL('static','images/loading.gif'), _width=64),
               _onclick="jQuery(this).parent().html('<i class=\"fa fa-spin fa-refresh\" />')",
               callback=URL('plugins','qr', vars={'mess': url_uri}),
               target='tag0',
               #delete='div#tag0'
               ),
            _id='tag0'),
        H3(T('или')),
        T('Оплатите вручную'), '. ',# 'URI:', url_uri,'. ',
        T("Для этого скопируйте значения полей (двойной клик по полю для выделения) и вставьте их в платеж на вашем кошельке"), ': ',
        FORM( ## ВНИМАНИЕ !!! тут имена полей надо другие указывать или
            # FORM в основной делать тоже иначе они складываются
            LABEL(T("Volume")), " ", INPUT(_name='v', value=volume_in, _class="pay_val", _readonly=''), curr_in_abbrev, BR(),
            LABEL(T("Получатель")), " ", INPUT(_name='addr_in', _value=addr_in, _class='wallet', _readonly=''), BR(),
            CAT(LABEL(T("Назначение (вставьте в заголовок платежа)")), " ", INPUT(_name='addr_out', _value=addr_out_full, _class='wallet', _readonly=''), BR()) if token_system_in else '',
            #T('Резервы службы'), ' ', B(free_bal), ' ', T('рублей'), BR(),
            #LOAD('where', 'for_addr', vars={'addr': addr_in}, ajax=True, times=100, timeout=20000,
            #    content=IMG(_src=URL('static','images/loading.gif'), _width=48)),
            INPUT( _type='submit',
                _class='button blue-bgc',
                _value=T('Подробный просмотр платежей'),
                _size=6,
                  ),
            _action=URL('where', 'index'), _method='post',
            )
        )
    
    
    h += sect(hh, 'bg-info pb-10')

    h += sect(DIV(DIV(
        H3(T('Почему получился такой курс?')),
        tax_rep, BR(),
        T('При этом Вы получаете следующие преимущества при обмене криптовалют у нас'),':',
        UL(
            [
                T('Вы можете теперь постоянно делать обмен со своего кошелька на полученный адрес даже не заходя на наш сайт'),
                T('не нужно нигде регистрироваться'),
                T('не нужно делать подтверждения по СМС или по емайл'),
                T('обмен производится быстро и автоматически'),
                T('Вам не нужно хранить свои деньги у нас'),
            ]
        ),
        T('Время - деньги!'),
        _class='col-sm-12'), _class='row'))

    h += SCRIPT('''
        $('html, body').animate( { scrollTop: $('#cvr%s').offset().top - $('#aside1').height() }, 500 );
      ''' % (curr_id))
    return h