Exemple #1
0
def inits_new_portal(dd):
    return
    db.to_phone.drop()
    resp = ""
    # для всех криптовалют создадим главные аккоунты в кошельках
    for xcurr in db(db.xcurrs).select():
        try:
            aa = crypto_client.conn(xcurr)
        except Exception as e:
            print e
            msg = xcurr.name + " no connection to wallet"
            print msg
            resp = resp + msg + '<br>'
            continue

        try:
            x = crypto_client.get_xaddress_by_label(xcurr,'.main.',aa)
        except Exception as e:
            print e
            msg = xcurr.name + " no made .main. account"
            print msg
            resp = resp + msg + '<br>'
            continue


    return resp
Exemple #2
0
def tx_senders():
    session.forget(response)
    txid = request.args(1)
    if not txid:
        #raise HTTP(501, {"error": "empty pars"})
        return {'error':"need txid: /tx_senders.json/[curr]/[txid]"}
    curr_abbrev = request.args(0)
    import db_common
    curr, xcurr, e = db_common.get_currs_by_abbrev(db, curr_abbrev)
    if not xcurr:
        return {"error": "invalid curr"}
    
    token_system = None
    token_key = xcurr.as_token
    if token_key:
        token = db.tokens[token_key]
        token_system = db.systems[token.system_id]
        res = dict(result=crypto_client.sender_addrs(conn, token_system, txid))
        return res

    import crypto_client
    conn = crypto_client.conn(curr, xcurr)
    if not conn:
        return {"error": "not connected to wallet"}
    res = dict(result=crypto_client.sender_addrs(conn, token_system, txid))
    return res
Exemple #3
0
def tx_info():
    session.forget(response)

    txid = request.args(1)
    if not txid:
        return {'error':"need txid: /tx_info.json/[curr]/[txid]"}
    curr_abbrev = request.args(0)
    import db_common
    curr,xcurr,e = db_common.get_currs_by_abbrev(db, curr_abbrev)
    if not xcurr:
        return {"error": "invalid curr:  /tx_info.json/[curr]/[txid]"}

    import crypto_client

    token_system = conn = None
    token_key = xcurr.as_token
    if token_key:
        token = db.tokens[token_key]
        token_system = db.systems[token.system_id]
        res = dict(result=crypto_client.get_tx_info(conn, token_system, txid))
        return res

    conn = crypto_client.conn(curr, xcurr)
    if not conn:
        return {"error": "not connected to wallet"}
    res = crypto_client.get_tx_info(conn, txid, request.vars)
    return res
Exemple #4
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}
    from crypto_client import conn
    try:
        conn = conn(curr, xcurr)
    except:
        conn = None
    if not conn:
        return {
            'error':
            'Connection to ' + curr_abbrev + ' wallet is lost. Try later'
        }
    print conn
    try:
        res = conn.getinfo()
    #except Exception as e:
    except Exception, e:
        return {
            'error':
            'Connection to ' + curr_abbrev +
            ' wallet raise error [%s]. Try later' % e
        }
Exemple #5
0
def get_deal_acc_addr_for_xcurr(db, deal_acc_id, curr, xcurr, x_acc_label):
    # найдем адрес крипты для данногоо аккаунта дела или создадим
    deal_acc_addr = db(
        (db.deal_acc_addrs.deal_acc_id == deal_acc_id)
        & (db.deal_acc_addrs.xcurr_id == xcurr.id)).select().first()
    if deal_acc_addr:
        return deal_acc_addr

    conn = crypto_client.conn(curr, xcurr)
    if not conn: return
    # http://docs.python.org/2/library/codecs.html?highlight=decoding
    x_acc_label = x_acc_label.decode('utf8')
    #x_acc_label = x_acc_label.encode('koi8_r') # 'iso8859_5') # 'cp866') # 'cp1251') #'cp855')
    #x_acc_label = x_acc_label.decode('cp855')
    #print 'GET new addr for',x_acc_label
    try:
        addr = crypto_client.get_xaddress_by_label(conn, x_acc_label)
    except:
        return
    if not addr: return
    else:
        id = db.deal_acc_addrs.insert(deal_acc_id=deal_acc_id,
                                      xcurr_id=xcurr.id,
                                      addr=addr)
        deal_acc_addr = db.deal_acc_addrs[id]
    return deal_acc_addr
Exemple #6
0
def ophrans():
    if len(request.args) == 0:
        mess = 'len(request.args)==0 - [BTC]'
        return mess
    import db_common
    #import crypto_client
    curr, xcurr, e = db_common.get_currs_by_abbrev(db, request.args[0])
    conn = crypto_client.conn(curr, xcurr)
    h = CAT()
    cnt = 0
    for r in db((db.deal_acc_addrs.xcurr_id == xcurr.id)
                & (db.pay_ins.ref_ == db.deal_acc_addrs.id)).select():
        cnt += 1
        txid = r.pay_ins.txid
        #print txid
        if len(txid) > 60 and len(txid) < 70:
            res = conn.gettransaction(txid)  # выдает только для кошелька
            if res:
                conf = res.get('confirmations')
                #print conf
                if conf > 2:
                    continue
            h += P(BEAUTIFY(r.pay_ins))
            h += P(BEAUTIFY(res))
            h += HR()
    return dict(h=CAT(H3('counter:', cnt), h))
Exemple #7
0
def get_shop_order_addr_for_xcurr(db, shop_order_id, curr, xcurr, order_id_label):
    # найдем адрес крипты для данногоо аккаунта дела или создадим
    shop_order_addr = db((db.shop_order_addrs.shop_order_id==shop_order_id)
        & (db.shop_order_addrs.xcurr_id==xcurr.id)
        ).select().first()
    if not shop_order_addr:
        conn = crypto_client.conn(curr, xcurr)
        if not conn: return
        # http://docs.python.org/2/library/codecs.html?highlight=decoding
        ### после trans - не надо! x_acc_label = order_id_label.decode('utf8')
        #x_acc_label = x_acc_label.encode('koi8_r') # 'iso8859_5') # 'cp866') # 'cp1251') #'cp855')
        #x_acc_label = x_acc_label.decode('cp855')
        x_acc_label = order_id_label
        print 'GET new addr for',x_acc_label
        ## тут нельзя по метке брать адрес - так как метка может быть от старого счета для заказа с тем же номером
        ## addr = crypto_client.get_xaddress_by_label(conn, x_acc_label)
        ## делаем по номеру счета адрес
        # TODO - надо сделать проверку в кошельке - может там такого адреса нет который есть в ДБ
        # может новый кошель создан а база у нас старая с адресами - надо новый адрес сгенерить!!!
        addr = crypto_client.get_xaddress_by_label(conn, '%s' % shop_order_id)
        
        if not addr: return
        else:
            id = db.shop_order_addrs.insert(
                  shop_order_id = shop_order_id,
                  xcurr_id=xcurr.id,
                  addr = addr)
            shop_order_addr = db.shop_order_addrs[id]
    return shop_order_addr
def add_pay_in_tx():
    curr = request.vars.curr
    if not curr:
        return 'error - need curr'
    txid = request.vars.txid
    if not txid:
        return 'error - need txid'
    vout = request.vars.vout
    if not vout:
        return 'error - need vout'
    import db_common
    curr, xcurr, e = db_common.get_currs_by_abbrev(db, curr)
    if not xcurr:
        return 'error - invalid curr'

    from time import sleep
    sleep(1)

    pay_in = db((db.pay_ins.txid == txid)
                & (db.pay_ins.vout == vout)).select().first()
    if pay_in:
        return CAT(H2('already in PAY_INS'), BEAUTIFY(pay_in))

    import crypto_client
    conn = crypto_client.conn(curr, xcurr)
    if not conn:
        return 'error - not connected to wallet'
    res = None
    try:
        res = conn.getrawtransaction(txid, 1)  # все выдает
    except Exception as e:
        return 'error %s' % e

    if 'hex' in res: res.pop('hex')
    txid = res.get('txid')
    if not txid:
        return BEAUTIFY(res)

    res.pop('vin')
    vout = int(vout)
    vouts = res['vout']
    if len(vouts) <= vout:
        return CAT(H3('vout so BIG'), BEAUTIFY(vouts))
    vout = vouts[vout]
    res.pop('vout')

    scriptPubKey = vout['scriptPubKey']
    addr = scriptPubKey['addresses'][0]
    acc_addr = db(db.deal_acc_addrs.addr == addr).select().first()
    if not acc_addr:
        return H3('not found order for address: ' + addr)

    value = vout['value']
    confs = res['confirmations']

    return CAT(LABEL('confs'), INPUT(_name='confs', _value=confs), ' ',
               LABEL('address:'), INPUT(_name='addr', _value=addr), ' ',
               LABEL('value:'), INPUT(_name='amount', _value=value), BR(),
               INPUT(_type='submit'))
