Browse Source

do not add `jm_*` in the wallet until enabled

add-joinmarket
zebra-lucky 1 year ago
parent
commit
23e39725a7
  1. 6
      electrum/plugins/joinmarket/jm_conf.py
  2. 9
      electrum/plugins/joinmarket/jm_main.py
  3. 21
      electrum/plugins/joinmarket/jm_wallet.py
  4. 1
      electrum/plugins/joinmarket/notes.txt
  5. 1
      electrum/plugins/joinmarket/tests/__init__.py
  6. 1
      electrum/plugins/joinmarket/tests/jmclient/commontest.py
  7. 7
      electrum/plugins/joinmarket/tests/test_jm_conf.py
  8. 38
      electrum/plugins/joinmarket/tests/test_jm_main.py
  9. 22
      electrum/plugins/joinmarket/tests/test_jm_wallet.py

6
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:

9
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')

21
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):

1
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` додає ордери

1
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)

1
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

7
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()

38
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)

22
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

Loading…
Cancel
Save