Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from web3 import Web3
- from web3.providers.websocket import WebsocketProvider
- from eth_account import Account
- import tkinter as tk
- import tkinter.filedialog as tkf
- import tkinter.messagebox as tkm
- from tkinter import ttk
- import json
- import requests
- import pyqrcode
- class Main(ttk.Frame):
- def __init__(self, root):
- super().__init__(root)
- self.init_main()
- def init_main(self):
- global encrypted_key, ether, ruble
- encrypted_key = None
- ether = 0
- ruble = 0
- self.main_menu = tk.Menu(root)
- root.configure(menu=self.main_menu)
- self.first_item = tk.Menu(self.main_menu, tearoff=0)
- self.second_item = tk.Menu(self.main_menu, tearoff=0)
- self.third_item = tk.Menu(self.main_menu, tearoff=0)
- self.forth_item = tk.Menu(self.main_menu, tearoff=0)
- self.fifth_item = tk.Menu(self.main_menu, tearoff=0)
- self.main_menu.add_cascade(label='Аккаунт', menu=self.first_item)
- self.first_item.add_command(label="Создать", command=self.crt)
- self.first_item.add_separator()
- self.first_item.add_command(label="Импорт закрытого ключа", command=self.imkey)
- self.first_item.add_command(label="Импорт из файла", command=self.imfile)
- self.first_item.add_separator()
- self.first_item.add_command(label="Экспорт закрытого ключа", command=self.exkey)
- self.first_item.add_command(label="Экспорт в файл", command=self.exfile)
- self.main_menu.add_cascade(label="Сеть", menu=self.second_item)
- self.second_item.add_command(label="Mainnet", command=self.mnn)
- self.second_item.add_command(label="Ropsten", command=self.rps)
- self.main_menu.add_cascade(label="Информация", menu=self.third_item)
- self.third_item.add_command(label="О программе", command=self.shinfo)
- self.main_menu.add_cascade(menu=self.forth_item, label=" ")
- self.main_menu.add_cascade(menu=self.fifth_item, label=" ")
- # Рабочее окно
- self.uadr = ttk.Label(root, text="Ваш адрес:")
- self.uadr.grid(row=0, column=0)
- self.adr = ttk.Label(root, text="Создайте аккаунт")
- self.adr.grid(row=1, column=0, columnspan=2)
- self.balans = ttk.Label(root, text="Баланс:")
- self.balans.grid(row=0, column=3)
- self.baleth = ttk.Label(root)
- self.baleth.grid(row=1, column=3)
- self.copyadr = ttk.Button(root, text='Скопировать')
- self.copyadr.grid(row=2, column=0)
- self.copyadr.bind("<Button-1>", self.coadr)
- self.shqr = ttk.Button(root, text='Показать QRcode')
- self.shqr.grid(row=2, column=1)
- self.shqr.bind("<Button-1>", self.shqrco)
- self.setr = ttk.Label(root, text="Отправить транзакцию на адрес:")
- self.setr.grid(row=3, column=1, columnspan=2)
- self.seadr = ttk.Entry(root, width=49)
- self.seadr.grid(row=4, column=1, columnspan=2)
- self.seeth = ttk.Label(root, text="ETH:", width=9, anchor="center")
- self.seeth.grid(row=5, column=1, sticky='w')
- self.senteth = ttk.Entry(root, width=15)
- self.senteth.grid(row=5, column=1, sticky='e')
- self.senteth.insert(0, ether)
- self.serub = ttk.Label(root, text="RUB:", width=9, anchor="center")
- self.serub.grid(row=5, column=2, sticky='w')
- self.senrub = ttk.Entry(root, width=15)
- self.senrub.grid(row=5, column=2, sticky='e')
- self.senrub.insert(0, ruble)
- self.komiseth = ttk.Label(root)
- self.komiseth.grid(row=6, column=1, columnspan=2)
- self.sentr = ttk.Button(root, text='Отправить')
- self.sentr.grid(row=7, column=1, columnspan=2)
- self.sentr.bind("<Button-1>", self.setrx)
- self.lhash = ttk.Label(root)
- self.lhash.grid(row=8, column=1, columnspan=2)
- self.shtr = ttk.Label(root)
- self.shtr.grid(row=9, column=0, columnspan=3)
- self.infhash = ttk.Label(root)
- self.infhash.grid(row=9, column=3)
- col_count, row_count = root.grid_size()
- for col in range(col_count):
- root.grid_columnconfigure(col, minsize=150)
- for row in range(row_count):
- root.grid_rowconfigure(row, minsize=30)
- def shinfo(self):
- tkm.showinfo("О программе",
- "Программу разработал студент группы АБ-37 Красильников Алексей Петрович в качестве приложения"
- " к дипломной работе <<Защищённая клиентская модель функционирования криптовллют>>")
- def coadr(self, event):
- if encrypted_key is not None:
- self.clipboard_clear()
- self.clipboard_append(Web3.toChecksumAddress(encrypted_key["address"]))
- def shqrco(self, event):
- if encrypted_key is not None:
- Showqrcode()
- def mnn(self):
- global web3, ChID, gasprice, trxs, rub
- trxs = None
- url = 'https://api.coinmarketcap.com/v2/ticker/1027/?convert=RUB'
- rub = requests.get(url).json()['data']['quotes']['RUB']['price']
- web3 = Web3(WebsocketProvider('wss://mainnet.infura.io/ws'))
- self.main_menu.entryconfigure(index=4, label="Mainnet")
- self.main_menu.entryconfigure(index=5)
- gasprice = web3.eth.gasPrice
- self.komiseth.configure(text="Комиссия: " + str(Web3.fromWei(21000 * gasprice, "ether")) + " Eth")
- ChID = 1
- def rps(self):
- global web3, ChID, gasprice, trxs, rub
- trxs = None
- rub = 0
- web3 = Web3(WebsocketProvider('wss://ropsten.infura.io/ws'))
- self.main_menu.entryconfigure(index=4, label="Ropsten")
- self.main_menu.entryconfigure(index=5)
- gasprice = web3.eth.gasPrice
- self.komiseth.configure(text="Комиссия: " + str(Web3.fromWei(21000 * gasprice, "ether")) + " Eth")
- ChID = 3
- def rfs(self):
- global ether, ruble
- try:
- self.main_menu.entryconfigure(index=5, label=web3.eth.blockNumber)
- except:
- self.rps()
- if encrypted_key is not None:
- address = Web3.toChecksumAddress(encrypted_key["address"])
- self.adr.configure(text=address)
- self.baleth.configure(text=str(round(Web3.fromWei(web3.eth.getBalance(address), "ether"), 8)) + " Eth")
- if trxs is not None:
- if web3.eth.getTransaction(trxs)['blockNumber'] is not None:
- self.infhash.configure(text="Отправлено", foreground="green")
- else:
- self.infhash.configure(text="В очереди", foreground="red")
- if self.senteth.get():
- if self.senteth.get() != ether:
- try:
- self.senrub.delete(0, 'end')
- self.senrub.insert(0, round(float(self.senteth.get()) * rub, 2))
- ether = self.senteth.get()
- ruble = self.senrub.get()
- except:
- pass
- if self.senrub.get() and rub != 0:
- if self.senrub.get() != ruble:
- try:
- self.senteth.delete(0, 'end')
- self.senteth.insert(0, round(float(self.senrub.get()) / rub, 8))
- ruble = self.senrub.get()
- ether = self.senteth.get()
- except:
- pass
- root.after(500, self.rfs)
- def crt(self):
- Crnew()
- def imkey(self):
- Impkey()
- def imfile(self):
- global encrypted_key
- of = tkf.askopenfilename()
- if of:
- try:
- with open(of, 'r') as keyfile:
- encrypted_key = json.loads(keyfile.read())
- try:
- web3.eth.getBalance(Web3.toChecksumAddress(encrypted_key["address"]))
- except:
- tkm.showerror("Ошибка", "Выбран неверный файл")
- except:
- tkm.showerror("Ошибка", "Выбран неверный файл")
- def exkey(self):
- if encrypted_key is not None:
- Expkey()
- else:
- tkm.showerror("Ошибка", "Создайте аккаунт")
- def exfile(self):
- if encrypted_key is not None:
- sf = tkf.asksaveasfilename()
- if sf:
- with open(sf, 'w') as f:
- f.write(json.dumps(encrypted_key))
- else:
- tkm.showerror("Ошибка", "Создайте аккаунт")
- def setrx(self, event):
- if encrypted_key is not None:
- if web3.isAddress(self.seadr.get()):
- try:
- sencn = web3.eth.getBalance(Web3.toChecksumAddress(encrypted_key["address"]))
- sento = web3.toWei(self.senteth.get(), 'ether') + gasprice * 21000
- if sento <= sencn:
- Sentrx()
- else:
- tkm.showerror("Ошибка", "Недостаточно средств")
- except:
- tkm.showerror("Ошибка", "Введите сумму")
- else:
- tkm.showerror("Ошибка", "Неверный адресс")
- else:
- tkm.showerror("Ошибка", "Создайте аккаунт")
- class Showqrcode(tk.Toplevel):
- def __init__(self):
- super().__init__(root)
- self.init_showqrcode()
- def init_showqrcode(self):
- self.title("QRcode")
- self.geometry("+850+350")
- self.resizable(False, False)
- address = Web3.toChecksumAddress(encrypted_key["address"])
- code = pyqrcode.create(str(address))
- code_xbm = code.xbm(scale=8)
- self.code_bmp = tk.BitmapImage(data=code_xbm)
- self.code_bmp.config(background="white")
- self.label = tk.Label(self, image=self.code_bmp)
- self.label.pack()
- class Crnew(tk.Toplevel):
- def __init__(self):
- super().__init__(root)
- self.init_crnew()
- def init_crnew(self):
- self.title('Создание аккаунта')
- self.geometry('+850+350')
- self.resizable(False, False)
- self.entpass = ttk.Entry(self, show="*")
- self.entpass.grid(row=1, column=0)
- self.entcheck = ttk.Entry(self, show="*")
- self.entcheck.grid(row=3, column=0)
- self.askpass = ttk.Label(self, text='Введите пароль:')
- self.askpass.grid(row=0, column=0)
- self.askcheck = ttk.Label(self, text='Повторите пароль:')
- self.askcheck.grid(row=2, column=0)
- self.creak = ttk.Button(self, text='Создать аккаунт')
- self.creak.grid(row=4, column=0)
- self.creak.bind("<Button-1>", self.crn)
- self.grab_set()
- self.focus_set()
- def crn(self, event):
- if self.entpass.get() == self.entcheck.get():
- global encrypted_key
- encrypted_key = Account.encrypt(Account.create(self.entpass.get()).privateKey, self.entpass.get())
- self.destroy()
- else:
- self.askcheck.configure(text="Неверный пароль:", foreground="red")
- class Impkey(tk.Toplevel):
- def __init__(self):
- super().__init__(root)
- self.init_impkey()
- def init_impkey(self):
- self.title('Импорт из закрытого ключа')
- self.geometry('+850+350')
- self.resizable(False, False)
- self.askkey = ttk.Label(self, text='Введите закрытый ключ:')
- self.askkey.grid(row=0, column=0)
- self.entkey = ttk.Entry(self, show="*", width=55)
- self.entkey.grid(row=1, column=0)
- self.entpass = ttk.Entry(self, show="*")
- self.entpass.grid(row=3, column=0)
- self.entcheck = ttk.Entry(self, show="*")
- self.entcheck.grid(row=5, column=0)
- self.askpass = ttk.Label(self, text='Введите пароль:')
- self.askpass.grid(row=2, column=0)
- self.askcheck = ttk.Label(self, text='Повторите пароль:')
- self.askcheck.grid(row=4, column=0)
- self.imp = ttk.Button(self, text='Импорт')
- self.imp.grid(row=6, column=0)
- self.imp.bind("<Button-1>", self.imk)
- self.grab_set()
- self.focus_set()
- def imk(self, event):
- global encrypted_key
- try:
- if self.entpass.get() == self.entcheck.get():
- encrypted_key = Account.encrypt(self.entkey.get(), self.entpass.get())
- self.destroy()
- else:
- self.askcheck.configure(text="Неверный пароль:", foreground="red")
- except Exception:
- self.askkey.configure(text="Введите корректный ключ:", foreground="red")
- class Expkey(tk.Toplevel):
- def __init__(self):
- super().__init__(root)
- self.init_expkey()
- def init_expkey(self):
- self.title('Экспорт закрытого ключа')
- self.geometry("+850+350")
- self.resizable(False, False)
- self.askpass = ttk.Label(self, text='Введите пароль:')
- self.askpass.grid(row=0, column=0)
- self.entkey = ttk.Entry(self, show="*", width=20)
- self.entkey.grid(row=1, column=0)
- self.imp = ttk.Button(self, text='Получить закрытый ключ')
- self.imp.grid(row=2, column=0)
- self.imp.bind("<Button-1>", self.expk)
- self.prk = tk.Text(self, width=66, height=1, borderwidth=0)
- self.prk.grid(row=3, column=0)
- self.grab_set()
- self.focus_set()
- def expk(self, event):
- try:
- global encrypted_key
- self.prk.insert(1.0, Account._parsePrivateKey(Account.decrypt(encrypted_key, self.entkey.get())))
- except ValueError:
- self.askpass.configure(text="Неверный пароль:", foreground="red")
- class Sentrx(tk.Toplevel):
- def __init__(self):
- super().__init__(root)
- self.init_sentrx()
- def init_sentrx(self):
- self.title('Отправление транзакции')
- self.geometry("+850+350")
- self.resizable(False, False)
- self.askpass = ttk.Label(self, text='Введите пароль:')
- self.askpass.grid(row=0, column=0)
- self.enkey = ttk.Entry(self, show="*", width=20)
- self.enkey.grid(row=1, column=0)
- self.imp = ttk.Button(self, text='Отправить')
- self.imp.grid(row=2, column=0)
- self.imp.bind("<Button-1>", self.chk)
- self.grab_set()
- self.focus_set()
- def chk(self, event):
- global encrypted_key, gasprice, ChID, trxs
- try:
- transaction = {'to': app.seadr.get(),
- 'value': web3.toWei(app.senteth.get(), 'ether'),
- 'gas': 21000,
- 'gasPrice': gasprice,
- 'nonce': web3.eth.getTransactionCount(Web3.toChecksumAddress(encrypted_key["address"])),
- 'chainId': ChID
- }
- signed = Account.signTransaction(transaction,
- Account._parsePrivateKey(Account.decrypt(encrypted_key, self.enkey.get())))
- web3.eth.sendRawTransaction(signed.rawTransaction)
- trxs = Web3.toHex(signed['hash'])
- app.shtr.configure(text=trxs)
- app.lhash.configure(text="Хэш транзакции:")
- self.destroy()
- except ValueError:
- self.askpass.configure(text="Неверный пароль:", foreground="red")
- if __name__ == "__main__":
- root = tk.Tk()
- app = Main(root)
- root.title("Ifinas")
- root.geometry("+800+300")
- root.resizable(False, False)
- root.after(1000, app.rfs)
- root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement