URI: 
       tTrustedcoin: prepaid-only billing - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 6ca52153c316fdb46064aaaaeb02d4ba3e824f68
   DIR parent aa6cab37d5e23caa3cbbdab11c356b8e7e53c974
  HTML Author: ThomasV <thomasv@electrum.org>
       Date:   Fri, 12 May 2017 15:58:00 +0200
       
       Trustedcoin: prepaid-only billing
       
       Diffstat:
         M plugins/trustedcoin/qt.py           |      30 ++++++++----------------------
         M plugins/trustedcoin/trustedcoin.py  |      22 +++++++++++++++++-----
       
       2 files changed, 25 insertions(+), 27 deletions(-)
       ---
   DIR diff --git a/plugins/trustedcoin/qt.py b/plugins/trustedcoin/qt.py
       t@@ -142,7 +142,7 @@ class Plugin(TrustedCoinPlugin):
                vbox.addLayout(hbox)
                vbox.addStretch(10)
        
       -        msg = _('TrustedCoin charges a fee per co-signed transaction. You may pay on each transaction (an extra output will be added to your transaction), or you may purchase prepaid transaction using this dialog.') + '<br/>'
       +        msg = _('TrustedCoin charges a small fee to co-sign transactions. The fee depends on how many prepaid transactions you buy. An extra output is added to your transaction everytime you run out of prepaid transactions.') + '<br/>'
                label = QLabel(msg)
                label.setWordWrap(1)
                vbox.addWidget(label)
       t@@ -152,35 +152,21 @@ class Plugin(TrustedCoinPlugin):
                vbox.addLayout(grid)
        
                price_per_tx = wallet.price_per_tx
       -        v = price_per_tx.get(1)
       -        grid.addWidget(QLabel(_("Price per transaction (not prepaid):")), 0, 0)
       -        grid.addWidget(QLabel(window.format_amount(v) + ' ' + window.base_unit()), 0, 1)
       -
       -        i = 1
       -
       +        n_prepay = wallet.num_prepay(self.config)
       +        i = 0
                for k, v in sorted(price_per_tx.items()):
                    if k == 1:
                        continue
       -            grid.addWidget(QLabel("Price for %d prepaid transactions:"%k), i, 0)
       -            grid.addWidget(QLabel("%d x "%k + window.format_amount(v/k) + ' ' + window.base_unit()), i, 1)
       -            b = QPushButton(_("Buy"))
       -            b.clicked.connect(lambda b, k=k, v=v: self.on_buy(window, k, v, d))
       +            grid.addWidget(QLabel("Pay every %d transactions:"%k), i, 0)
       +            grid.addWidget(QLabel(window.format_amount(v/k) + ' ' + window.base_unit() + "/tx"), i, 1)
       +            b = QRadioButton()
       +            b.setChecked(k == n_prepay)
       +            b.clicked.connect(lambda b, k=k: self.config.set_key('trustedcoin_prepay', k, True))
                    grid.addWidget(b, i, 2)
                    i += 1
        
                n = wallet.billing_info.get('tx_remaining', 0)
                grid.addWidget(QLabel(_("Your wallet has %d prepaid transactions.")%n), i, 0)
       -
       -        # tranfer button
       -        #def on_transfer():
       -        #    server.transfer_credit(self.user_id, recipient, otp, signature_callback)
       -        #    pass
       -        #b = QPushButton(_("Transfer"))
       -        #b.clicked.connect(on_transfer)
       -        #grid.addWidget(b, 1, 2)
       -
       -        #grid.addWidget(QLabel(_("Next Billing Address:")), i, 0)
       -        #grid.addWidget(QLabel(self.billing_info['billing_address']), i, 1)
                vbox.addLayout(Buttons(CloseButton(d)))
                d.exec_()
        
   DIR diff --git a/plugins/trustedcoin/trustedcoin.py b/plugins/trustedcoin/trustedcoin.py
       t@@ -209,7 +209,7 @@ class Wallet_2fa(Multisig_Wallet):
                sendable = sum(map(lambda x:x['value'], inputs))
                for i in inputs:
                    self.add_input_info(i)
       -        xf = self.extra_fee()
       +        xf = self.extra_fee(config)
                _type, addr = recipient
                if xf and sendable >= xf:
                    billing_address = self.billing_info['billing_address']
       t@@ -224,22 +224,33 @@ class Wallet_2fa(Multisig_Wallet):
                amount = max(0, sendable - fee)
                return amount, fee
        
       -    def extra_fee(self):
       +    def min_prepay(self):
       +        return min(self.price_per_tx.keys())
       +
       +    def num_prepay(self, config):
       +        default = self.min_prepay()
       +        n = config.get('trustedcoin_prepay', default)
       +        if n not in self.price_per_tx:
       +            n = default
       +        return n
       +
       +    def extra_fee(self, config):
                if self.can_sign_without_server():
                    return 0
                if self.billing_info.get('tx_remaining'):
                    return 0
                if self.is_billing:
                    return 0
       -        price = int(self.price_per_tx.get(1))
       -        assert price <= 100000
       +        n = self.num_prepay(config)
       +        price = int(self.price_per_tx[n])
       +        assert price <= 100000 * n
                return price
        
            def make_unsigned_transaction(self, coins, outputs, config,
                                          fixed_fee=None, change_addr=None):
                mk_tx = lambda o: Multisig_Wallet.make_unsigned_transaction(
                    self, coins, o, config, fixed_fee, change_addr)
       -        fee = self.extra_fee()
       +        fee = self.extra_fee(config)
                if fee:
                    address = self.billing_info['billing_address']
                    fee_output = (TYPE_ADDRESS, address, fee)
       t@@ -329,6 +340,7 @@ class TrustedCoinPlugin(BasePlugin):
                assert billing_address == billing_info['billing_address']
                wallet.billing_info = billing_info
                wallet.price_per_tx = dict(billing_info['price_per_tx'])
       +        wallet.price_per_tx.pop(1)
                return True
        
            def make_seed(self):