Split main class.
This commit is contained in:
parent
c7c49ae262
commit
e390509946
@ -48,7 +48,7 @@ jobs:
|
|||||||
before_script:
|
before_script:
|
||||||
script:
|
script:
|
||||||
- PYTHONWARNINGS="ignore" flake8 --ignore=E501,F841,W503 --exclude=segwit_addr.py,key.py,messages_pb2.py,.eggs
|
- PYTHONWARNINGS="ignore" flake8 --ignore=E501,F841,W503 --exclude=segwit_addr.py,key.py,messages_pb2.py,.eggs
|
||||||
- codespell --check-filenames --disable-colors --quiet-level=7 -S .git,.eggs,gitianpubkeys
|
- codespell --check-filenames --disable-colors --quiet-level=7 --ignore-words=tests/lint/spelling.ignore-words.txt -S .git,.eggs,gitianpubkeys,*.pyc
|
||||||
after_success:
|
after_success:
|
||||||
- echo "End lint"
|
- echo "End lint"
|
||||||
- stage: test
|
- stage: test
|
||||||
|
115
basicswap/base.py
Normal file
115
basicswap/base.py
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# Copyright (c) 2019 tecnovert
|
||||||
|
# Distributed under the MIT software license, see the accompanying
|
||||||
|
# file LICENSE.txt or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
import os
|
||||||
|
import threading
|
||||||
|
import logging
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
import basicswap.config as cfg
|
||||||
|
|
||||||
|
from .chainparams import (
|
||||||
|
chainparams,
|
||||||
|
Coins,
|
||||||
|
)
|
||||||
|
from .util import (
|
||||||
|
callrpc,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class BaseApp:
|
||||||
|
def __init__(self, fp, data_dir, settings, chain, log_name='BasicSwap'):
|
||||||
|
self.log_name = log_name
|
||||||
|
self.fp = fp
|
||||||
|
self.is_running = True
|
||||||
|
self.fail_code = 0
|
||||||
|
|
||||||
|
self.data_dir = data_dir
|
||||||
|
self.chain = chain
|
||||||
|
self.settings = settings
|
||||||
|
self.coin_clients = {}
|
||||||
|
self.mxDB = threading.RLock()
|
||||||
|
self.debug = self.settings.get('debug', cfg.DEBUG)
|
||||||
|
|
||||||
|
self.prepareLogging()
|
||||||
|
self.log.info('Network: {}'.format(self.chain))
|
||||||
|
|
||||||
|
def stopRunning(self, with_code=0):
|
||||||
|
self.fail_code = with_code
|
||||||
|
self.is_running = False
|
||||||
|
|
||||||
|
def prepareLogging(self):
|
||||||
|
self.log = logging.getLogger(self.log_name)
|
||||||
|
self.log.propagate = False
|
||||||
|
|
||||||
|
formatter = logging.Formatter('%(asctime)s %(levelname)s : %(message)s')
|
||||||
|
stream_stdout = logging.StreamHandler()
|
||||||
|
if self.log_name != 'BasicSwap':
|
||||||
|
stream_stdout.setFormatter(logging.Formatter('%(asctime)s %(name)s %(levelname)s : %(message)s'))
|
||||||
|
else:
|
||||||
|
stream_stdout.setFormatter(formatter)
|
||||||
|
stream_fp = logging.StreamHandler(self.fp)
|
||||||
|
stream_fp.setFormatter(formatter)
|
||||||
|
|
||||||
|
self.log.setLevel(logging.DEBUG if self.debug else logging.INFO)
|
||||||
|
self.log.addHandler(stream_fp)
|
||||||
|
self.log.addHandler(stream_stdout)
|
||||||
|
|
||||||
|
def getChainClientSettings(self, coin):
|
||||||
|
try:
|
||||||
|
return self.settings['chainclients'][chainparams[coin]['name']]
|
||||||
|
except Exception:
|
||||||
|
return {}
|
||||||
|
|
||||||
|
def setDaemonPID(self, name, pid):
|
||||||
|
if isinstance(name, Coins):
|
||||||
|
self.coin_clients[name]['pid'] = pid
|
||||||
|
return
|
||||||
|
for c, v in self.coin_clients.items():
|
||||||
|
if v['name'] == name:
|
||||||
|
v['pid'] = pid
|
||||||
|
|
||||||
|
def getChainDatadirPath(self, coin):
|
||||||
|
datadir = self.coin_clients[coin]['datadir']
|
||||||
|
testnet_name = '' if self.chain == 'mainnet' else chainparams[coin][self.chain].get('name', self.chain)
|
||||||
|
return os.path.join(datadir, testnet_name)
|
||||||
|
|
||||||
|
def getTicker(self, coin_type):
|
||||||
|
ticker = chainparams[coin_type]['ticker']
|
||||||
|
if self.chain == 'testnet':
|
||||||
|
ticker = 't' + ticker
|
||||||
|
if self.chain == 'regtest':
|
||||||
|
ticker = 'rt' + ticker
|
||||||
|
return ticker
|
||||||
|
|
||||||
|
def callrpc(self, method, params=[], wallet=None):
|
||||||
|
return callrpc(self.coin_clients[Coins.PART]['rpcport'], self.coin_clients[Coins.PART]['rpcauth'], method, params, wallet)
|
||||||
|
|
||||||
|
def callcoinrpc(self, coin, method, params=[], wallet=None):
|
||||||
|
return callrpc(self.coin_clients[coin]['rpcport'], self.coin_clients[coin]['rpcauth'], method, params, wallet)
|
||||||
|
|
||||||
|
def calltx(self, cmd):
|
||||||
|
bindir = self.coin_clients[Coins.PART]['bindir']
|
||||||
|
command_tx = os.path.join(bindir, cfg.PARTICL_TX)
|
||||||
|
chainname = '' if self.chain == 'mainnet' else (' -' + self.chain)
|
||||||
|
args = command_tx + chainname + ' ' + cmd
|
||||||
|
p = subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
|
||||||
|
out = p.communicate()
|
||||||
|
if len(out[1]) > 0:
|
||||||
|
raise ValueError('TX error ' + str(out[1]))
|
||||||
|
return out[0].decode('utf-8').strip()
|
||||||
|
|
||||||
|
def callcoincli(self, coin_type, params, wallet=None, timeout=None):
|
||||||
|
bindir = self.coin_clients[coin_type]['bindir']
|
||||||
|
datadir = self.coin_clients[coin_type]['datadir']
|
||||||
|
command_cli = os.path.join(bindir, chainparams[coin_type]['name'] + '-cli' + ('.exe' if os.name == 'nt' else ''))
|
||||||
|
chainname = '' if self.chain == 'mainnet' else (' -' + self.chain)
|
||||||
|
args = command_cli + chainname + ' ' + '-datadir=' + datadir + ' ' + params
|
||||||
|
p = subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
|
||||||
|
out = p.communicate(timeout=timeout)
|
||||||
|
if len(out[1]) > 0:
|
||||||
|
raise ValueError('CLI error ' + str(out[1]))
|
||||||
|
return out[0].decode('utf-8').strip()
|
@ -9,11 +9,8 @@ import re
|
|||||||
import time
|
import time
|
||||||
import datetime as dt
|
import datetime as dt
|
||||||
import zmq
|
import zmq
|
||||||
import threading
|
|
||||||
import traceback
|
import traceback
|
||||||
import hashlib
|
import hashlib
|
||||||
import subprocess
|
|
||||||
import logging
|
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
import shutil
|
import shutil
|
||||||
import json
|
import json
|
||||||
@ -25,7 +22,6 @@ from enum import IntEnum, auto
|
|||||||
from . import __version__
|
from . import __version__
|
||||||
from .util import (
|
from .util import (
|
||||||
COIN,
|
COIN,
|
||||||
callrpc,
|
|
||||||
pubkeyToAddress,
|
pubkeyToAddress,
|
||||||
format8,
|
format8,
|
||||||
encodeAddress,
|
encodeAddress,
|
||||||
@ -63,9 +59,7 @@ from .db import (
|
|||||||
from .explorers import ExplorerInsight, ExplorerBitAps, ExplorerChainz
|
from .explorers import ExplorerInsight, ExplorerBitAps, ExplorerChainz
|
||||||
import basicswap.config as cfg
|
import basicswap.config as cfg
|
||||||
import basicswap.segwit_addr as segwit_addr
|
import basicswap.segwit_addr as segwit_addr
|
||||||
|
from .base import BaseApp
|
||||||
|
|
||||||
DEBUG = True
|
|
||||||
|
|
||||||
|
|
||||||
MIN_OFFER_VALID_TIME = 60 * 10
|
MIN_OFFER_VALID_TIME = 60 * 10
|
||||||
@ -303,19 +297,9 @@ def replaceAddrPrefix(addr, coin_type, chain_name, addr_type='pubkey_address'):
|
|||||||
return encodeAddress(bytes((chainparams[coin_type][chain_name][addr_type],)) + decodeAddress(addr)[1:])
|
return encodeAddress(bytes((chainparams[coin_type][chain_name][addr_type],)) + decodeAddress(addr)[1:])
|
||||||
|
|
||||||
|
|
||||||
class BasicSwap():
|
class BasicSwap(BaseApp):
|
||||||
def __init__(self, fp, data_dir, settings, chain, log_name='BasicSwap'):
|
def __init__(self, fp, data_dir, settings, chain, log_name='BasicSwap'):
|
||||||
self.log_name = log_name
|
super().__init__(fp, data_dir, settings, chain, log_name)
|
||||||
self.fp = fp
|
|
||||||
self.is_running = True
|
|
||||||
self.fail_code = 0
|
|
||||||
|
|
||||||
self.data_dir = data_dir
|
|
||||||
self.chain = chain
|
|
||||||
self.settings = settings
|
|
||||||
self.coin_clients = {}
|
|
||||||
self.mxDB = threading.RLock()
|
|
||||||
self.debug = self.settings.get('debug', DEBUG)
|
|
||||||
|
|
||||||
self.check_progress_seconds = self.settings.get('check_progress_seconds', 60)
|
self.check_progress_seconds = self.settings.get('check_progress_seconds', 60)
|
||||||
self.check_watched_seconds = self.settings.get('check_watched_seconds', 60)
|
self.check_watched_seconds = self.settings.get('check_watched_seconds', 60)
|
||||||
@ -339,9 +323,6 @@ class BasicSwap():
|
|||||||
self.SMSG_SECONDS_IN_DAY = 86400
|
self.SMSG_SECONDS_IN_DAY = 86400
|
||||||
self.SMSG_SECONDS_IN_HOUR = 60 * 60
|
self.SMSG_SECONDS_IN_HOUR = 60 * 60
|
||||||
|
|
||||||
self.prepareLogging()
|
|
||||||
self.log.info('Network: {}'.format(self.chain))
|
|
||||||
|
|
||||||
# Encode key to match network
|
# Encode key to match network
|
||||||
wif_prefix = chainparams[Coins.PART][self.chain]['key_prefix']
|
wif_prefix = chainparams[Coins.PART][self.chain]['key_prefix']
|
||||||
self.network_key = toWIF(wif_prefix, decodeWif(self.settings['network_key']))
|
self.network_key = toWIF(wif_prefix, decodeWif(self.settings['network_key']))
|
||||||
@ -407,29 +388,6 @@ class BasicSwap():
|
|||||||
|
|
||||||
random.seed(secrets.randbits(128))
|
random.seed(secrets.randbits(128))
|
||||||
|
|
||||||
def prepareLogging(self):
|
|
||||||
self.log = logging.getLogger(self.log_name)
|
|
||||||
self.log.propagate = False
|
|
||||||
|
|
||||||
formatter = logging.Formatter('%(asctime)s %(levelname)s : %(message)s')
|
|
||||||
stream_stdout = logging.StreamHandler()
|
|
||||||
if self.log_name != 'BasicSwap':
|
|
||||||
stream_stdout.setFormatter(logging.Formatter('%(asctime)s %(name)s %(levelname)s : %(message)s'))
|
|
||||||
else:
|
|
||||||
stream_stdout.setFormatter(formatter)
|
|
||||||
stream_fp = logging.StreamHandler(self.fp)
|
|
||||||
stream_fp.setFormatter(formatter)
|
|
||||||
|
|
||||||
self.log.setLevel(logging.DEBUG if self.debug else logging.INFO)
|
|
||||||
self.log.addHandler(stream_fp)
|
|
||||||
self.log.addHandler(stream_stdout)
|
|
||||||
|
|
||||||
def getChainClientSettings(self, coin):
|
|
||||||
try:
|
|
||||||
return self.settings['chainclients'][chainparams[coin]['name']]
|
|
||||||
except Exception:
|
|
||||||
return {}
|
|
||||||
|
|
||||||
def setCoinConnectParams(self, coin):
|
def setCoinConnectParams(self, coin):
|
||||||
# Set anything that does not require the daemon to be running
|
# Set anything that does not require the daemon to be running
|
||||||
chain_client_settings = self.getChainClientSettings(coin)
|
chain_client_settings = self.getChainClientSettings(coin)
|
||||||
@ -476,19 +434,6 @@ class BasicSwap():
|
|||||||
'chain_lookups': chain_client_settings.get('chain_lookups', 'local'),
|
'chain_lookups': chain_client_settings.get('chain_lookups', 'local'),
|
||||||
}
|
}
|
||||||
|
|
||||||
def setDaemonPID(self, name, pid):
|
|
||||||
if isinstance(name, Coins):
|
|
||||||
self.coin_clients[name]['pid'] = pid
|
|
||||||
return
|
|
||||||
for c, v in self.coin_clients.items():
|
|
||||||
if v['name'] == name:
|
|
||||||
v['pid'] = pid
|
|
||||||
|
|
||||||
def getChainDatadirPath(self, coin):
|
|
||||||
datadir = self.coin_clients[coin]['datadir']
|
|
||||||
testnet_name = '' if self.chain == 'mainnet' else chainparams[coin][self.chain].get('name', self.chain)
|
|
||||||
return os.path.join(datadir, testnet_name)
|
|
||||||
|
|
||||||
def setCoinRunParams(self, coin):
|
def setCoinRunParams(self, coin):
|
||||||
cc = self.coin_clients[coin]
|
cc = self.coin_clients[coin]
|
||||||
if cc['connection_type'] == 'rpc' and cc['rpcauth'] is None:
|
if cc['connection_type'] == 'rpc' and cc['rpcauth'] is None:
|
||||||
@ -573,10 +518,6 @@ class BasicSwap():
|
|||||||
if self.coin_clients[c]['connection_type'] == 'rpc' and chain_client_settings['manage_daemon'] is True:
|
if self.coin_clients[c]['connection_type'] == 'rpc' and chain_client_settings['manage_daemon'] is True:
|
||||||
self.stopDaemon(c)
|
self.stopDaemon(c)
|
||||||
|
|
||||||
def stopRunning(self, with_code=0):
|
|
||||||
self.fail_code = with_code
|
|
||||||
self.is_running = False
|
|
||||||
|
|
||||||
def upgradeDatabase(self, db_version):
|
def upgradeDatabase(self, db_version):
|
||||||
if db_version >= CURRENT_DB_VERSION:
|
if db_version >= CURRENT_DB_VERSION:
|
||||||
return
|
return
|
||||||
@ -930,14 +871,6 @@ class BasicSwap():
|
|||||||
except Exception:
|
except Exception:
|
||||||
return self.callcoinrpc(coin_type, 'getnetworkinfo')['relayfee']
|
return self.callcoinrpc(coin_type, 'getnetworkinfo')['relayfee']
|
||||||
|
|
||||||
def getTicker(self, coin_type):
|
|
||||||
ticker = chainparams[coin_type]['ticker']
|
|
||||||
if self.chain == 'testnet':
|
|
||||||
ticker = 't' + ticker
|
|
||||||
if self.chain == 'regtest':
|
|
||||||
ticker = 'rt' + ticker
|
|
||||||
return ticker
|
|
||||||
|
|
||||||
def withdrawCoin(self, coin_type, value, addr_to, subfee):
|
def withdrawCoin(self, coin_type, value, addr_to, subfee):
|
||||||
self.log.info('withdrawCoin %s %s to %s %s', value, self.getTicker(coin_type), addr_to, ' subfee' if subfee else '')
|
self.log.info('withdrawCoin %s %s to %s %s', value, self.getTicker(coin_type), addr_to, ' subfee' if subfee else '')
|
||||||
params = [addr_to, value, '', '', subfee, True, self.coin_clients[coin_type]['conf_target']]
|
params = [addr_to, value, '', '', subfee, True, self.coin_clients[coin_type]['conf_target']]
|
||||||
@ -2670,32 +2603,3 @@ class BasicSwap():
|
|||||||
session.close()
|
session.close()
|
||||||
session.remove()
|
session.remove()
|
||||||
self.mxDB.release()
|
self.mxDB.release()
|
||||||
|
|
||||||
def callrpc(self, method, params=[], wallet=None):
|
|
||||||
return callrpc(self.coin_clients[Coins.PART]['rpcport'], self.coin_clients[Coins.PART]['rpcauth'], method, params, wallet)
|
|
||||||
|
|
||||||
def callcoinrpc(self, coin, method, params=[], wallet=None):
|
|
||||||
return callrpc(self.coin_clients[coin]['rpcport'], self.coin_clients[coin]['rpcauth'], method, params, wallet)
|
|
||||||
|
|
||||||
def calltx(self, cmd):
|
|
||||||
bindir = self.coin_clients[Coins.PART]['bindir']
|
|
||||||
command_tx = os.path.join(bindir, cfg.PARTICL_TX)
|
|
||||||
chainname = '' if self.chain == 'mainnet' else (' -' + self.chain)
|
|
||||||
args = command_tx + chainname + ' ' + cmd
|
|
||||||
p = subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
|
|
||||||
out = p.communicate()
|
|
||||||
if len(out[1]) > 0:
|
|
||||||
raise ValueError('TX error ' + str(out[1]))
|
|
||||||
return out[0].decode('utf-8').strip()
|
|
||||||
|
|
||||||
def callcoincli(self, coin_type, params, wallet=None, timeout=None):
|
|
||||||
bindir = self.coin_clients[coin_type]['bindir']
|
|
||||||
datadir = self.coin_clients[coin_type]['datadir']
|
|
||||||
command_cli = os.path.join(bindir, chainparams[coin_type]['name'] + '-cli' + ('.exe' if os.name == 'nt' else ''))
|
|
||||||
chainname = '' if self.chain == 'mainnet' else (' -' + self.chain)
|
|
||||||
args = command_cli + chainname + ' ' + '-datadir=' + datadir + ' ' + params
|
|
||||||
p = subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
|
|
||||||
out = p.communicate(timeout=timeout)
|
|
||||||
if len(out[1]) > 0:
|
|
||||||
raise ValueError('CLI error ' + str(out[1]))
|
|
||||||
return out[0].decode('utf-8').strip()
|
|
||||||
|
@ -6,6 +6,8 @@
|
|||||||
|
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
DEBUG = True
|
||||||
|
|
||||||
DATADIRS = os.path.expanduser(os.getenv('DATADIRS', '/tmp/basicswap'))
|
DATADIRS = os.path.expanduser(os.getenv('DATADIRS', '/tmp/basicswap'))
|
||||||
|
|
||||||
PARTICL_BINDIR = os.path.expanduser(os.getenv('PARTICL_BINDIR', ''))
|
PARTICL_BINDIR = os.path.expanduser(os.getenv('PARTICL_BINDIR', ''))
|
||||||
|
@ -598,7 +598,7 @@ class Test(unittest.TestCase):
|
|||||||
|
|
||||||
self.wait_for_offer(swap_clients[1], offer_id)
|
self.wait_for_offer(swap_clients[1], offer_id)
|
||||||
offers = swap_clients[1].listOffers()
|
offers = swap_clients[1].listOffers()
|
||||||
assert(len(offers) == 1)
|
assert(len(offers) >= 1)
|
||||||
for offer in offers:
|
for offer in offers:
|
||||||
if offer.offer_id == offer_id:
|
if offer.offer_id == offer_id:
|
||||||
bid_id = swap_clients[1].postBid(offer_id, offer.amount_from)
|
bid_id = swap_clients[1].postBid(offer_id, offer.amount_from)
|
||||||
|
2
tests/lint/spelling.ignore-words.txt
Normal file
2
tests/lint/spelling.ignore-words.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
eventtypes
|
||||||
|
|
Loading…
Reference in New Issue
Block a user