diff --git a/electrum/submarine_swaps.py b/electrum/submarine_swaps.py index 2124ca73d..1ffeca188 100644 --- a/electrum/submarine_swaps.py +++ b/electrum/submarine_swaps.py @@ -148,8 +148,8 @@ class SwapManager(Logger): self.normal_fee = 0 self.lockup_fee = 0 self.percentage = 0 - self.min_amount = 0 - self._max_amount = 0 + self._min_amount = None + self._max_amount = None self.wallet = wallet self.lnworker = lnworker @@ -170,6 +170,8 @@ class SwapManager(Logger): self.api_url = API_URL_TESTNET else: self.api_url = API_URL_REGTEST + # init default min & max + self.init_min_max_values() def start_network(self, *, network: 'Network', lnwatcher: 'LNWalletWatcher'): assert network @@ -491,19 +493,40 @@ class SwapManager(Logger): raise SwapServerError() from e # we assume server response is well-formed; otherwise let an exception propagate to the crash reporter pairs = json.loads(response) + # cache data to disk + with open(self.pairs_filename(), 'w', encoding='utf-8') as f: + f.write(json.dumps(pairs)) fees = pairs['pairs']['BTC/BTC']['fees'] self.percentage = fees['percentage'] self.normal_fee = fees['minerFees']['baseAsset']['normal'] self.lockup_fee = fees['minerFees']['baseAsset']['reverse']['lockup'] limits = pairs['pairs']['BTC/BTC']['limits'] - self.min_amount = limits['minimal'] + self._min_amount = limits['minimal'] self._max_amount = limits['maximal'] + def pairs_filename(self): + return os.path.join(self.wallet.config.path, 'swap_pairs') + + def init_min_max_values(self): + # use default values if we never requested pairs + try: + with open(self.pairs_filename(), 'r', encoding='utf-8') as f: + pairs = json.loads(f.read()) + limits = pairs['pairs']['BTC/BTC']['limits'] + self._min_amount = limits['minimal'] + self._max_amount = limits['maximal'] + except: + self._min_amount = 10000 + self._max_amount = 10000000 + def get_max_amount(self): return self._max_amount + def get_min_amount(self): + return self._min_amount + def check_invoice_amount(self, x): - return x >= self.min_amount and x <= self._max_amount + return x >= self.get_min_amount() and x <= self.get_max_amount() def _get_recv_amount(self, send_amount: Optional[int], *, is_reverse: bool) -> Optional[int]: """For a given swap direction and amount we send, returns how much we will receive. @@ -646,5 +669,5 @@ class SwapManager(Logger): max_recv_amt_ln = int(self.num_sats_can_receive()) max_amt_ln = int(min(max_swap_amt_ln, max_recv_amt_ln)) max_amt_oc = self.get_send_amount(max_amt_ln, is_reverse=False) or 0 - min_amt_oc = self.get_send_amount(self.min_amount, is_reverse=False) or 0 + min_amt_oc = self.get_send_amount(self.get_min_amount(), is_reverse=False) or 0 return max_amt_oc if max_amt_oc >= min_amt_oc else None