Exemple #9
0
def retrans_rawtr():
    import crypto_client
    for xcurr in db(db.xcurrs).select():
        curr = xcurr.curr_id and db.currs[xcurr.curr_id]
        if not curr: continue
        cn = crypto_client.conn(curr,xcurr)
        if not cn: continue
        crypto_client.re_broadcast(db,curr,xcurr,cn)
Exemple #10
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
            }
Exemple #11
0
def  get_reserve():
    if len(request.args) == 0:
        mess = 'len(request.args)==0'
        print mess
        return mess
    #import db_client
    import db_common
    import crypto_client
    curr, xcurr, e = db_common.get_currs_by_abbrev(db,request.args[0])
    if not xcurr: return 'xcurr not found'
    cn = crypto_client.conn(curr, xcurr)
    if not cn: return 'xcurr not connected'
    return crypto_client.get_reserve(curr, xcurr, cn) or 'None'
Exemple #12
0
def addrs():
    if not request.args(0): return '/EMC/[addr]'
    curr, xcurr, e = db_common.get_currs_by_abbrev(db, request.args(0))
    if not xcurr: return 'xcurr not found'
    cn = crypto_client.conn(curr, xcurr)
    if not cn: return 'xcurr not connected'

    res = {}
    addr = request.args(1)
    if True or addr:
        #res = {'addr': addr , 'res': cn.getreceivedbyaddress(addr) }
        res1 = cn.listaddressgroupings()
        res = {}
        i = 1
        cnt = cnt1 = 0
        for rr in res1:
            #res ['k%s' % i ] = r
            i += 1
            j = 1
            for r in rr:
                cnt += 1
                res['i%s-j%s' % (i, j)] = r
                j += 1
                # r = [addr, amo, acc]
                #print r
                if len(r) > 2:
                    cnt1 += 1
        res['1all'] = cnt
        res['1used'] = cnt1
    else:
        #res = cn.listreceivedbyaddress(0, True) # accs only
        #res = cn.listreceivedbyaccount(0, True)
        #res = cn.listaddress(0)
        #res = cn.listaccounts()
        #res = cn.getaddressesbyaccount('.main.')
        #res = cn.listtransactions('', 10, 0)

        # с минусом - это то что было отправлено комуто на их адрес !
        # а наш адрес в предыдущей транз смтреть
        # походу тут выдает с минусом только выходы на чужие адреса
        res1 = cn.listtransactions('', 3333, 0)
        res = []
        for k in res1:
            amo = Decimal(k['amount'])
            if amo >= 0:
                k['1getreceivedbyaddress'] = cn.getreceivedbyaddress(
                    k['address'], 0)
                k['1getaccount'] = cn.getaccount(k['address'])
                res.append(k)

    return BEAUTIFY(res)
Exemple #13
0
def get_deal_acc_addr_for_xcurr(db, deal_acc_id, curr, xcurr, x_acc_label):

    # найдем адрес крипты для данного аккаунта дела или создадим
    deal_acc_addr = db(
        (db.deal_acc_addrs.deal_acc_id == deal_acc_id)
        & (db.deal_acc_addrs.xcurr_id == xcurr.id)).select().first()
    if deal_acc_addr:
        ##print 'get_deal_acc_addr_for_xcurr found:', 'deal_acc_id:', deal_acc_id, 'xcurr_id:', xcurr.id, '>>', deal_acc_addr.id, deal_acc_addr.addr
        return deal_acc_addr

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

        addr = token_system.account
    else:
        try:
            conn = crypto_client.conn(curr, xcurr)
        except:
            conn = None

        if not conn:
            return

        if xcurr.protocol == 'zen':
            ## in Horizen Account is removed
            addr = conn.getnewaddress()

        else:
            # http://docs.python.org/2/library/codecs.html?highlight=decoding
            x_acc_label = x_acc_label.decode('utf8')
            #x_acc_label = x_acc_label.encode('koi8_r') # 'iso8859_5') # 'cp866') # 'cp1251') #'cp855')
            #x_acc_label = x_acc_label.decode('cp855')
            ##print 'GET new addr for x_acc_label:', x_acc_label
            try:
                addr = crypto_client.get_xaddress_by_label(conn, x_acc_label)
            except:
                return

        if not addr:
            return

    id = db.deal_acc_addrs.insert(deal_acc_id=deal_acc_id,
                                  xcurr_id=xcurr.id,
                                  addr=addr)
    deal_acc_addr = db.deal_acc_addrs[id]
    ##print 'GETed new addr :', addr
    return deal_acc_addr
