def reconnect(BitPAIR, USERNAME, PASS_PHRASE): # create fresh websocket connection connected = 0 while not connected: # fetch fresh nodes list from subprocess and shuffle it nds = race_read('nodes.txt') if isinstance(nds, list): nodes = nds shuffle(nodes) node = nodes[0] try: account = Account(USERNAME, bitshares_instance=BitShares(node, num_retries=0)) market = Market(BitPAIR, bitshares_instance=BitShares(node, num_retries=0), mode='head') chain = Blockchain( bitshares_instance=BitShares(node, num_retries=0), mode='head') if chain.get_network()['chain_id'] != ID: raise ValueError('Not Mainnet Chain') connected = 1 except: pass try: market.bitshares.wallet.unlock(PASS_PHRASE) except: pass return account, market, nodes, chain
class Testcases(unittest.TestCase): def setUp(self): fixture_data() self.chain = Blockchain(mode="head") def test_is_irv(self): self.assertFalse(self.chain.is_irreversible_mode()) def test_info(self): info = self.chain.info() for i in [ "time", "dynamic_flags", "head_block_id", "head_block_number", "last_budget_time", ]: self.assertIn(i, info) def test_parameters(self): info = self.chain.chainParameters() for i in [ "worker_budget_per_day", "maintenance_interval", ]: self.assertIn(i, info) def test_network(self): info = self.chain.get_network() for i in [ "chain_id", "core_symbol", "prefix", ]: self.assertIn(i, info) def test_props(self): info = self.chain.get_chain_properties() for i in [ "id", "chain_id", "immutable_parameters", ]: self.assertIn(i, info) def test_block_num(self): num = self.chain.get_current_block_num() self.assertTrue(num > 100) def test_block(self): block = self.chain.get_current_block() self.assertIsInstance(block, Block) self.chain.block_time(1) self.chain.block_timestamp(1) def test_list_accounts(self): for account in self.chain.get_all_accounts(): self.assertIsInstance(account, str) # Break already break
def ping(n, num, arr): # ping the blockchain and return latency try: start = time.time() chain = Blockchain(bitshares_instance=BitShares(n, num_retries=0), mode='head') # print(n,chain.rpc.chain_params["chain_id"]) ping_latency = time.time() - start current_block = chain.get_current_block_num() blocktimestamp = abs( chain.block_timestamp(current_block)) # + utc_offset) block_latency = time.time() - blocktimestamp # print (blocktimestamp) # print (time.time()) # print (block_latency) # print (ping_latency) # print (time.ctime()) # print (utc_offset) # print (chain.get_network()) if chain.get_network()['chain_id'] != ID: num.value = 333333 elif block_latency < (ping_latency + 4): num.value = ping_latency else: num.value = 111111 except: num.value = 222222 pass
def reconnect(): global account, market, nodes, chain, pings try: history_text.delete("1.0", "end") history_text.insert(END, '\n\n CONNECTING...') master.update() except: pass print(cyan(time.ctime() + ' CONNECTING...')) start = time.time() # create fresh websocket connection connected = 0 while not connected: # fetch fresh nodes list from subprocess and shuffle it metaNODE = Bitshares_Trustless_Client() nds = metaNODE['whitelist'] del metaNODE if isinstance(nds, list): nodes = nds shuffle(nodes) node = nodes[0] print(green(node)) pings = [0] try: account = Account(USERNAME, bitshares_instance=BitShares(nodes, num_retries=2)) market = Market(BitPAIR, bitshares_instance=BitShares(nodes, num_retries=2), mode='head') chain = Blockchain(bitshares_instance=BitShares(nodes, num_retries=2), mode='head') if chain.get_network()['chain_id'] != ID: raise ValueError('Not Mainnet Chain') connected = 1 except Exception as e: try: history_text.insert(END, '\n\n RECONNECTING...') master.update() except: pass msg = (time.ctime() + str(type(e).__name__) + str(e.args)) print('RECONNECTING ' + msg) pass try: market.bitshares.wallet.unlock(PASS_PHRASE) except: # print('YOUR WALLET IS LOCKED') pass print('CONNECTION ELAPSED: ', ('%.1f' % (time.time() - start)))
def get_network(api_key: hug.types.text, request, hug_timer=5): """Bitshares current chain network!""" if (check_api_token(api_key) == True): # Check the api key # API KEY VALID google_analytics(request, 'get_network') chain = Blockchain() chain_get_network = chain.get_network() return {'get_network': chain_get_network, 'valid_key': True, 'took': float(hug_timer)} else: # API KEY INVALID! return {'valid_key': False, 'took': float(hug_timer)}
def main(): global stopwatch, USERNAME, BitPAIR, PASS_PHRASE global master, lock global header_text, bid_text, ask_text, history_text, orders_text global update_id, ping, pings, account_text global account, market, nodes, chain global buy_price, buy_amount, sell_price, sell_amount, login colors() race_write(doc='microDEX_log.txt', text=time.ctime()) stopwatch = time.time() print("\033c") sys.stdout.write('\x1b]2;' + 'Bitshares microDEX' + '\x07') # terminal #title # Encoded Compressed Bitshares ASCII Logo b = b'x\x9c\xad\xd4M\n\xc4 \x0c\x05\xe0}O1P\x12B\x10\xbc\x82\xf7?\xd5\xf8\xaf\x83F\xe3\xe0[t\xf9\xf5%\xda>\x9f\x1c\xf7\x7f\x9e\xb9\x01\x17\x0cc\xec\x05\xe3@Y\x18\xc6(\'Z\x1a\xca.\x1bC\xa5l\r\x85\xa20\xb6\x8a\xca\xd8,W0\xec\x05\xc3\xdf\xd4_\xe3\r\x11(q\x16\xec\x95l\x04\x06\x0f\x0c\xc3\xddD\x9dq\xd2#\xa4NT\x0c/\x10\xd1{b\xd4\x89\x92\x91\x84\x11\xd9\x9d-\x87.\xe4\x1cB\x15|\xe0\xc8\x88\x13\xa5\xbc\xd4\xa21\x8e"\x18\xdc\xd2\x0e\xd3\xb6\xa0\xc6h\xa3\xd4\xde\xd0\x19\x9a\x1e\xd8\xddr\x0e\xcf\xf8n\xe0Y\rq\x1fP:p\x92\xf2\xdbaB,v\xda\x84j\xc4.\x03\xb1>\x97\xee{\x99oSa\x00\x0f\xc6\x84\xd8\xdf\x0f\xb4e\xa7$\xfdE\xae\xde\xb1/\x1d\xfc\x96\x8a' print(cyan(zlib.decompress(b).decode())) print( blue(''' ______ ________ ____ ____ (_ _ `.(_ __ |(_ _)(_ _) __ __ ____ ___ ____ ___ | | `. \ | |_ \_| \ \__/ / ( \/ )(_ _)/ __)( _ \ / _ \ | | | | | _) _ ) __ ( ) ( _||_( (__ ) /( (_) ) _| |_.' /_| |__/ | _/ / \ \_ (_/\/\_)(____)\___)(_)\_) \___/ (______.'(________|(____)(____) =================================================================== ''')) print(cyan(' Bitshares Minimalist UI ' + VERSION)) print( blue(''' =================================================================== ''')) time.sleep(0.3) print(cyan('GATHERING live curated DEX data from the metaNODE...')) time.sleep(0.3) try: metaNODE = Bitshares_Trustless_Client() nodes = metaNODE['whitelist'] account_name = metaNODE['account_name'] asset = metaNODE['asset'] currency = metaNODE['currency'] del metaNODE print('') print(' metaNODE = Bitshares_Trustless_Client()') except: raise ValueError('metaNODE not found') print('') time.sleep(0.3) print(cyan('CHOOSING whitelisted public API...')) time.sleep(0.3) print('') print(' ' + green(nodes[0])) print('') print(cyan('CONNECTING to DEX account...')) print('') valid = 0 while not valid: try: USERNAME = account_name account = Account(USERNAME, bitshares_instance=BitShares(nodes, num_retries=5)) valid = 1 except Exception as e: print(type(e).__name__, 'try again...') pass print(' Welcome Back: ', green(USERNAME), blue(str(account))) print('') print(cyan('CONNECTING to DEX market...')) valid = 0 while not valid: try: BitPAIR = asset + ':' + currency BitASSET = BitPAIR.split(':')[0] BitCURRENCY = BitPAIR.split(':')[1] market = Market(BitPAIR, bitshares_instance=BitShares(nodes, num_retries=5), mode='head') valid = 1 except Exception as e: print(type(e).__name__, 'try again...') pass print('') print(' You are Trading: ', green(BitPAIR)) print('') print( yellow( 'Enter PASS PHRASE below to AUTHENTICATE or press ENTER to skip')) print(red(' YOU SHOULD UNDERSTAND THE SCRIPT BEFORE ENTERING PASS PHRASE')) print('') valid = 0 default = '' while not valid: try: PASS_PHRASE = getpass(prompt=' PASS PHRASE: ') or default print("\033[F PASS PHRASE: " + green('********************************')) if PASS_PHRASE != '': print('') print(cyan('AUTHENTICATING to DEX wallet...')) market.bitshares.wallet.unlock(PASS_PHRASE) print('') print(red('*****************')) print( red('**AUTHENTICATED**') + yellow(' YOUR WALLET IS UNLOCKED')) print(red('*****************')) valid = 1 else: print('') print(yellow('SKIP AUTHENTICATION - YOUR WALLET IS LOCKED')) valid = 1 except Exception as e: print(type(e).__name__, 'try again...') pass time.sleep(0.3) print('') print(cyan('VALIDATING mainnet DEX chain...')) print('') chain = Blockchain(bitshares_instance=BitShares(nodes, num_retries=5), mode='head') chain_id = chain.get_network()['chain_id'] if chain_id != ID: print(cyan('INVALID CHAIN reconnecting...')) reconnect() print(' BITSHARES MAINNET: ', blue(chain_id)) print('') time.sleep(0.3) print(cyan('LAUNCHING microDEX user interface...')) master = Tk() # master.geometry("650x950") master['bg'] = '#262626' master.title('microDEX - Bitshares Minimalist UI') elapsed('master') lock = StringVar() lock.set('AUTHENTICATED') if market.bitshares.wallet.locked(): lock.set('WALLET LOCKED') elapsed('lock') header_text = Text(master, height=5, width=90, fg=blue2, bg=gray3) header_text.insert(END, '') header_text.grid(row=0, column=0, columnspan=4) bid_text = Text(master, height=30, width=45, fg=green1, bg=gray3) bid_text.insert(END, '') bid_text.grid(row=1, column=0, columnspan=2) bid_text.tag_configure("right", justify="right") bid_text.tag_configure("left", justify="left") ask_text = Text(master, height=30, width=45, fg=red1, bg=gray3) ask_text.insert(END, '') ask_text.grid(row=1, column=2, columnspan=2) orders_text = Text(master, height=11, width=45, fg=yellow1, bg=gray3) orders_text.insert(END, '') orders_text.grid(row=2, column=0, columnspan=2) history_text = Text(master, height=11, width=45, fg=gray1, bg=gray3) history_text.insert(END, '') history_text.grid(row=2, column=2, columnspan=2) account_text = Text(master, height=4, width=90, fg=blue1, bg=gray3) account_text.insert(END, '') account_text.grid(row=3, columnspan=4) elapsed('wireframe') Label(master, text="PRICE:", fg=gray1, bg=gray3).grid(row=4, column=0, sticky=E) Label(master, text="AMOUNT:", fg=gray1, bg=gray3).grid(row=5, column=0, sticky=E) Label(master, text="PRICE:", fg=gray1, bg=gray3).grid(row=4, column=2, sticky=E) Label(master, text="AMOUNT:", fg=gray1, bg=gray3).grid(row=5, column=2, sticky=E) Label(master, text="litepresence2018", fg=gray2, bg=gray3).grid(row=9, column=3, sticky=SE) Label(master, text= " *ORDERS TAKE A FEW SECONDS TO APPEAR; CLICK ONCE, THEN CONFIRM*", fg='#C0C0C0', bg='#262626').grid(row=9, column=0, columnspan=4, sticky=W) try: # add bitshares logo to gui via imgur def downloadImage(imageUrl, localFileName): response = requests.get(imageUrl) with open(localFileName, 'wb') as fo: for chunk in response.iter_content(4096): fo.write(chunk) try: photo = PhotoImage(file="bitshares_logo.gif") except: downloadImage('https://i.imgur.com/fvCE86Z.gif', 'bitshares_logo.gif') photo = PhotoImage(file="bitshares_logo.gif") label = Label(image=photo) label.image = photo label.grid(row=0, column=3, sticky=E) except: pass buy_price = Entry(master, fg=gray1, bg=gray2) buy_amount = Entry(master, fg=gray1, bg=gray2) sell_price = Entry(master, fg=gray1, bg=gray2) sell_amount = Entry(master, fg=gray1, bg=gray2) login = Entry(master, fg=gray1, bg=gray2) buy_price.grid(row=4, column=1) buy_amount.grid(row=5, column=1) sell_price.grid(row=4, column=3) sell_amount.grid(row=5, column=3) login.grid(row=8, column=1) elapsed('entry') Button(master, text='BUY', command=dex_buy, fg=gray1, bg=gray3, activebackground=green2, highlightbackground=green1).grid( row=7, column=1, # sticky=E, pady=4) Button(master, text='SELL', command=dex_sell, fg=gray1, bg=gray3, activebackground=red2, highlightbackground=red1).grid( row=7, column=3, # sticky=E, pady=4) Button(master, text='CANCEL ALL', command=dex_cancel, fg=gray1, bg=gray3, activebackground=yellow2, highlightbackground=yellow1).grid(row=7, column=0, sticky=E, pady=4) Button(master, text='LOCK/UNLOCK', command=dex_auth_gui, fg=gray1, bg=gray3, activebackground=blue2, highlightbackground=blue1).grid(row=8, column=0, sticky=E, pady=4) elapsed('button') Button(master, text='SWITCH NODE', command=switch, fg=gray1, bg=gray3, activebackground=blue2, highlightbackground=blue1).grid(row=8, column=3, sticky=E, pady=4) elapsed('button') update_id = 0 ping = 0 pings = [0] print( blue(''' =================================================================== ''')) print(cyan(' ' + time.ctime())) print( blue(''' =================================================================== ''')) print('') master.geometry('+9999+9999') master.after(1, update) master.mainloop()
class Testcases(unittest.TestCase): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.bts = BitShares( "wss://node.testnet.bitshares.eu", nobroadcast=True, ) self.bts.set_default_account("init0") set_shared_bitshares_instance(self.bts) self.chain = Blockchain(mode="head") def test_is_irv(self): self.assertFalse(self.chain.is_irreversible_mode()) def test_info(self): info = self.chain.info() for i in [ "time", "dynamic_flags", "head_block_id", "head_block_number", "last_budget_time" ]: self.assertIn(i, info) def test_parameters(self): info = self.chain.chainParameters() for i in [ "worker_budget_per_day", "maintenance_interval", ]: self.assertIn(i, info) def test_network(self): info = self.chain.get_network() for i in [ "chain_id", "core_symbol", "prefix", ]: self.assertIn(i, info) def test_props(self): info = self.chain.get_chain_properties() for i in [ "id", "chain_id", "immutable_parameters", ]: self.assertIn(i, info) def test_block_num(self): num = self.chain.get_current_block_num() self.assertTrue(num > 100) def test_block(self): block = self.chain.get_current_block() self.assertIsInstance(block, Block) self.chain.block_time(1) self.chain.block_timestamp(1) def test_list_accounts(self): for account in self.chain.get_all_accounts(): self.assertIsInstance(account, str) # Break already break