diff --git a/electrum/plugins/joinmarket/jm_conf.py b/electrum/plugins/joinmarket/jm_conf.py index 86824eccd..bb6a65e12 100644 --- a/electrum/plugins/joinmarket/jm_conf.py +++ b/electrum/plugins/joinmarket/jm_conf.py @@ -161,13 +161,15 @@ class JMConf: self.logger = jmman.logger self.wallet = jmman.wallet self.jmw = jmman.jmw - if self.max_mixdepth != self.mixdepth: - self.max_mixdepth = max(self.max_mixdepth, self.mixdepth) self.BITCOIN_DUST_THRESHOLD = 2730 self.DUST_THRESHOLD = 10 * self.BITCOIN_DUST_THRESHOLD self._mincjamount = self.DEFAULT_MINCJAMOUNT + def init_max_mixdepth(self): + if self.max_mixdepth != self.mixdepth: + self.max_mixdepth = max(self.max_mixdepth, self.mixdepth) + @property def blockchain_network(self): if not constants.net.TESTNET: diff --git a/electrum/plugins/joinmarket/jm_main.py b/electrum/plugins/joinmarket/jm_main.py index 4f5a122af..0278f89e8 100644 --- a/electrum/plugins/joinmarket/jm_main.py +++ b/electrum/plugins/joinmarket/jm_main.py @@ -34,6 +34,7 @@ class JMManager(Logger): self.tumble_logsdir = logsdir = pathlib.Path(config.path) / "logs" self.tumble_log = get_tumble_log(self, logsdir, config) + self._state = JMStates.Unsupported self.jmw = JMWallet(self) self.jmconf = JMConf(self) self.jmw.jmconf = self.jmconf @@ -43,7 +44,6 @@ class JMManager(Logger): self.postponed_notifications = {} - self._state = JMStates.Unsupported self.wallet_types_supported = ['standard'] self.keystore_types_supported = ['bip32'] keystore = wallet.db.get('keystore') @@ -55,7 +55,8 @@ class JMManager(Logger): if (self.w_type in self.wallet_types_supported and self.w_ks_type in self.keystore_types_supported): if constants.net.TESTNET: - if self.jmw.get_jm_data('jm_enabled', False): + jm_data = self.wallet.db.get('jm_data') + if jm_data and jm_data.get('jm_enabled', False): self._state = JMStates.Ready else: self._state = JMStates.Disabled @@ -121,8 +122,10 @@ class JMManager(Logger): '''Start initialization, find untracked txs''' if self.enabled: return False - self.jmw.set_jm_data('jm_enabled', True) self._state = JMStates.Ready + self.jmw.init_jm_data() + self.jmconf.init_max_mixdepth() + self.jmw.set_jm_data('jm_enabled', True) await self.loop.run_in_executor(None, self.jmw.load_and_cleanup) self.wallet.save_db() self.logger.info('JMManager initialized') diff --git a/electrum/plugins/joinmarket/jm_wallet.py b/electrum/plugins/joinmarket/jm_wallet.py index 1cc0e2feb..d0ac32257 100644 --- a/electrum/plugins/joinmarket/jm_wallet.py +++ b/electrum/plugins/joinmarket/jm_wallet.py @@ -310,11 +310,11 @@ class JMWallet(KeyPairsMixin, WalletDBMixin, JMBaseCodeMixin, EventListener): self.wallet = jmman.wallet self.config = jmman.config self.debug = False - self.db = db = self.wallet.db - self.jm_data = db.get_dict('jm_data') - self.jm_addresses = db.get_dict('jm_addresses') - self.jm_commitments = db.get_dict('jm_commitments') - self.jm_txs = db.get_dict('jm_txs') + self.db = self.wallet.db + self.jm_data = None + self.jm_addresses = None + self.jm_commitments = None + self.jm_txs = None # sycnhronizer unsubsribed addresses self.spent_addrs = set() @@ -337,6 +337,15 @@ class JMWallet(KeyPairsMixin, WalletDBMixin, JMBaseCodeMixin, EventListener): self.taskgroup = util.OldTaskGroup() + def init_jm_data(self): + if not self.jmman.enabled: + return + db = self.db + self.jm_data = db.get_dict('jm_data') + self.jm_addresses = db.get_dict('jm_addresses') + self.jm_commitments = db.get_dict('jm_commitments') + self.jm_txs = db.get_dict('jm_txs') + @property def jmconf(self): return self._jm_conf @@ -481,6 +490,8 @@ class JMWallet(KeyPairsMixin, WalletDBMixin, JMBaseCodeMixin, EventListener): return gen_cnt def synchronize(self): + if not self.jmman.enabled: + return count = 0 with self.wallet.lock: for d in range(self.jmconf.max_mixdepth + 1): diff --git a/electrum/plugins/joinmarket/notes.txt b/electrum/plugins/joinmarket/notes.txt index e4278265f..5ff127685 100644 --- a/electrum/plugins/joinmarket/notes.txt +++ b/electrum/plugins/joinmarket/notes.txt @@ -13,7 +13,6 @@ plugin: > 62.08 | I | J/plugins.joinmarket.jm_main.JMManager.[wallet_jm] | Lost IRC connection to: irc1.dword.ga . Should reconnect automatically soon. - окремий пункт до якого я взагалі ще не дійшов це qml gui - - unsupported/disabled JMManager -- do not add `jm_*` in the wallet - не може підібрати ордери, таке періодично трапляється при низькому значенні maker_timeout_sec -- раніше вистачало 3, зараз замало 5 і процес підбору запускається до того як `ordebookwatch.py` додає ордери diff --git a/electrum/plugins/joinmarket/tests/__init__.py b/electrum/plugins/joinmarket/tests/__init__.py index d7a201ea0..b4bdeeec0 100644 --- a/electrum/plugins/joinmarket/tests/__init__.py +++ b/electrum/plugins/joinmarket/tests/__init__.py @@ -308,6 +308,7 @@ class JMTestCase(ElectrumTestCase): self.network = NetworkMock(self.asyncio_loop, self.config, w) self.jmman = jmman = JMManager(self.w) self.jmman.on_network_start(self.network) + await jmman._enable_jm() self.jmw = jmw = jmman.jmw for addr in w.get_addresses(): w.adb.add_address(addr) diff --git a/electrum/plugins/joinmarket/tests/jmclient/commontest.py b/electrum/plugins/joinmarket/tests/jmclient/commontest.py index 53d9702ca..6d8b763ae 100644 --- a/electrum/plugins/joinmarket/tests/jmclient/commontest.py +++ b/electrum/plugins/joinmarket/tests/jmclient/commontest.py @@ -33,6 +33,7 @@ class DummyJMWallet(JMWallet): def __init__(self, jmman): super().__init__(jmman) + self.init_jm_data() self.fake_query_results = None self.qusfail = False self.default_confs = 20 diff --git a/electrum/plugins/joinmarket/tests/test_jm_conf.py b/electrum/plugins/joinmarket/tests/test_jm_conf.py index d2fdb8464..7f7238eea 100644 --- a/electrum/plugins/joinmarket/tests/test_jm_conf.py +++ b/electrum/plugins/joinmarket/tests/test_jm_conf.py @@ -7,6 +7,13 @@ from electrum.plugins.joinmarket.tests import JMTestCase class JMConfTestCase(JMTestCase): + async def test_init_max_mixdepth(self): + jmconf = self.jmconf + jmconf.mixdepth = 3 + jmconf.init_max_mixdepth() + assert jmconf.max_mixdepth == 4 + assert jmconf.mixdepth == 3 + async def test_blockchain_network(self): jmconf = self.jmconf constants.BitcoinMainnet.set_as_network() diff --git a/electrum/plugins/joinmarket/tests/test_jm_main.py b/electrum/plugins/joinmarket/tests/test_jm_main.py index fe3f1ee12..748363ba2 100644 --- a/electrum/plugins/joinmarket/tests/test_jm_main.py +++ b/electrum/plugins/joinmarket/tests/test_jm_main.py @@ -12,7 +12,7 @@ from tests import ElectrumTestCase from electrum.plugins.joinmarket.jm_main import JMManager from electrum.plugins.joinmarket.jm_util import JMStates from electrum.plugins.joinmarket.tests import ( - JMTestCase, SynchronizerMock, VerifyierMock, NetworkMock) + SynchronizerMock, VerifyierMock, NetworkMock) class JMManagerInitTestCase(ElectrumTestCase): @@ -69,10 +69,13 @@ class JMManagerInitTestCase(ElectrumTestCase): assert not jmman.unsupported assert jmman.state == JMStates.Disabled - jmman.jmw.set_jm_data('jm_enabled', True) jmman = JMManager(w) - assert jmman.enabled + jmman.on_network_start(self.network) + assert not jmman.enabled assert not jmman.unsupported + assert jmman.state == JMStates.Disabled + await jmman._enable_jm() + assert jmman.enabled assert jmman.state == JMStates.Ready async def test_init_on_mainnet(self): @@ -83,11 +86,34 @@ class JMManagerInitTestCase(ElectrumTestCase): assert jmman.unsupported assert 'mainnet' in jmman.unsupported_msg - -class JMManagerTestCase(JMTestCase): + async def test_init_jm_data(self): + w = self.w + db = w.db + jmman = JMManager(w) + jmman.on_network_start(self.network) + jmw = jmman.jmw + + assert db.get('jm_data') is None + assert db.get('jm_addresses') is None + assert db.get('jm_commitments') is None + assert db.get('jm_txs') is None + + jmw.init_jm_data() + assert db.get('jm_data') is None + assert db.get('jm_addresses') is None + assert db.get('jm_commitments') is None + assert db.get('jm_txs') is None + + await jmman._enable_jm() + assert db.get('jm_data') == {'jm_enabled': True} + assert db.get('jm_addresses') is not None + assert db.get('jm_commitments') is not None + assert db.get('jm_txs') is not None async def test_enable_jm(self): - jmman = self.jmman + w = self.w + jmman = JMManager(w) + jmman.on_network_start(self.network) assert not jmman.enabled enabled = await jmman.loop.run_in_executor(None, jmman.enable_jm) diff --git a/electrum/plugins/joinmarket/tests/test_jm_wallet.py b/electrum/plugins/joinmarket/tests/test_jm_wallet.py index 793a044e6..09402d4be 100644 --- a/electrum/plugins/joinmarket/tests/test_jm_wallet.py +++ b/electrum/plugins/joinmarket/tests/test_jm_wallet.py @@ -132,7 +132,7 @@ class WalletDBMixinTestCase(JMTestCase): jmw.pop_jm_data('taker_utxo_age') jmw.pop_jm_data('tx_fees') jmw.pop_jm_data('tx_fees_factor') - assert self.w.db.get_dict('jm_data') == {} + assert self.w.db.get_dict('jm_data') == {'jm_enabled': True} async def test_get_jm_data(self): jmw = self.jmw @@ -144,12 +144,16 @@ class WalletDBMixinTestCase(JMTestCase): jmw = self.jmw jmw.set_jm_data('key1', 'value1') assert jmw.get_jm_data('key1') == 'value1' - assert self.w.db.get_dict('jm_data') == {'key1': 'value1'} + assert self.w.db.get_dict('jm_data') == { + 'jm_enabled': True, + 'key1': 'value1'} async def test_pop_jm_data(self): jmw = self.jmman.jmw jmw.set_jm_data('key1', {'subkey1': 'value1'}) - assert self.w.db.get_dict('jm_data') == {'key1': {'subkey1': 'value1'}} + assert self.w.db.get_dict('jm_data') == { + 'jm_enabled': True, + 'key1': {'subkey1': 'value1'}} assert jmw.pop_jm_data('key1') == {'subkey1': 'value1'} async def test_get_jm_commitments(self): @@ -313,12 +317,10 @@ class JMWalletTestCase(JMTestCase): async def asyncSetUp(self): await super().asyncSetUp() - self.addr1 = 'tb1qs33rq0wmrq2awvuxrte0mqkksvzr6x9sdkrfdc' # unspent - self.addr2 = 'tb1q8c2k82wyzcxgk3x2257r2j6ngzedvjppdh4904' # unspent self.addr3 = 'tb1qpjkqrhz3kxsg93c5cw2axhdy39wqy36u9ygzdk' # spent self.addr4 = 'tb1q8qymfhts46zngpnve4rf6mjaqg398ggskvw3ez' # spent - self.unspent_addrs = set([self.addr1, self.addr2]) self.spent_addrs = set([self.addr3, self.addr4]) + self.unspent_addrs = set() self.txid1 = '55'*32 self.txid2 = 'aa'*32 self.w.adb._history_local[self.addr3].add(self.txid1) @@ -326,8 +328,6 @@ class JMWalletTestCase(JMTestCase): async def test_load_and_cleanup(self): self.jmw.load_and_cleanup() - await self.jmman._enable_jm() - self.jmw.load_and_cleanup() async def test_get_spent_jm_addresses(self): jmw = self.jmw @@ -363,14 +363,11 @@ class JMWalletTestCase(JMTestCase): jmw = self.jmw assert jmw.spent_addrs == set() assert jmw.unsubscribed_addrs == set() - await self.jmman._enable_jm() - assert jmw.spent_addrs == self.spent_addrs - assert jmw.unsubscribed_addrs == self.spent_addrs for addr in self.spent_addrs: jmw.subscribe_spent_addr(addr) - assert jmw.spent_addrs == self.spent_addrs + assert jmw.spent_addrs == self.unspent_addrs assert jmw.unsubscribed_addrs == set() for addr in self.spent_addrs: assert addr in s.addrs @@ -381,7 +378,6 @@ class JMWalletTestCase(JMTestCase): jmw = self.jmw assert jmw.spent_addrs == set() assert jmw.unsubscribed_addrs == set() - await self.jmman._enable_jm() jmw.add_spent_addrs(self.spent_addrs) assert jmw.spent_addrs == self.spent_addrs assert jmw.unsubscribed_addrs == self.spent_addrs