Exemple #14
0
def tx():
    if request.extension == 'html':
        response.view = 'blockchain/res.html'

    txid = request.args(1)
    if not txid:
        return {'error': "need txid: /tx_info.json/[curr]/[txid]"}
    curr_abbrev = request.args(0)
    import db_common
    curr, xcurr, e = db_common.get_currs_by_abbrev(db, curr_abbrev)
    if not xcurr:
        return {"error": "invalid curr:  /tx_info.json/[curr]/[txid]"}

    sleep(1)

    token_system = conn = None
    token_key = xcurr.as_token
    if token_key:
        token = db.tokens[token_key]
        token_system = db.systems[token.system_id]
        res = dict(result=crypto_client.get_tx_info(conn, token_system, txid))
        return res

    conn = crypto_client.conn(curr, xcurr)
    if not conn:
        return {"error": "not connected to wallet"}
    res = None
    try:
        res = conn.getrawtransaction(txid, 1)  # все выдает
    except Exception as e:
        return {'error': e}

    if 'hex' in res: res.pop('hex')
    txid = res.get('txid')
    if txid:
        res['txid'] = A(txid, _href=URL('tx', args=[request.args(0), txid]))
    for inp in res.get('vin', []):
        if 'scriptSig' in inp: inp.pop('scriptSig')
        txid = inp.get('txid')
        if txid:
            inp['txid'] = A(txid,
                            _href=URL('tx', args=[request.args(0), txid]))
        else:
            pass
        pass
    return res
Exemple #15
0
def tx_info():
    session.forget(response)

    txid = request.args(1)
    if not txid:
        return {'error': "need txid: /tx_info.json/[curr]/[txid]"}
    curr_abbrev = request.args(0)
    import db_common
    curr, xcurr, e = db_common.get_currs_by_abbrev(db, curr_abbrev)
    if not xcurr:
        return {"error": "invalid curr:  /tx_info.json/[curr]/[txid]"}
    import crypto_client
    conn = crypto_client.conn(curr, xcurr)
    if not conn:
        return {"error": "not connected to wallet"}
    res = crypto_client.get_tx_info(conn, txid, request.vars)
    return res
Exemple #16
0
def get_unspents():
    if len(request.args) == 0:
        mess = 'len(request.args)==0'
        print mess
        return mess
    #import db_client
    import db_common
    import crypto_client
    curr, x, e = db_common.get_currs_by_abbrev(db,request.args[0])
    if not x: return 'xcurr not found'
    cn = crypto_client.conn(curr,x)
    if not cn: return 'xcurr not connected'
    vol = None
    conf = len(request.args)>1 and int(request.args[1]) or None
    tab, summ = crypto_client.get_unspents(cn, conf, vol)
    print tab, summ
    return '%s <br>%s' % (summ, BEAUTIFY(tab))
Exemple #17
0
def tx_senders():
    time.sleep(1)
    txid = request.args(1)
    if not txid:
        #raise HTTP(501, {"error": "empty pars"})
        return {'error': "need txid: /tx_senders.json/[curr]/[txid]"}
    curr_abbrev = request.args(0).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"}
    from crypto_client import conn
    conn = conn(curr, xcurr)
    if not conn:
        return {"error": "not connected to wallet"}
    res = dict(result=crypto_client.sender_addrs(conn, txid))
    return res
Exemple #18
0
def validate_addr():
    time.sleep(1)
    addr = len(
        request.args) > 0 and request.args[0] or request.vars.get('addr')
    if not addr:
        return {'error': "need addr: /validate_addr.json/[addr]"}
    from db_common import get_currs_by_addr
    curr, xcurr, _ = get_currs_by_addr(db, addr)
    if not xcurr:
        return {"error": "invalid curr"}
    from crypto_client import conn
    conn = conn(curr, xcurr)
    if not conn:
        return {"error": "not connected to wallet [%s]" % curr.abbrev}
    valid = conn.validateaddress(addr)
    if not valid.get('isvalid'):
        return {"error": "invalid for [%s]" % curr.abbrev}
    return {'curr': curr.abbrev, 'ismine': valid.get('ismine')}
Exemple #19
0
def resum_currs_deposit():
    import crypto_client
    sum = 0
    for curr in db(db.currs).select():
        sum1 = db.shops_balances.bal.sum()
        sum2 = db(
            db.shops_balances.curr_id == curr.id).select(sum1).first()[sum1]
        #print  curr.abbrev, summ2
        curr.update_record(shops_deposit=sum2)
        xcurr = db(db.xcurrs.curr_id == curr.id).select().first()
        if xcurr:
            try:
                cn = crypto_client.conn(curr, xcurr)
                #print cn
                if cn:
                    bal = cn.getbalance()
                    print curr.abbev, bal
            except:
                pass
