committed by
GitHub
2 changed files with 0 additions and 117 deletions
@ -1,5 +0,0 @@ |
|||||
from electrum.i18n import _ |
|
||||
|
|
||||
fullname = 'GreenAddress instant' |
|
||||
description = _("Allows validating if your transactions have instant confirmations by GreenAddress") |
|
||||
available_for = ['qt'] |
|
@ -1,112 +0,0 @@ |
|||||
#!/usr/bin/env python |
|
||||
# |
|
||||
# Electrum - lightweight Bitcoin client |
|
||||
# Copyright (C) 2014 Thomas Voegtlin |
|
||||
# |
|
||||
# Permission is hereby granted, free of charge, to any person |
|
||||
# obtaining a copy of this software and associated documentation files |
|
||||
# (the "Software"), to deal in the Software without restriction, |
|
||||
# including without limitation the rights to use, copy, modify, merge, |
|
||||
# publish, distribute, sublicense, and/or sell copies of the Software, |
|
||||
# and to permit persons to whom the Software is furnished to do so, |
|
||||
# subject to the following conditions: |
|
||||
# |
|
||||
# The above copyright notice and this permission notice shall be |
|
||||
# included in all copies or substantial portions of the Software. |
|
||||
# |
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
|
||||
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
|
||||
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS |
|
||||
# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN |
|
||||
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
|
||||
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|
||||
# SOFTWARE. |
|
||||
|
|
||||
import base64 |
|
||||
import urllib.parse |
|
||||
import sys |
|
||||
from typing import TYPE_CHECKING |
|
||||
|
|
||||
from PyQt5.QtWidgets import QApplication, QPushButton |
|
||||
|
|
||||
from electrum.plugin import BasePlugin, hook |
|
||||
from electrum.i18n import _ |
|
||||
from electrum.network import Network |
|
||||
|
|
||||
if TYPE_CHECKING: |
|
||||
from aiohttp import ClientResponse |
|
||||
from electrum.gui.qt.transaction_dialog import TxDialog |
|
||||
|
|
||||
|
|
||||
class Plugin(BasePlugin): |
|
||||
|
|
||||
button_label = _("Verify GA instant") |
|
||||
|
|
||||
@hook |
|
||||
def transaction_dialog(self, d: 'TxDialog'): |
|
||||
d.verify_button = QPushButton(self.button_label) |
|
||||
d.verify_button.clicked.connect(lambda: self.do_verify(d)) |
|
||||
d.verify_button.setVisible(False) |
|
||||
d.buttons.insert(0, d.verify_button) |
|
||||
|
|
||||
def get_my_addr(self, d: 'TxDialog'): |
|
||||
"""Returns the address for given tx which can be used to request |
|
||||
instant confirmation verification from GreenAddress""" |
|
||||
for o in d.tx.outputs(): |
|
||||
if d.wallet.is_mine(o.address): |
|
||||
return o.address |
|
||||
return None |
|
||||
|
|
||||
@hook |
|
||||
def transaction_dialog_update(self, d: 'TxDialog'): |
|
||||
if d.tx.is_complete() and self.get_my_addr(d): |
|
||||
d.verify_button.setVisible(True) |
|
||||
else: |
|
||||
d.verify_button.setVisible(False) |
|
||||
|
|
||||
def do_verify(self, d: 'TxDialog'): |
|
||||
tx = d.tx |
|
||||
wallet = d.wallet |
|
||||
window = d.main_window |
|
||||
|
|
||||
if wallet.is_watching_only(): |
|
||||
d.show_critical(_('This feature is not available for watch-only wallets.')) |
|
||||
return |
|
||||
|
|
||||
# 1. get the password and sign the verification request |
|
||||
password = None |
|
||||
if wallet.has_keystore_encryption(): |
|
||||
msg = _('GreenAddress requires your signature \n' |
|
||||
'to verify that transaction is instant.\n' |
|
||||
'Please enter your password to sign a\n' |
|
||||
'verification request.') |
|
||||
password = window.password_dialog(msg, parent=d) |
|
||||
if not password: |
|
||||
return |
|
||||
try: |
|
||||
d.verify_button.setText(_('Verifying...')) |
|
||||
QApplication.processEvents() # update the button label |
|
||||
|
|
||||
addr = self.get_my_addr(d) |
|
||||
message = "Please verify if %s is GreenAddress instant confirmed" % tx.txid() |
|
||||
sig = wallet.sign_message(addr, message, password) |
|
||||
sig = base64.b64encode(sig).decode('ascii') |
|
||||
|
|
||||
# 2. send the request |
|
||||
async def handle_request(resp: 'ClientResponse'): |
|
||||
resp.raise_for_status() |
|
||||
return await resp.json() |
|
||||
url = "https://greenaddress.it/verify/?signature=%s&txhash=%s" % (urllib.parse.quote(sig), tx.txid()) |
|
||||
response = Network.send_http_on_proxy('get', url, headers = {'User-Agent': 'Electrum'}, on_finish=handle_request) |
|
||||
|
|
||||
# 3. display the result |
|
||||
if response.get('verified'): |
|
||||
d.show_message(_('{} is covered by GreenAddress instant confirmation').format(tx.txid()), title=_('Verification successful!')) |
|
||||
else: |
|
||||
d.show_warning(_('{} is not covered by GreenAddress instant confirmation').format(tx.txid()), title=_('Verification failed!')) |
|
||||
except BaseException as e: |
|
||||
self.logger.exception('') |
|
||||
d.show_error(repr(e)) |
|
||||
finally: |
|
||||
d.verify_button.setText(self.button_label) |
|
Loading…
Reference in new issue