Skip to content
This repository was archived by the owner on Apr 27, 2026. It is now read-only.

Commit 0cd7da5

Browse files
author
3np
committed
feat(taker): add banned_maker_ids policy config
1 parent 5246c1c commit 0cd7da5

6 files changed

Lines changed: 23 additions & 5 deletions

File tree

scripts/sendpayment.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
get_sendpayment_parser, get_max_cj_fee_values, check_regtest, \
1919
parse_payjoin_setup, send_payjoin, general_custom_change_warning, \
2020
nonwallet_custom_change_warning, sweep_custom_change_warning, \
21+
get_banned_maker_ids, \
2122
EngineError, check_and_start_tor
2223
from twisted.python.log import startLogging
2324
from jmbase.support import get_log, jmprint, \
@@ -389,6 +390,7 @@ def taker_finished(res, fromtx=False, waittime=0.0, txdetails=None):
389390
max_cj_fee=maxcjfee,
390391
callbacks=(filter_orders_callback, None, taker_finished),
391392
custom_change_address=custom_change,
393+
banned_makers=get_banned_maker_ids(),
392394
change_label=options.changelabel)
393395
clientfactory = JMClientProtocolFactory(taker)
394396

scripts/tumbler.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from twisted.python.log import startLogging
88
from jmclient import Taker, load_program_config, get_schedule,\
99
JMClientProtocolFactory, start_reactor, jm_single, get_wallet_path,\
10-
open_test_wallet_maybe, get_tumble_schedule,\
10+
open_test_wallet_maybe, get_tumble_schedule, get_banned_maker_ids, \
1111
schedule_to_text, estimate_tx_fee, restart_waiter, WalletService,\
1212
get_tumble_log, tumbler_taker_finished_update, check_regtest, \
1313
tumbler_filter_orders_callback, validate_address, get_tumbler_parser, \
@@ -187,6 +187,7 @@ def taker_finished(res, fromtx=False, waittime=0.0, txdetails=None):
187187
maxcjfee,
188188
order_chooser=options['order_choose_fn'],
189189
callbacks=(filter_orders_callback, None, taker_finished),
190+
banned_makers=get_banned_maker_ids(),
190191
tdestaddrs=destaddrs)
191192
clientfactory = JMClientProtocolFactory(taker)
192193
nodaemon = jm_single().config.getint("DAEMON", "no_daemon")

src/jmclient/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
validate_address, is_burn_destination, get_mchannels,
2929
get_blockchain_interface_instance, set_config, is_segwit_mode,
3030
is_native_segwit_mode, JMPluginService, get_interest_rate,
31+
get_banned_maker_ids,
3132
get_bondless_makers_allowance, check_and_start_tor)
3233
from .blockchaininterface import (BlockchainInterface,
3334
RegtestBitcoinCoreInterface, BitcoinCoreInterface)

src/jmclient/configure.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import sys
99
from configparser import ConfigParser, NoOptionError
1010
from signal import SIGINT
11-
from typing import Any, List, Optional, Tuple
11+
from typing import Any, List, Optional, Set, Tuple
1212