Exemple #20
0
def is_simple_shop(db, vars, shop_id):
    shop = None
    if len(shop_id) > 30:
        # это адрес криптовалюты куда выводить - тут магазин неизвестен
        curr, xcurr, _ = db_common.get_currs_by_addr(db, shop_id)
        if not xcurr:
            return None, None
        cc = crypto_client.conn(curr, xcurr)
        if not cc or crypto_client.is_not_valid_addr(cc, shop_id):
            return None, None
        # поиска магазина еще не было - False
        shop = make_simple_shop(db, shop_id, vars, False, curr, xcurr)
        if not shop:
            # мгазин не найден и не создан
            return None, None
        shop_id = shop.id
    elif not shop_id.isdigit():
        return None, None
    shop = shop or db.shops[shop_id]
    return shop, shop_id
Exemple #21
0
def tx_info():
    time.sleep(1)

    txid = request.args(1)
    if not txid:
        return {'error': "need txid: /tx_info.json/[curr]/[txid]"}
    curr_abbrev = request.args(0).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}
    from crypto_client import conn
    conn = conn(curr, xcurr)
    if not conn:
        return {
            'error':
            'Connection to ' + curr_abbrev + ' wallet is lost. Try later'
        }
    from crypto_client import get_tx_info
    res = get_tx_info(conn, txid, request.vars)
    return res
Exemple #22
0
def register_simple():
    time.sleep(1)
    addr = request.args(0)
    if not addr or len(addr) < 30:
        time.sleep(3)
        return 'len(addr) < 30'
    from db_common import get_currs_by_addr
    curr, xcurr, _ = get_currs_by_addr(db, addr)
    if not curr:
        time.sleep(3)
        return 'addr[1] not valid'

    from crypto_client import is_not_valid_addr, conn
    cc = conn(curr, xcurr)
    if not cc:
        return 'Connection to ' + curr.abbrev + ' wallet is lost. Try later'
    if is_not_valid_addr(cc, addr):
        time.sleep(3)
        return 'Address is not valid for [' + curr.abbrev + ']'

    url = request.vars['shop_url']
    if url and url in [
            'http://localhost', 'http://127.0.0.1', 'https://localhost',
            'https://127.0.0.1'
    ]:
        time.sleep(1)
        return 'cant use [localhost] !'

    shop = db(db.shops.name == addr).select().first()
    if shop:
        return -shop.id  # already registered

    # жестко зададим валюту конвертации
    from shops_lib import make_simple_shop
    shop = make_simple_shop(db, addr, request.vars, True, curr, xcurr)
    if not shop:
        time.sleep(2)
        return 'Error on making registration. Please connect to support'

    return shop.id
Exemple #23
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 applications.shop.modules.db_common import get_currs_by_abbrev
    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}
    from crypto_client import conn
    conn = conn(curr, xcurr)
    if not conn:
        return {
            'error':
            'Connection to ' + curr_abbrev + ' wallet is lost. Try later'
        }
    res = conn.getinfo()
    return res
Exemple #24
0
def bank_check():
    import time
    addr = request.vars.get('addr')
    ref = request.vars.get('ref')
    amo = request.vars.get('amo')
    if not addr: return mess('Адрес кошелька пуст')  # Wallet address is empty
    if not ref: return mess('Номер платежа пуст')  # Reference address is empty
    if not amo: return mess('Сумма не задана')  # Amount is empty
    if not amo.replace('.', '').isdigit(): return mess('Amount Error')

    time.sleep(2)
    rec = db((db.buys_stack.ref_ == db.buys.id)
             & (db.buys.amount == amo)
             & (db.buys.buyer.startswith(ref + ' '))).select().first()
    # если вводился не номер платежа а номер платежа [op_id]
    rec = rec or db((db.buys_stack.ref_ == db.buys.id)
                    & (db.buys.amount == amo)
                    & (db.buys.operation_id == ref)).select().first()
    if not rec:
        return mess('Платеж не найден')  # Records not founded
    if rec.buys.addr:
        return mess('Адрес уже задан')  # This payment already assigned!!!

    from db_common import get_currs_by_addr
    curr, xcurr, _ = get_currs_by_addr(db, addr)
    if not xcurr:
        return mess("Неверный адрес")  # Invalid wallet address
    conn = crypto_client.conn(curr, xcurr)
    if not conn:
        return mess("Нет связи с [%s]" %
                    curr.abbrev)  # Not connected to wallet [%s]
    valid = conn.validateaddress(addr)
    if not valid.get('isvalid'):
        return mess("Неверный адрес для [%s]" %
                    curr.abbrev)  # Invalid wallet address for [%s]

    rec.buys.update_record(xcurr_id=xcurr.id, addr=addr)
    return mess('Задан для %s' % curr.name, 'info-bg')
