Advertisement
Guest User

Ifinas by kpac

a guest
Jul 21st, 2019
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 16.38 KB | None | 0 0
  1. from web3 import Web3
  2. from web3.providers.websocket import WebsocketProvider
  3. from eth_account import Account
  4. import tkinter as tk
  5. import tkinter.filedialog as tkf
  6. import tkinter.messagebox as tkm
  7. from tkinter import ttk
  8. import json
  9. import requests
  10. import pyqrcode
  11.  
  12.  
  13. class Main(ttk.Frame):
  14.  
  15.     def __init__(self, root):
  16.         super().__init__(root)
  17.         self.init_main()
  18.  
  19.     def init_main(self):
  20.         global encrypted_key, ether, ruble
  21.         encrypted_key = None
  22.         ether = 0
  23.         ruble = 0
  24.  
  25.         self.main_menu = tk.Menu(root)
  26.         root.configure(menu=self.main_menu)
  27.         self.first_item = tk.Menu(self.main_menu, tearoff=0)
  28.         self.second_item = tk.Menu(self.main_menu, tearoff=0)
  29.         self.third_item = tk.Menu(self.main_menu, tearoff=0)
  30.         self.forth_item = tk.Menu(self.main_menu, tearoff=0)
  31.         self.fifth_item = tk.Menu(self.main_menu, tearoff=0)
  32.  
  33.         self.main_menu.add_cascade(label='Аккаунт', menu=self.first_item)
  34.         self.first_item.add_command(label="Создать", command=self.crt)
  35.         self.first_item.add_separator()
  36.         self.first_item.add_command(label="Импорт закрытого ключа", command=self.imkey)
  37.         self.first_item.add_command(label="Импорт из файла", command=self.imfile)
  38.         self.first_item.add_separator()
  39.         self.first_item.add_command(label="Экспорт закрытого ключа", command=self.exkey)
  40.         self.first_item.add_command(label="Экспорт в файл", command=self.exfile)
  41.  
  42.         self.main_menu.add_cascade(label="Сеть", menu=self.second_item)
  43.         self.second_item.add_command(label="Mainnet", command=self.mnn)
  44.         self.second_item.add_command(label="Ropsten", command=self.rps)
  45.  
  46.         self.main_menu.add_cascade(label="Информация", menu=self.third_item)
  47.         self.third_item.add_command(label="О программе", command=self.shinfo)
  48.  
  49.         self.main_menu.add_cascade(menu=self.forth_item, label=" ")
  50.  
  51.         self.main_menu.add_cascade(menu=self.fifth_item, label=" ")
  52.  
  53.         # Рабочее окно
  54.  
  55.         self.uadr = ttk.Label(root, text="Ваш адрес:")
  56.         self.uadr.grid(row=0, column=0)
  57.  
  58.         self.adr = ttk.Label(root, text="Создайте аккаунт")
  59.         self.adr.grid(row=1, column=0, columnspan=2)
  60.  
  61.         self.balans = ttk.Label(root, text="Баланс:")
  62.         self.balans.grid(row=0, column=3)
  63.  
  64.         self.baleth = ttk.Label(root)
  65.         self.baleth.grid(row=1, column=3)
  66.  
  67.         self.copyadr = ttk.Button(root, text='Скопировать')
  68.         self.copyadr.grid(row=2, column=0)
  69.         self.copyadr.bind("<Button-1>", self.coadr)
  70.  
  71.         self.shqr = ttk.Button(root, text='Показать QRcode')
  72.         self.shqr.grid(row=2, column=1)
  73.         self.shqr.bind("<Button-1>", self.shqrco)
  74.  
  75.         self.setr = ttk.Label(root, text="Отправить транзакцию на адрес:")
  76.         self.setr.grid(row=3, column=1, columnspan=2)
  77.  
  78.         self.seadr = ttk.Entry(root, width=49)
  79.         self.seadr.grid(row=4, column=1, columnspan=2)
  80.  
  81.         self.seeth = ttk.Label(root, text="ETH:", width=9, anchor="center")
  82.         self.seeth.grid(row=5, column=1, sticky='w')
  83.  
  84.         self.senteth = ttk.Entry(root, width=15)
  85.         self.senteth.grid(row=5, column=1, sticky='e')
  86.         self.senteth.insert(0, ether)
  87.  
  88.         self.serub = ttk.Label(root, text="RUB:", width=9, anchor="center")
  89.         self.serub.grid(row=5, column=2, sticky='w')
  90.  
  91.         self.senrub = ttk.Entry(root, width=15)
  92.         self.senrub.grid(row=5, column=2, sticky='e')
  93.         self.senrub.insert(0, ruble)
  94.  
  95.         self.komiseth = ttk.Label(root)
  96.         self.komiseth.grid(row=6, column=1, columnspan=2)
  97.  
  98.         self.sentr = ttk.Button(root, text='Отправить')
  99.         self.sentr.grid(row=7, column=1, columnspan=2)
  100.         self.sentr.bind("<Button-1>", self.setrx)
  101.  
  102.         self.lhash = ttk.Label(root)
  103.         self.lhash.grid(row=8, column=1, columnspan=2)
  104.  
  105.         self.shtr = ttk.Label(root)
  106.         self.shtr.grid(row=9, column=0, columnspan=3)
  107.  
  108.         self.infhash = ttk.Label(root)
  109.         self.infhash.grid(row=9, column=3)
  110.  
  111.         col_count, row_count = root.grid_size()
  112.  
  113.         for col in range(col_count):
  114.             root.grid_columnconfigure(col, minsize=150)
  115.  
  116.         for row in range(row_count):
  117.             root.grid_rowconfigure(row, minsize=30)
  118.  
  119.     def shinfo(self):
  120.         tkm.showinfo("О программе",
  121.                      "Программу разработал студент группы АБ-37 Красильников Алексей Петрович в качестве приложения"
  122.                      " к дипломной работе <<Защищённая клиентская модель функционирования криптовллют>>")
  123.  
  124.     def coadr(self, event):
  125.         if encrypted_key is not None:
  126.             self.clipboard_clear()
  127.             self.clipboard_append(Web3.toChecksumAddress(encrypted_key["address"]))
  128.  
  129.     def shqrco(self, event):
  130.         if encrypted_key is not None:
  131.             Showqrcode()
  132.  
  133.     def mnn(self):
  134.  
  135.         global web3, ChID, gasprice, trxs, rub
  136.  
  137.         trxs = None
  138.         url = 'https://api.coinmarketcap.com/v2/ticker/1027/?convert=RUB'
  139.         rub = requests.get(url).json()['data']['quotes']['RUB']['price']
  140.  
  141.         web3 = Web3(WebsocketProvider('wss://mainnet.infura.io/ws'))
  142.         self.main_menu.entryconfigure(index=4, label="Mainnet")
  143.         self.main_menu.entryconfigure(index=5)
  144.         gasprice = web3.eth.gasPrice
  145.         self.komiseth.configure(text="Комиссия: " + str(Web3.fromWei(21000 * gasprice, "ether")) + " Eth")
  146.  
  147.         ChID = 1
  148.  
  149.     def rps(self):
  150.  
  151.         global web3, ChID, gasprice, trxs, rub
  152.  
  153.         trxs = None
  154.  
  155.         rub = 0
  156.  
  157.         web3 = Web3(WebsocketProvider('wss://ropsten.infura.io/ws'))
  158.         self.main_menu.entryconfigure(index=4, label="Ropsten")
  159.         self.main_menu.entryconfigure(index=5)
  160.         gasprice = web3.eth.gasPrice
  161.         self.komiseth.configure(text="Комиссия: " + str(Web3.fromWei(21000 * gasprice, "ether")) + " Eth")
  162.         ChID = 3
  163.  
  164.     def rfs(self):
  165.  
  166.         global ether, ruble
  167.  
  168.         try:
  169.             self.main_menu.entryconfigure(index=5, label=web3.eth.blockNumber)
  170.         except:
  171.             self.rps()
  172.  
  173.         if encrypted_key is not None:
  174.             address = Web3.toChecksumAddress(encrypted_key["address"])
  175.             self.adr.configure(text=address)
  176.             self.baleth.configure(text=str(round(Web3.fromWei(web3.eth.getBalance(address), "ether"), 8)) + " Eth")
  177.  
  178.         if trxs is not None:
  179.             if web3.eth.getTransaction(trxs)['blockNumber'] is not None:
  180.                 self.infhash.configure(text="Отправлено", foreground="green")
  181.             else:
  182.                 self.infhash.configure(text="В очереди", foreground="red")
  183.  
  184.         if self.senteth.get():
  185.             if self.senteth.get() != ether:
  186.                 try:
  187.                     self.senrub.delete(0, 'end')
  188.                     self.senrub.insert(0, round(float(self.senteth.get()) * rub, 2))
  189.                     ether = self.senteth.get()
  190.                     ruble = self.senrub.get()
  191.                 except:
  192.                     pass
  193.  
  194.         if self.senrub.get() and rub != 0:
  195.             if self.senrub.get() != ruble:
  196.                 try:
  197.                     self.senteth.delete(0, 'end')
  198.                     self.senteth.insert(0, round(float(self.senrub.get()) / rub, 8))
  199.                     ruble = self.senrub.get()
  200.                     ether = self.senteth.get()
  201.                 except:
  202.                     pass
  203.  
  204.         root.after(500, self.rfs)
  205.  
  206.     def crt(self):
  207.         Crnew()
  208.  
  209.     def imkey(self):
  210.         Impkey()
  211.  
  212.     def imfile(self):
  213.  
  214.         global encrypted_key
  215.  
  216.         of = tkf.askopenfilename()
  217.         if of:
  218.             try:
  219.                 with open(of, 'r') as keyfile:
  220.                     encrypted_key = json.loads(keyfile.read())
  221.  
  222.                 try:
  223.                     web3.eth.getBalance(Web3.toChecksumAddress(encrypted_key["address"]))
  224.                 except:
  225.                     tkm.showerror("Ошибка", "Выбран неверный файл")
  226.             except:
  227.                 tkm.showerror("Ошибка", "Выбран неверный файл")
  228.  
  229.     def exkey(self):
  230.  
  231.         if encrypted_key is not None:
  232.             Expkey()
  233.  
  234.         else:
  235.             tkm.showerror("Ошибка", "Создайте аккаунт")
  236.  
  237.     def exfile(self):
  238.  
  239.         if encrypted_key is not None:
  240.  
  241.             sf = tkf.asksaveasfilename()
  242.  
  243.             if sf:
  244.                 with open(sf, 'w') as f:
  245.                     f.write(json.dumps(encrypted_key))
  246.  
  247.         else:
  248.             tkm.showerror("Ошибка", "Создайте аккаунт")
  249.  
  250.     def setrx(self, event):
  251.  
  252.         if encrypted_key is not None:
  253.  
  254.             if web3.isAddress(self.seadr.get()):
  255.                 try:
  256.                     sencn = web3.eth.getBalance(Web3.toChecksumAddress(encrypted_key["address"]))
  257.                     sento = web3.toWei(self.senteth.get(), 'ether') + gasprice * 21000
  258.                     if sento <= sencn:
  259.                         Sentrx()
  260.                     else:
  261.                         tkm.showerror("Ошибка", "Недостаточно средств")
  262.                 except:
  263.                     tkm.showerror("Ошибка", "Введите сумму")
  264.             else:
  265.  
  266.                 tkm.showerror("Ошибка", "Неверный адресс")
  267.         else:
  268.  
  269.             tkm.showerror("Ошибка", "Создайте аккаунт")
  270.  
  271.  
  272. class Showqrcode(tk.Toplevel):
  273.     def __init__(self):
  274.         super().__init__(root)
  275.         self.init_showqrcode()
  276.  
  277.     def init_showqrcode(self):
  278.  
  279.         self.title("QRcode")
  280.         self.geometry("+850+350")
  281.         self.resizable(False, False)
  282.  
  283.         address = Web3.toChecksumAddress(encrypted_key["address"])
  284.  
  285.         code = pyqrcode.create(str(address))
  286.         code_xbm = code.xbm(scale=8)
  287.  
  288.         self.code_bmp = tk.BitmapImage(data=code_xbm)
  289.         self.code_bmp.config(background="white")
  290.         self.label = tk.Label(self, image=self.code_bmp)
  291.         self.label.pack()
  292.  
  293.  
  294. class Crnew(tk.Toplevel):
  295.     def __init__(self):
  296.         super().__init__(root)
  297.         self.init_crnew()
  298.  
  299.     def init_crnew(self):
  300.         self.title('Создание аккаунта')
  301.         self.geometry('+850+350')
  302.         self.resizable(False, False)
  303.  
  304.         self.entpass = ttk.Entry(self, show="*")
  305.         self.entpass.grid(row=1, column=0)
  306.  
  307.         self.entcheck = ttk.Entry(self, show="*")
  308.         self.entcheck.grid(row=3, column=0)
  309.  
  310.         self.askpass = ttk.Label(self, text='Введите пароль:')
  311.         self.askpass.grid(row=0, column=0)
  312.  
  313.         self.askcheck = ttk.Label(self, text='Повторите пароль:')
  314.         self.askcheck.grid(row=2, column=0)
  315.  
  316.         self.creak = ttk.Button(self, text='Создать аккаунт')
  317.         self.creak.grid(row=4, column=0)
  318.         self.creak.bind("<Button-1>", self.crn)
  319.  
  320.         self.grab_set()
  321.         self.focus_set()
  322.  
  323.     def crn(self, event):
  324.  
  325.         if self.entpass.get() == self.entcheck.get():
  326.  
  327.             global encrypted_key
  328.  
  329.             encrypted_key = Account.encrypt(Account.create(self.entpass.get()).privateKey, self.entpass.get())
  330.  
  331.             self.destroy()
  332.         else:
  333.             self.askcheck.configure(text="Неверный пароль:", foreground="red")
  334.  
  335.  
  336. class Impkey(tk.Toplevel):
  337.  
  338.     def __init__(self):
  339.         super().__init__(root)
  340.         self.init_impkey()
  341.  
  342.     def init_impkey(self):
  343.  
  344.         self.title('Импорт из закрытого ключа')
  345.         self.geometry('+850+350')
  346.         self.resizable(False, False)
  347.  
  348.         self.askkey = ttk.Label(self, text='Введите закрытый ключ:')
  349.         self.askkey.grid(row=0, column=0)
  350.  
  351.         self.entkey = ttk.Entry(self, show="*", width=55)
  352.         self.entkey.grid(row=1, column=0)
  353.  
  354.         self.entpass = ttk.Entry(self, show="*")
  355.         self.entpass.grid(row=3, column=0)
  356.  
  357.         self.entcheck = ttk.Entry(self, show="*")
  358.         self.entcheck.grid(row=5, column=0)
  359.  
  360.         self.askpass = ttk.Label(self, text='Введите пароль:')
  361.         self.askpass.grid(row=2, column=0)
  362.  
  363.         self.askcheck = ttk.Label(self, text='Повторите пароль:')
  364.         self.askcheck.grid(row=4, column=0)
  365.  
  366.         self.imp = ttk.Button(self, text='Импорт')
  367.         self.imp.grid(row=6, column=0)
  368.         self.imp.bind("<Button-1>", self.imk)
  369.  
  370.         self.grab_set()
  371.         self.focus_set()
  372.  
  373.     def imk(self, event):
  374.  
  375.         global encrypted_key
  376.  
  377.         try:
  378.  
  379.             if self.entpass.get() == self.entcheck.get():
  380.  
  381.                 encrypted_key = Account.encrypt(self.entkey.get(), self.entpass.get())
  382.  
  383.                 self.destroy()
  384.  
  385.             else:
  386.                 self.askcheck.configure(text="Неверный пароль:", foreground="red")
  387.  
  388.         except Exception:
  389.  
  390.             self.askkey.configure(text="Введите корректный ключ:", foreground="red")
  391.  
  392.  
  393. class Expkey(tk.Toplevel):
  394.  
  395.     def __init__(self):
  396.         super().__init__(root)
  397.         self.init_expkey()
  398.  
  399.     def init_expkey(self):
  400.  
  401.         self.title('Экспорт закрытого ключа')
  402.         self.geometry("+850+350")
  403.         self.resizable(False, False)
  404.  
  405.         self.askpass = ttk.Label(self, text='Введите пароль:')
  406.         self.askpass.grid(row=0, column=0)
  407.  
  408.         self.entkey = ttk.Entry(self, show="*", width=20)
  409.         self.entkey.grid(row=1, column=0)
  410.  
  411.         self.imp = ttk.Button(self, text='Получить закрытый ключ')
  412.         self.imp.grid(row=2, column=0)
  413.         self.imp.bind("<Button-1>", self.expk)
  414.  
  415.         self.prk = tk.Text(self, width=66, height=1, borderwidth=0)
  416.         self.prk.grid(row=3, column=0)
  417.  
  418.         self.grab_set()
  419.         self.focus_set()
  420.  
  421.     def expk(self, event):
  422.  
  423.         try:
  424.             global encrypted_key
  425.  
  426.             self.prk.insert(1.0, Account._parsePrivateKey(Account.decrypt(encrypted_key, self.entkey.get())))
  427.  
  428.  
  429.         except ValueError:
  430.  
  431.             self.askpass.configure(text="Неверный пароль:", foreground="red")
  432.  
  433.  
  434. class Sentrx(tk.Toplevel):
  435.  
  436.     def __init__(self):
  437.         super().__init__(root)
  438.         self.init_sentrx()
  439.  
  440.     def init_sentrx(self):
  441.  
  442.         self.title('Отправление транзакции')
  443.         self.geometry("+850+350")
  444.         self.resizable(False, False)
  445.  
  446.         self.askpass = ttk.Label(self, text='Введите пароль:')
  447.         self.askpass.grid(row=0, column=0)
  448.  
  449.         self.enkey = ttk.Entry(self, show="*", width=20)
  450.         self.enkey.grid(row=1, column=0)
  451.  
  452.         self.imp = ttk.Button(self, text='Отправить')
  453.         self.imp.grid(row=2, column=0)
  454.         self.imp.bind("<Button-1>", self.chk)
  455.  
  456.         self.grab_set()
  457.         self.focus_set()
  458.  
  459.     def chk(self, event):
  460.  
  461.         global encrypted_key, gasprice, ChID, trxs
  462.  
  463.         try:
  464.  
  465.             transaction = {'to': app.seadr.get(),
  466.                            'value': web3.toWei(app.senteth.get(), 'ether'),
  467.                            'gas': 21000,
  468.                            'gasPrice': gasprice,
  469.                            'nonce': web3.eth.getTransactionCount(Web3.toChecksumAddress(encrypted_key["address"])),
  470.                            'chainId': ChID
  471.                            }
  472.  
  473.             signed = Account.signTransaction(transaction,
  474.                                              Account._parsePrivateKey(Account.decrypt(encrypted_key, self.enkey.get())))
  475.  
  476.             web3.eth.sendRawTransaction(signed.rawTransaction)
  477.  
  478.             trxs = Web3.toHex(signed['hash'])
  479.  
  480.             app.shtr.configure(text=trxs)
  481.             app.lhash.configure(text="Хэш транзакции:")
  482.  
  483.             self.destroy()
  484.  
  485.  
  486.         except ValueError:
  487.  
  488.             self.askpass.configure(text="Неверный пароль:", foreground="red")
  489.  
  490.  
  491. if __name__ == "__main__":
  492.     root = tk.Tk()
  493.     app = Main(root)
  494.     root.title("Ifinas")
  495.     root.geometry("+800+300")
  496.     root.resizable(False, False)
  497.     root.after(1000, app.rfs)
  498.     root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement