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
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
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
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 }
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
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))
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'))
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)
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 }
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'
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)
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
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
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
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))
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
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')}
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
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
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
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
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
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')
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
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
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() ])
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
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)
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)