Exemple #25
0
def info(db, request):
    err, shop_order = check_ars(db, request)
    if err: return {'error': err}

    pars = request.vars
    pays = {}
    curr_filter = pars.get('curr')
    from_filter = pars.get('from')
    till_filter = pars.get('till')
    start_rec_filter = int(pars.get('start_rec') or 0)
    recs_filter = int(pars.get('recs') or 100)
    recs_last = int(pars.get('last') or 0)
    get_addrs = 'get_addrs' in pars  # показывать ли адреса плательщиков в транзакциях
    all_fields = 'all_fields' in pars  # показывать все поля счета

    next_rec = None
    i_s = start_rec_filter
    i_stp = start_rec_filter + recs_filter
    i = 0
    addresses = {}
    for order_addr in db(
            db.shop_order_addrs.shop_order_id == shop_order.id).select():
        xcurr = db.xcurrs[order_addr.xcurr_id]
        curr = db.currs[xcurr.curr_id]
        addresses[curr.abbrev] = order_addr.addr
        # проверим на фильтр по крипте входа
        if curr_filter and curr_filter != curr.abbrev: continue
        if get_addrs:
            conn = crypto_client.conn(curr, xcurr)
            #if not conn: continue
            #print conn
        xpays = []

        if recs_last:            pay_ins = db(db.pay_ins.shop_order_addr_id == order_addr.id) \
      .select(orderby=~db.pay_ins.id, orderby_on_limitby=False, limitby=(0,recs_last))
        else:            pay_ins = db(db.pay_ins.shop_order_addr_id == order_addr.id) \
              .select()
        for pay_in in pay_ins:
            i = i + 1
            # ограничим
            if i - 1 < i_s: continue
            if i > i_stp:
                next_rec = i_stp  # запомним что не все записи выбраны - тут нельзя вычитать иначе 0 может получиться и там он в IF не сработает
                break
            dt_st = '%s' % pay_in.status_dt
            if from_filter and from_filter > dt_st: continue
            if till_filter and till_filter < dt_st: continue
            payment_ = {
                'amount': rnd_8(pay_in.amount),
                'rate_order_id': pay_in.rate_order_id,
                'amo_out': rnd_8(pay_in.amo_out),
                'created_on':
                '%s' % pay_in.created_on,  # DT не проходит в json
                'status': pay_in.status,
                'status_dt': dt_st,
                'amo_ret': rnd_8(pay_in.amo_ret),
                'txid': pay_in.txid,
                'vout': pay_in.vout,
            }
            returned_ = []
            for r_ret in db(db.pay_ins_returned.ref_id == pay_in.id).select():
                returned_.append({'txid': r_ret.txid, 'amo': r_ret.amount})
            if len(returned_) > 0:
                payment_['returned'] = returned_
            if get_addrs:
                payment_['addrs'] = conn and crypto_client.sender_addrs(
                    conn, pay_in.txid)
                #print payment_['addrs']

            xpays.append(payment_)

        if len(xpays) > 0: pays[curr.abbrev] = xpays
    curr = db.currs[shop_order.curr_id]
    #order_curr = db.currs[shop_order.order_curr_id]
    # тут отдельно считаюттся сумма по статусам if shop_order.price and s >  shop_order.price: s = shop_order.price
    res = {
        'price':
        rnd_8(shop_order.price),
        'curr':
        curr.abbrev,
        'addresses':
        addresses,
        'payments':
        pays,
        'status':
        shop_order.status,
        'shop':
        shop_order.shop_id,
        'order':
        shop_order.order_id,
        'SOFT':
        rnd_8(shop_order.payed_soft),
        'HARD':
        rnd_8(shop_order.payed_hard),
        'TRUE':
        rnd_8(shop_order.payed_true),
        'created_on':
        '%s' % shop_order.created_on,
        'TOTAL':
        rnd_8(shop_order.payed_soft + shop_order.payed_hard +
              shop_order.payed_true),
    }
    # в самом счете не хранится expire_on
    if shop_order.price:
        res['expire_on'] = '%s' % get_expire_on(shop_order.created_on,
                                                shop_order.expire)
    if all_fields:
        af = dict(shop_order)
        af.pop('delete_record')
        af.pop('update_record')
        #af.pop('shop_orders_notes')
        af['email'] = af['email'][:3] + '***' + af['email'][-3:]
        for (k, v) in af.iteritems():
            if "<class 'gluon.dal.LazySet'>" == '%s' % type(af[k]):
                af[k] = '...'
            elif v == 0:
                af[k] = 0
            else:
                af[k] = '%s' % v
        res['fields'] = af
    if shop_order.expire: res['expire'] = shop_order.expire
    if next_rec: res['next_rec'] = next_rec
    if shop_order.conv_curr_id:
        conv_curr = db.currs[shop_order.conv_curr_id]
        res['conv_curr'] = conv_curr.abbrev
    if 'get_payouts' in pars:
        payouts = {}
        if recs_last:            draw_recs = db(db.bills_draws_trans.shop_order_id==shop_order.id) \
      .select(orderby=~db.bills_draws_trans.id, orderby_on_limitby=False, limitby=(0,recs_last))
        else:
            draw_recs = db(
                db.bills_draws_trans.shop_order_id == shop_order.id).select()
        for r in draw_recs:
            curr = db.currs[r.curr_id]
            if not curr.abbrev in payouts:
                payouts[curr.abbrev] = []
            payouts[curr.abbrev].append({r.txid: float(r.amo)})
        res['payouts'] = payouts

    orders_lib.del_note(db, shop_order)

    return res
