URI: 
       tMerge pull request #6288 from SomberNight/202006_storage_upgrade_31 - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 01a2d127878642c8bcb123e5e7f3de744aeb071c
   DIR parent 2db0ad10db7ae2a55900d06c3f788d01507d678e
  HTML Author: ThomasV <thomasv@electrum.org>
       Date:   Sat, 27 Jun 2020 09:59:58 +0200
       
       Merge pull request #6288 from SomberNight/202006_storage_upgrade_31
       
       invoices: make sure that OnchainInvoice .exp and .time are not None
       Diffstat:
         M electrum/invoices.py                |       6 +++---
         M electrum/wallet.py                  |      12 ++++++++++--
         M electrum/wallet_db.py               |      18 +++++++++++++++++-
       
       3 files changed, 30 insertions(+), 6 deletions(-)
       ---
   DIR diff --git a/electrum/invoices.py b/electrum/invoices.py
       t@@ -113,9 +113,9 @@ class Invoice(StoredObject):
        @attr.s
        class OnchainInvoice(Invoice):
            message = attr.ib(type=str, kw_only=True)
       -    amount_sat = attr.ib(kw_only=True)  # type: Union[None, int, str]  # in satoshis. can be '!'
       -    exp = attr.ib(type=int, kw_only=True)
       -    time = attr.ib(type=int, kw_only=True)
       +    amount_sat = attr.ib(kw_only=True)  # type: Union[int, str]  # in satoshis. can be '!'
       +    exp = attr.ib(type=int, kw_only=True, validator=attr.validators.instance_of(int))
       +    time = attr.ib(type=int, kw_only=True, validator=attr.validators.instance_of(int))
            id = attr.ib(type=str, kw_only=True)
            outputs = attr.ib(kw_only=True, converter=_decode_outputs)  # type: List[PartialTxOutput]
            bip70 = attr.ib(type=str, kw_only=True)  # type: Optional[str]
   DIR diff --git a/electrum/wallet.py b/electrum/wallet.py
       t@@ -691,14 +691,21 @@ class Abstract_Wallet(AddressSynchronizer, ABC):
                    amount = '!'
                else:
                    amount = sum(x.value for x in outputs)
       +        timestamp = None
       +        exp = None
       +        if URI:
       +            timestamp = URI.get('time')
       +            exp = URI.get('exp')
       +        timestamp = timestamp or int(time.time())
       +        exp = exp or 0
                invoice = OnchainInvoice(
                    type=PR_TYPE_ONCHAIN,
                    amount_sat=amount,
                    outputs=outputs,
                    message=message,
                    id=bh2u(sha256(repr(outputs))[0:16]),
       -            time=URI.get('time') if URI else int(time.time()),
       -            exp=URI.get('exp') if URI else 0,
       +            time=timestamp,
       +            exp=exp,
                    bip70=None,
                    requestor=None,
                )
       t@@ -1776,6 +1783,7 @@ class Abstract_Wallet(AddressSynchronizer, ABC):
                amount_sat = amount_sat or 0
                timestamp = int(time.time())
                _id = bh2u(sha256d(address + "%d"%timestamp))[0:10]
       +        expiration = expiration or 0
                return OnchainInvoice(
                    type=PR_TYPE_ONCHAIN,
                    outputs=[(TYPE_ADDRESS, address, amount_sat)],
   DIR diff --git a/electrum/wallet_db.py b/electrum/wallet_db.py
       t@@ -52,7 +52,7 @@ if TYPE_CHECKING:
        
        OLD_SEED_VERSION = 4        # electrum versions < 2.0
        NEW_SEED_VERSION = 11       # electrum versions >= 2.0
       -FINAL_SEED_VERSION = 30     # electrum >= 2.7 will set this to prevent
       +FINAL_SEED_VERSION = 31     # electrum >= 2.7 will set this to prevent
                                    # old versions from overwriting new format
        
        
       t@@ -178,6 +178,7 @@ class WalletDB(JsonDB):
                self._convert_version_28()
                self._convert_version_29()
                self._convert_version_30()
       +        self._convert_version_31()
                self.put('seed_version', FINAL_SEED_VERSION)  # just to be sure
        
                self._after_upgrade_tasks()
       t@@ -667,6 +668,21 @@ class WalletDB(JsonDB):
                            raise Exception(f"unknown invoice type: {_type}")
                self.data['seed_version'] = 30
        
       +    def _convert_version_31(self):
       +        if not self._is_upgrade_method_needed(30, 30):
       +            return
       +
       +        from .invoices import PR_TYPE_ONCHAIN
       +        requests = self.data.get('payment_requests', {})
       +        invoices = self.data.get('invoices', {})
       +        for d in [invoices, requests]:
       +            for key, item in list(d.items()):
       +                if item['type'] == PR_TYPE_ONCHAIN:
       +                    item['amount_sat'] = item['amount_sat'] or 0
       +                    item['exp'] = item['exp'] or 0
       +                    item['time'] = item['time'] or 0
       +        self.data['seed_version'] = 31
       +
            def _convert_imported(self):
                if not self._is_upgrade_method_needed(0, 13):
                    return