1313
import jmbitcoin as btc
1414
from jmbase.support import (get_log, joinmarket_alert, core_alert, debug_silence,
@@ -363,6 +363,10 @@ def jm_single() -> AttributeDict:
363363
# A real number, i.e. 1 = 100%, 0.125 = 1/8 = 1 in every 8 makers on average will be bondless
364364
bondless_makers_allowance = """ + _DEFAULT_BONDLESS_MAKERS_ALLOWANCE + """
365365
366+
# Allow blocking/ignoring makers by ID. These makers will not be included in taker coinjoins.
367+
# Takes a list separated by commas.
368+
# banned_maker_ids = J5Abcdefgh2,J5Ijklmnop3
369+
366370
# To (strongly) disincentivize Sybil behaviour, the value assessment of the bond
367371
# is based on the (time value of the bond)^x where x is the bond_value_exponent here,
368372
# where x > 1. It is a real number (so written as a decimal).
@@ -668,6 +672,12 @@ def get_bondless_makers_allowance() -> float:
668672
return float(global_singleton.config.get('POLICY', 'bondless_makers_allowance',
669673
fallback=_DEFAULT_BONDLESS_MAKERS_ALLOWANCE))
670674

675+
def get_banned_maker_ids() -> Set[str]:
676+
value = global_singleton.config.get('POLICY', 'banned_maker_ids', fallback='')
677+
if value == '':
678+
return set()
679+
return set(value.split(','))
680+
671681
def _remove_unwanted_default_settings(config: ConfigParser) -> None:
672682
for section in config.sections():
673683
if section.startswith('MESSAGING:'):

src/jmclient/taker.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ def __init__(self,
5353
tdestaddrs=None,
5454
custom_change_address=None,
5555
change_label=None,
56+
banned_makers=None,
5657
ignored_makers=None):
5758
"""`schedule`` must be a list of tuples: (see sample_schedule_for_testnet
5859
for explanation of syntax, also schedule.py module in this directory),
@@ -111,6 +112,7 @@ def __init__(self,
111112
#who have not responded or behaved maliciously at any
112113
#stage of the protocol.
113114
self.ignored_makers = [] if not ignored_makers else ignored_makers
115+
self.banned_makers = set([]) if not banned_makers else banned_makers
114116

115117
#Used in attempts to complete with subset after second round failure:
116118
self.honest_makers = []
@@ -289,7 +291,7 @@ def filter_orderbook(self, orderbook, sweep=False):
289291
return False
290292
self.orderbook, self.total_cj_fee = choose_orders(
291293
orderbook, self.cjamount, self.n_counterparties, self.order_chooser,
292-
self.ignored_makers, allowed_types=allowed_types,
294+
self.banned_makers.union(self.ignored_makers), allowed_types=allowed_types,
293295
max_cj_fee=self.max_cj_fee)
294296
if self.orderbook is None:
295297
#Failure to get an orderbook means order selection failed
@@ -380,7 +382,7 @@ def prepare_my_bitcoin_data(self):
380382
self.orderbook, self.cjamount, self.total_cj_fee = choose_sweep_orders(
381383
self.orderbook, total_value, self.total_txfee,
382384
self.n_counterparties, self.order_chooser,
383-
self.ignored_makers, allowed_types=allowed_types,
385+
self.banned_makers.union(self.ignored_makers), allowed_types=allowed_types,
384386
max_cj_fee=self.max_cj_fee)
385387
if not self.orderbook:
386388
self.taker_info_callback("ABORT",

src/jmclient/wallet_rpc.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
WalletService, get_wallet_path, direct_send, \
1616
open_test_wallet_maybe, wallet_display, SegwitLegacyWallet, \
1717
SegwitWallet, get_daemon_serving_params, YieldGeneratorService, \
18-
create_wallet, get_max_cj_fee_values, \
18+
create_wallet, get_max_cj_fee_values, get_banned_maker_ids, \
1919
StorageError, StoragePasswordError, JmwalletdWebSocketServerFactory, \
2020
JmwalletdWebSocketServerProtocol, RetryableStorageError, \
2121
SegwitWalletFidelityBonds, wallet_gettimelockaddress, \
@@ -1350,6 +1350,7 @@ def dummy_user_callback(rel, abs):
13501350

13511351
self.taker = Taker(self.services["wallet"], schedule,
13521352
max_cj_fee = max_cj_fee,
1353+
banned_makers=get_banned_maker_ids(),
13531354
callbacks=(self.filter_orders_callback,
13541355
None, self.taker_finished))
13551356
# TODO ; this makes use of a pre-existing hack to allow
@@ -1482,6 +1483,7 @@ def dummy_user_callback(rel, abs):
14821483
schedule,
14831484
max_cj_fee=max_cj_fee,
14841485
order_chooser=self.tumbler_options['order_choose_fn'],
1486+
banned_makers=get_banned_maker_ids(),
14851487
callbacks=(self.filter_orders_callback_tumbler, None,
14861488
self.taker_finished),
14871489
tdestaddrs=destaddrs)

0 commit comments

Comments
 (0)