Exemple #26
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
    #print request.application[-5:]
    if request.application[:-3] != '_dvlp':
        # чето конфликт если из ipay3_dvlp вызывать то кошелек на ipay3 не коннектится
        import crypto_client
        cc = crypto_client.conn(curr_out, xcurr_out)
        if not cc:
            return mess(T('Connection to [%s] id lost, try lates ') % curr_out_name)
        if crypto_client.is_not_valid_addr(cc, addr_out):
            return mess(T('address not valid for ') + curr_out_name)

    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
    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 = 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('3. ' + 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, {'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)
    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'
            ),
        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'),
        T('или'), BR(),
        T('Оплатите вручную'), ': ',
        FORM( ## ВНИМАНИЕ !!! тут имена полей надр друние указывать или
            # FORM в основной делать тоже иначе они складываются
            INPUT(_name='v', value=volume_in, _class="pay_val", _readonly=''), curr_in_abbrev, BR(),
            T("Для этого скопируйте сумму и адрес (двойной клик по полю для выделения) и вставьте их в платеж на вашем кошельке"), ': ',
            INPUT(_name='addr_in', _value=addr, _class='wallet', _readonly=''), BR(),
            #T('Резервы службы'), ' ', B(free_bal), ' ', T('рублей'), BR(),
            #LOAD('where', 'for_addr', vars={'addr': addr}, 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
Exemple #27
0
def found_unconfirmed(db, curr, xcurr, addr, pays):
    #print curr.abbrev
    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
    
    confs_need = xcurr.conf

    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
    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()
                ])
