mirror of
https://github.com/basicswap/basicswap.git
synced 2025-01-03 17:29:26 +00:00
Update dockerfile.
This commit is contained in:
parent
0823e79e4d
commit
dca9f08833
9 changed files with 75 additions and 26 deletions
|
@ -7,7 +7,7 @@ lint_task:
|
||||||
- pip install codespell
|
- pip install codespell
|
||||||
script:
|
script:
|
||||||
- PYTHONWARNINGS="ignore" flake8 --ignore=E501,F841,W503 --exclude=basicswap/contrib,messages_pb2.py,.eggs
|
- PYTHONWARNINGS="ignore" flake8 --ignore=E501,F841,W503 --exclude=basicswap/contrib,messages_pb2.py,.eggs
|
||||||
- codespell --check-filenames --disable-colors --quiet-level=7 --ignore-words=tests/lint/spelling.ignore-words.txt -S .git,.eggs,gitianpubkeys,*.pyc,*mnemonics.py,basicswap/contrib
|
- codespell --check-filenames --disable-colors --quiet-level=7 --ignore-words=tests/lint/spelling.ignore-words.txt -S .git,.eggs,gitianpubkeys,*.pyc,*basicswap/contrib,*mnemonics.py
|
||||||
|
|
||||||
test_task:
|
test_task:
|
||||||
environment:
|
environment:
|
||||||
|
|
15
Dockerfile
15
Dockerfile
|
@ -1,10 +1,19 @@
|
||||||
FROM ubuntu:18.10
|
FROM ubuntu:20.04
|
||||||
|
|
||||||
|
ARG WITH_COINS
|
||||||
|
ARG WITHOUT_COINS
|
||||||
|
|
||||||
ENV LANG=C.UTF-8 \
|
ENV LANG=C.UTF-8 \
|
||||||
|
DEBIAN_FRONTEND=noninteractive \
|
||||||
DATADIRS="/coindata"
|
DATADIRS="/coindata"
|
||||||
|
|
||||||
RUN apt-get update; \
|
RUN apt-get update; \
|
||||||
apt-get install -y wget python3-pip gnupg unzip protobuf-compiler;
|
apt-get install -y wget python3-pip gnupg unzip protobuf-compiler automake libtool pkg-config;
|
||||||
|
|
||||||
|
RUN wget -O coincurve-anonswap.zip https://github.com/tecnovert/coincurve/archive/anonswap.zip && \
|
||||||
|
unzip coincurve-anonswap.zip && \
|
||||||
|
cd coincurve-anonswap && \
|
||||||
|
python3 setup.py install --force
|
||||||
|
|
||||||
# TODO: move coindata dir out of src dir
|
# TODO: move coindata dir out of src dir
|
||||||
COPY . basicswap-master
|
COPY . basicswap-master
|
||||||
|
@ -13,7 +22,7 @@ RUN cd basicswap-master; \
|
||||||
pip3 install .;
|
pip3 install .;
|
||||||
|
|
||||||
# Download binaries, these will be part of the docker image
|
# Download binaries, these will be part of the docker image
|
||||||
RUN basicswap-prepare -datadir=/opt -preparebinonly
|
RUN basicswap-prepare -datadir=/opt -preparebinonly ${WITH_COINS} ${WITHOUT_COINS}
|
||||||
|
|
||||||
RUN useradd -ms /bin/bash user && \
|
RUN useradd -ms /bin/bash user && \
|
||||||
mkdir /coindata && chown user -R /coindata
|
mkdir /coindata && chown user -R /coindata
|
||||||
|
|
|
@ -211,6 +211,8 @@ def strOfferState(state):
|
||||||
def strBidState(state):
|
def strBidState(state):
|
||||||
if state == BidStates.BID_SENT:
|
if state == BidStates.BID_SENT:
|
||||||
return 'Sent'
|
return 'Sent'
|
||||||
|
if state == BidStates.BID_RECEIVING:
|
||||||
|
return 'Receiving'
|
||||||
if state == BidStates.BID_RECEIVED:
|
if state == BidStates.BID_RECEIVED:
|
||||||
return 'Received'
|
return 'Received'
|
||||||
if state == BidStates.BID_ACCEPTED:
|
if state == BidStates.BID_ACCEPTED:
|
||||||
|
@ -227,6 +229,28 @@ def strBidState(state):
|
||||||
return 'Abandoned'
|
return 'Abandoned'
|
||||||
if state == BidStates.BID_ERROR:
|
if state == BidStates.BID_ERROR:
|
||||||
return 'Error'
|
return 'Error'
|
||||||
|
if state == BidStates.XMR_SWAP_SCRIPT_COIN_LOCKED:
|
||||||
|
return 'Script coin locked'
|
||||||
|
if state == BidStates.XMR_SWAP_HAVE_SCRIPT_COIN_SPEND_TX:
|
||||||
|
return 'Script coin spend tx valid'
|
||||||
|
if state == BidStates.XMR_SWAP_NOSCRIPT_COIN_LOCKED:
|
||||||
|
return 'Scriptless coin locked'
|
||||||
|
if state == BidStates.XMR_SWAP_SECRET_SHARED:
|
||||||
|
return 'Secret shared'
|
||||||
|
if state == BidStates.XMR_SWAP_SCRIPT_TX_REDEEMED:
|
||||||
|
return 'Script tx redeemed'
|
||||||
|
if state == BidStates.XMR_SWAP_NOSCRIPT_TX_REDEEMED:
|
||||||
|
return 'Scriptless tx redeemed'
|
||||||
|
if state == BidStates.XMR_SWAP_NOSCRIPT_TX_RECOVERED:
|
||||||
|
return 'Scriptless tx recovered'
|
||||||
|
if state == BidStates.XMR_SWAP_FAILED_REFUNDED:
|
||||||
|
return 'Failed, refunded'
|
||||||
|
if state == BidStates.XMR_SWAP_FAILED_SWIPED:
|
||||||
|
return 'Failed, swiped'
|
||||||
|
if state == BidStates.XMR_SWAP_FAILED:
|
||||||
|
return 'Failed'
|
||||||
|
if state == BidStates.SWAP_DELAYING:
|
||||||
|
return 'Delaying'
|
||||||
return 'Unknown'
|
return 'Unknown'
|
||||||
|
|
||||||
|
|
||||||
|
@ -2359,7 +2383,7 @@ class BasicSwap(BaseApp):
|
||||||
|
|
||||||
found_tx = ci_to.findTxB(xmr_swap.vkbv, xmr_swap.pkbs, bid.amount_to, ci_to.blocks_confirmed, xmr_swap.b_restore_height)
|
found_tx = ci_to.findTxB(xmr_swap.vkbv, xmr_swap.pkbs, bid.amount_to, ci_to.blocks_confirmed, xmr_swap.b_restore_height)
|
||||||
if found_tx is not None:
|
if found_tx is not None:
|
||||||
|
self.log.debug('Found {} lock tx in chain'.format(ci_to.coin_name()))
|
||||||
if bid.xmr_b_lock_tx is None:
|
if bid.xmr_b_lock_tx is None:
|
||||||
b_lock_tx_id = bytes.fromhex(found_tx['txid'])
|
b_lock_tx_id = bytes.fromhex(found_tx['txid'])
|
||||||
bid.xmr_b_lock_tx = SwapTx(
|
bid.xmr_b_lock_tx = SwapTx(
|
||||||
|
@ -2383,7 +2407,7 @@ class BasicSwap(BaseApp):
|
||||||
# Wait for script spend tx to confirm
|
# Wait for script spend tx to confirm
|
||||||
# TODO: Use explorer to get tx / block hash for getrawtransaction
|
# TODO: Use explorer to get tx / block hash for getrawtransaction
|
||||||
pass
|
pass
|
||||||
elif state == BidStates.XMR_SWAP_SCRIPT_TX_REDEEMED:
|
elif state == BidStates.XMR_SWAP_NOSCRIPT_TX_REDEEMED:
|
||||||
txid_hex = bid.xmr_b_lock_tx.spend_txid.hex()
|
txid_hex = bid.xmr_b_lock_tx.spend_txid.hex()
|
||||||
|
|
||||||
found_tx = ci_to.findTxnByHash(txid_hex)
|
found_tx = ci_to.findTxnByHash(txid_hex)
|
||||||
|
@ -2741,6 +2765,7 @@ class BasicSwap(BaseApp):
|
||||||
|
|
||||||
else:
|
else:
|
||||||
self.log.info('Coin a lock refund spent by unknown tx, bid {}'.format(bid_id.hex()))
|
self.log.info('Coin a lock refund spent by unknown tx, bid {}'.format(bid_id.hex()))
|
||||||
|
bid.setState(BidStates.XMR_SWAP_FAILED_SWIPED)
|
||||||
|
|
||||||
self.saveBidInSession(bid_id, bid, session, xmr_swap)
|
self.saveBidInSession(bid_id, bid, session, xmr_swap)
|
||||||
# Update copy of bid in swaps_in_progress
|
# Update copy of bid in swaps_in_progress
|
||||||
|
@ -2835,7 +2860,7 @@ class BasicSwap(BaseApp):
|
||||||
try:
|
try:
|
||||||
session = scoped_session(self.session_factory)
|
session = scoped_session(self.session_factory)
|
||||||
|
|
||||||
q = session.query(EventQueue).filter(EventQueue.trigger_at >= now)
|
q = session.query(EventQueue).filter(sa.and_(EventQueue.active_ind == 1, EventQueue.trigger_at <= now))
|
||||||
for row in q:
|
for row in q:
|
||||||
try:
|
try:
|
||||||
if row.event_type == EventTypes.ACCEPT_BID:
|
if row.event_type == EventTypes.ACCEPT_BID:
|
||||||
|
@ -2860,7 +2885,11 @@ class BasicSwap(BaseApp):
|
||||||
if self.debug:
|
if self.debug:
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
self.log.error('checkEvents failed: {}'.format(str(ex)))
|
self.log.error('checkEvents failed: {}'.format(str(ex)))
|
||||||
session.delete(row)
|
|
||||||
|
if self.debug:
|
||||||
|
session.execute('UPDATE eventqueue SET active_ind = 2 WHERE trigger_at <= {}'.format(now))
|
||||||
|
else:
|
||||||
|
session.execute('DELETE FROM eventqueue WHERE trigger_at <= {}'.format(now))
|
||||||
|
|
||||||
session.commit()
|
session.commit()
|
||||||
finally:
|
finally:
|
||||||
|
@ -3683,6 +3712,7 @@ class BasicSwap(BaseApp):
|
||||||
txid = ci_to.spendBLockTx(address_to, xmr_swap.vkbv, vkbs, bid.amount_to, xmr_offer.b_fee_rate, xmr_swap.b_restore_height)
|
txid = ci_to.spendBLockTx(address_to, xmr_swap.vkbv, vkbs, bid.amount_to, xmr_offer.b_fee_rate, xmr_swap.b_restore_height)
|
||||||
|
|
||||||
bid.xmr_b_lock_tx.spend_txid = txid
|
bid.xmr_b_lock_tx.spend_txid = txid
|
||||||
|
bid.setState(BidStates.XMR_SWAP_NOSCRIPT_TX_REDEEMED)
|
||||||
# TODO: Why does using bid.txns error here?
|
# TODO: Why does using bid.txns error here?
|
||||||
self.saveBidInSession(bid_id, bid, session, xmr_swap)
|
self.saveBidInSession(bid_id, bid, session, xmr_swap)
|
||||||
# Update copy of bid in swaps_in_progress
|
# Update copy of bid in swaps_in_progress
|
||||||
|
|
|
@ -198,3 +198,6 @@ class CoinInterface:
|
||||||
|
|
||||||
def coin_name(self):
|
def coin_name(self):
|
||||||
return chainparams[self.coin_type()]['name'].capitalize()
|
return chainparams[self.coin_type()]['name'].capitalize()
|
||||||
|
|
||||||
|
def ticker(self):
|
||||||
|
return chainparams[self.coin_type()]['ticker']
|
||||||
|
|
1
basicswap/contrib/__init__.py
Normal file
1
basicswap/contrib/__init__.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
|
|
@ -166,6 +166,8 @@ class XMRInterface(CoinInterface):
|
||||||
params = {'out': True, 'pending': True, 'failed': True, 'pool': True, }
|
params = {'out': True, 'pending': True, 'failed': True, 'pool': True, }
|
||||||
rv = self.rpc_wallet_cb('get_transfers', params)
|
rv = self.rpc_wallet_cb('get_transfers', params)
|
||||||
logging.info('[rm] get_transfers {}'.format(dumpj(rv)))
|
logging.info('[rm] get_transfers {}'.format(dumpj(rv)))
|
||||||
|
if 'pending' not in rv:
|
||||||
|
break
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
|
|
||||||
return tx_hash
|
return tx_hash
|
||||||
|
|
|
@ -48,7 +48,7 @@ def setCoinFilter(form_data, field_name):
|
||||||
raise ValueError('Unknown Coin Type {}'.format(str(field_name)))
|
raise ValueError('Unknown Coin Type {}'.format(str(field_name)))
|
||||||
|
|
||||||
|
|
||||||
def getTxIdHex(bid, tx_type, prefix):
|
def getTxIdHex(bid, tx_type, suffix):
|
||||||
if tx_type == TxTypes.ITX:
|
if tx_type == TxTypes.ITX:
|
||||||
obj = bid.initiate_tx
|
obj = bid.initiate_tx
|
||||||
elif tx_type == TxTypes.PTX:
|
elif tx_type == TxTypes.PTX:
|
||||||
|
@ -60,7 +60,7 @@ def getTxIdHex(bid, tx_type, prefix):
|
||||||
return 'None'
|
return 'None'
|
||||||
if not obj.txid:
|
if not obj.txid:
|
||||||
return 'None'
|
return 'None'
|
||||||
return obj.txid.hex() + prefix
|
return obj.txid.hex() + suffix
|
||||||
|
|
||||||
|
|
||||||
def getTxSpendHex(bid, tx_type):
|
def getTxSpendHex(bid, tx_type):
|
||||||
|
@ -86,13 +86,10 @@ def listBidStates():
|
||||||
|
|
||||||
|
|
||||||
def describeBid(swap_client, bid, offer, edit_bid, show_txns):
|
def describeBid(swap_client, bid, offer, edit_bid, show_txns):
|
||||||
|
ci_from = swap_client.ci(Coins(offer.coin_from))
|
||||||
coin_from = Coins(offer.coin_from)
|
ci_to = swap_client.ci(Coins(offer.coin_to))
|
||||||
coin_to = Coins(offer.coin_to)
|
ticker_from = ci_from.ticker()
|
||||||
ci_from = swap_client.ci(coin_from)
|
ticker_to = ci_to.ticker()
|
||||||
ci_to = swap_client.ci(coin_to)
|
|
||||||
ticker_from = swap_client.getTicker(coin_from)
|
|
||||||
ticker_to = swap_client.getTicker(coin_to)
|
|
||||||
|
|
||||||
if bid.state == BidStates.BID_SENT:
|
if bid.state == BidStates.BID_SENT:
|
||||||
state_description = 'Waiting for seller to accept.'
|
state_description = 'Waiting for seller to accept.'
|
||||||
|
|
|
@ -227,8 +227,8 @@ def prepareCore(coin, version, settings, data_dir):
|
||||||
pubkeyurl = 'https://raw.githubusercontent.com/monero-project/monero/master/utils/gpg_keys/binaryfate.asc'
|
pubkeyurl = 'https://raw.githubusercontent.com/monero-project/monero/master/utils/gpg_keys/binaryfate.asc'
|
||||||
logger.info('Importing public key from url: ' + pubkeyurl)
|
logger.info('Importing public key from url: ' + pubkeyurl)
|
||||||
rv = gpg.import_keys(urllib.request.urlopen(pubkeyurl).read())
|
rv = gpg.import_keys(urllib.request.urlopen(pubkeyurl).read())
|
||||||
assert('F0AF4D462A0BDF92' in rv)
|
|
||||||
print('import_keys', rv)
|
print('import_keys', rv)
|
||||||
|
assert('F0AF4D462A0BDF92' in rv.fingerprints[0])
|
||||||
with open(assert_path, 'rb') as fp:
|
with open(assert_path, 'rb') as fp:
|
||||||
verified = gpg.verify_file(fp)
|
verified = gpg.verify_file(fp)
|
||||||
else:
|
else:
|
||||||
|
@ -395,15 +395,19 @@ def main():
|
||||||
if name == 'particl_mnemonic':
|
if name == 'particl_mnemonic':
|
||||||
particl_wallet_mnemonic = s[1].strip('"')
|
particl_wallet_mnemonic = s[1].strip('"')
|
||||||
continue
|
continue
|
||||||
if name == 'withcoin':
|
if name == 'withcoin' or name == 'withcoins':
|
||||||
if s[1] not in known_coins:
|
coins = s[1].split(',')
|
||||||
exitWithError('Unknown coin {}'.format(s[1]))
|
for coin in coins:
|
||||||
with_coins.add(s[1])
|
if coin not in known_coins:
|
||||||
|
exitWithError('Unknown coin {}'.format(coin))
|
||||||
|
with_coins.add(coin)
|
||||||
continue
|
continue
|
||||||
if name == 'withoutcoin':
|
if name == 'withoutcoin' or name == 'withoutcoins':
|
||||||
if s[1] not in known_coins:
|
coins = s[1].split(',')
|
||||||
exitWithError('Unknown coin {}'.format(s[1]))
|
for coin in coins:
|
||||||
with_coins.discard(s[1])
|
if coin not in known_coins:
|
||||||
|
exitWithError('Unknown coin {}'.format(coin))
|
||||||
|
with_coins.discard(coin)
|
||||||
continue
|
continue
|
||||||
if name == 'addcoin':
|
if name == 'addcoin':
|
||||||
if s[1] not in known_coins:
|
if s[1] not in known_coins:
|
||||||
|
|
|
@ -5,6 +5,9 @@ services:
|
||||||
stop_grace_period: 5m
|
stop_grace_period: 5m
|
||||||
build:
|
build:
|
||||||
context: ../
|
context: ../
|
||||||
|
args:
|
||||||
|
- WITH_COINS=--withcoins=monero
|
||||||
|
- WITHOUT_COINS=--withoutcoins=litecoin
|
||||||
volumes:
|
volumes:
|
||||||
- ${COINDATA_PATH}:/coindata
|
- ${COINDATA_PATH}:/coindata
|
||||||
ports:
|
ports:
|
||||||
|
|
Loading…
Reference in a new issue