#!/usr/bin/env python3 from future.utils import iteritems import random from jmbase import get_log, jmprint from jmbase.support import lookup_appdata_folder from jmclient import YieldGeneratorBasic, ygmain, jm_single # This is a maker for the purposes of generating a yield from held bitcoins # while maximising the difficulty of spying on blockchain activity. # This is primarily attempted by randomizing all aspects of orders # after transactions wherever possible. # YIELD GENERATOR SETTINGS ARE NOW IN YOUR joinmarket.cfg CONFIG FILE # (You can also use command line flags; see --help for this script). jlog = get_log() class YieldGeneratorPrivacyEnhanced(YieldGeneratorBasic): def __init__(self, wallet_service, offerconfig): super().__init__(wallet_service, offerconfig) def create_my_orders(self): mix_balance = self.get_available_mixdepths() # We publish ONLY the maximum amount and use minsize for lower bound; # leave it to oid_to_order to figure out the right depth to use. f = '0' if self.ordertype in ['swreloffer', 'sw0reloffer']: f = self.cjfee_r elif self.ordertype in ['swabsoffer', 'sw0absoffer']: f = str(self.txfee + self.cjfee_a) mix_balance = dict([(m, b) for m, b in iteritems(mix_balance) if b > self.minsize]) if len(mix_balance) == 0: jlog.error('You do not have the minimum required amount of coins' ' to be a maker: ' + str(self.minsize) + \ '\nTry setting txfee to zero and/or lowering the minsize.') return [] max_mix = max(mix_balance, key=mix_balance.get) # randomizing the different values randomize_txfee = int(random.uniform(self.txfee * (1 - float(self.txfee_factor)), self.txfee * (1 + float(self.txfee_factor)))) randomize_minsize = int(random.uniform(self.minsize * (1 - float(self.size_factor)), self.minsize * (1 + float(self.size_factor)))) possible_maxsize = mix_balance[max_mix] - max(jm_single().DUST_THRESHOLD, randomize_txfee) randomize_maxsize = int(random.uniform(possible_maxsize * (1 - float(self.size_factor)), possible_maxsize)) if self.ordertype in ['swabsoffer', 'sw0absoffer']: randomize_cjfee = int(random.uniform(float(self.cjfee_a) * (1 - float(self.cjfee_factor)), float(self.cjfee_a) * (1 + float(self.cjfee_factor)))) randomize_cjfee = randomize_cjfee + randomize_txfee else: randomize_cjfee = random.uniform(float(f) * (1 - float(self.cjfee_factor)), float(f) * (1 + float(self.cjfee_factor))) randomize_cjfee = "{0:.6f}".format(randomize_cjfee) # round to 6 decimals order = {'oid': 0, 'ordertype': self.ordertype, 'minsize': randomize_minsize, 'maxsize': randomize_maxsize, 'txfee': randomize_txfee, 'cjfee': str(randomize_cjfee)} # sanity check assert order['minsize'] >= 0 assert order['maxsize'] > 0 assert order['minsize'] <= order['maxsize'] if order['ordertype'] in ['swreloffer', 'sw0reloffer']: while order['txfee'] >= (float(order['cjfee']) * order['minsize']): order['txfee'] = int(order['txfee'] / 2) jlog.info('Warning: too high txfee to be profitable, halfing it to: ' + str(order['txfee'])) return [order] if __name__ == "__main__": ygmain(YieldGeneratorPrivacyEnhanced, nickserv_password='') jmprint('done', "success")