Exemple #28
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
Exemple #29
0
def run_blocks(db, not_local, interval=None):
    interval = interval or 20
    print __name__, 'not_local:', not_local, ' interval:', interval
    not_local = not_local == 'True'

    period3 = interval * 3  # 30sec
    period_m1 = interval * 6  # 1 min
    period_m3 = interval * 6 * 3  # 3min
    i_p3 = period3
    i_p_m1 = period_m1
    i_p_m3 = period_m3
    ##xconns = {} # запомним на 1 раз подключения
    ### теперь это обновляется ниже но не часто print 'Select xcurrs. If new xcurr added - restart me'
    xrecs = db(
        db.xcurrs.curr_id == db.currs.id).select()  # один раз сделаем запрос
    while True:
        db.commit(
        )  # если предыдий проход с ошибклй - сохраним то что было перед нним
        print '\n', datetime.datetime.now()
        i_p3 = i_p3 + interval
        i_p_m1 = i_p_m1 + interval
        i_p_m3 = i_p_m3 + interval

        # по всем валютам обработаем блоки
        for rec in xrecs:

            if not rec.currs.used:
                # неиспользуемые будут при приходе блока обрабатываться
                # так мыж его отключили!
                continue

            ##conn = xconns.get(rec.currs.id) # из памяти попробуем взять
            conn = crypto_client.conn(rec.currs, rec.xcurrs)
            ##if not conn:
            ##     print 'try new conn to %s' % rec.currs.abbrev
            ##     conn = xconns[rec.currs.id] = crypto_client.conn(rec.currs, rec.xcurrs)
            if not conn: continue

            print rec.currs.abbrev

            # теперь блок проверим - если блок тот же то только 0-е подтвержд будут обработаны
            serv_block_proc.run_once(db, rec.currs.abbrev, None, None, conn,
                                     rec.currs, rec.xcurrs)
            # там внутри должно быть сохранение вычислено

            # так как долгие подключения к кошелькам могут быть то сохраняем для каждой крипты БД
            #db.commit()

        # теперь то что не так часто обрабатываем
        if i_p_m3 > period_m3:
            # обновим базу валют - мож там чего поменялось
            xrecs = db(db.xcurrs.curr_id ==
                       db.currs.id).select()  # один раз сделаем запрос
            # старые заказы на обмен крипты удалим
        if i_p_m1 > period_m1:
            # просроченные заказы удалим из стека и присыоим статус - EXPIRED
            orders_lib.check_expired(db)
            rates_lib.check_orders(db)

        if not_local:
            pass
        else:
            #print 'local use - skeep serv_to_buy.proc_history and clients_lib.notify'
            pass

        if Test: break

        if i_p3 > period3:
            i_p3 = 0
        if i_p_m1 > period_m1:
            i_p_m1 = 0
        if i_p_m3 > period_m3:
            i_p_m3 = 0

        print 'sleep', interval, 'sec'
        db.commit()  # перед сном созраним все
        sleep(interval)
Exemple #30
0
def check_txid(db, request):
    curr = request.args(0)
    txid = request.args(1)
    if not txid or not curr:
        return {'error': 'check_txid/[CURR]/[txid]'}

    pay_in = db(db.pay_ins.txid == txid).select().first()
    if pay_in:
        so_addr = db.shop_order_addrs[pay_in.shop_order_addr_id]
        so = db.shop_orders[so_addr.shop_order_id]
        return {'bill_id': so_addr.shop_order_id, 'status': pay_in.status}

    ## try check new txid
    time.sleep(1)
    import db_common
    curr, xcurr, ecurr = db_common.get_currs_by_abbrev(db, curr)
    if not xcurr:
        return {'error': '[CURR] not exist'}

    import crypto_client
    cn = crypto_client.conn(curr, xcurr)
    # если это транзакция не нашего кошелька то выдаст ошибку - облом для чужих
    tr = cn.gettransaction(txid)
    err = tr.get('error')
    if err:
        return err
    '''
amount	:
Decimal('0.04447648')
blockhash	:
00000000000000001744258240fa4d5dc213393cfc85e450537cd39e84865b4a
blockindex	:
0
blocktime	:
1422192344
confirmations	:
536
details	:
account	:
sh [BitRent.in] [25] [BTC]
address	:
1MfMcg8J7rKKGUNmGRvEhHCZHiqPzdAzoB
amount	:
Decimal('0.04447648')
category	:
generate
generated	:
True
hex	:
010000000100000
...
b861ad5d88ac00000000
time	:
1422192344
timereceived	:
1422192540
txid	:
3f2bf2fa360c0ceb8ff29309aad47c20cf9105769964f6c5d818d43a04062c10
walletconflicts	:
    '''
    ins = []
    vout = -1  # там сразу ++
    for r in tr['details']:
        vout += 1
        if r['category'] == 'send':
            continue

        addr = r['address']
        if not addr:
            # если адреса нет то берем его из рав-транзакции
            rawtr = cn.getrawtransaction(txid, 1)
            vouts = rawtr[u'vout']
            trans = vouts[vout]
            #print trans
            addr = trans[u'scriptPubKey'][u'addresses'][0]

        amo = r['amount']
        acc = r['account'] or cn.getaccount(addr)
        ins.append({
            'acc': acc,
            'amo': amo,
            'confs': tr[u'confirmations'],
            # запомним данные для поиска потом
            'txid': txid,
            'vout': vout,
            'addr': addr,
            'time': tr[u'time']
        })

    if len(ins) == 0:
        return {'error': 'list of inputs is empty'}
    curr_block = cn.getblockcount()
    not_ret = False  # пока без записи в БД
    from serv_block_proc import b_p_db_update
    need_commit = b_p_db_update(db, cn, curr, xcurr, ins, curr_block, not_ret)
    if not_ret:
        ## не будем пока записывать
        db.rollback()

    return dict(need_commit=need_commit, ins=ins)