def make_wallets(n, wallet_structures=None, mean_amt=1, sdev_amt=0, start_index=0, fixed_seeds=None, test_wallet=False, passwords=None, walletclass=SegwitWallet, mixdepths=5): '''n: number of wallets to be created wallet_structure: array of n arrays , each subarray specifying the number of addresses to be populated with coins at each depth (for now, this will only populate coins into 'receive' addresses) mean_amt: the number of coins (in btc units) in each address as above sdev_amt: if randomness in amouts is desired, specify here. Returns: a dict of dicts of form {0:{'seed':seed,'wallet':Wallet object},1:..,} Default Wallet constructor is joinmarket.Wallet, else use TestWallet, which takes a password parameter as in the list passwords. ''' # FIXME: this is basically the same code as jmclient/test/commontest.py if len(wallet_structures) != n: raise Exception("Number of wallets doesn't match wallet structures") if not fixed_seeds: seeds = chunks( binascii.hexlify(os.urandom(BIP32Wallet.ENTROPY_BYTES * n)), BIP32Wallet.ENTROPY_BYTES * 2) else: seeds = fixed_seeds wallets = {} for i in range(n): assert len(seeds[i]) == BIP32Wallet.ENTROPY_BYTES * 2 # FIXME: pwd is ignored (but do we really need this anyway?) if test_wallet and passwords and i < len(passwords): pwd = passwords[i] else: pwd = None w = open_test_wallet_maybe(seeds[i], seeds[i], mixdepths - 1, test_wallet_cls=walletclass) wallet_service = WalletService(w) wallets[i + start_index] = { 'seed': seeds[i].decode('ascii'), 'wallet': wallet_service } for j in range(mixdepths): for k in range(wallet_structures[i][j]): deviation = sdev_amt * random.random() amt = mean_amt - sdev_amt / 2.0 + deviation if amt < 0: amt = 0.001 amt = float(Decimal(amt).quantize(Decimal(10)**-8)) jm_single().bc_interface.grab_coins( wallet_service.get_new_addr( j, BaseWallet.ADDRESS_TYPE_INTERNAL), amt) return wallets
def make_wallets(n, wallet_structures=None, mean_amt=1, sdev_amt=0, start_index=0, fixed_seeds=None, test_wallet=False, passwords=None, walletclass=None): '''n: number of wallets to be created wallet_structure: array of n arrays , each subarray specifying the number of addresses to be populated with coins at each depth (for now, this will only populate coins into 'receive' addresses) mean_amt: the number of coins (in btc units) in each address as above sdev_amt: if randomness in amouts is desired, specify here. Returns: a dict of dicts of form {0:{'seed':seed,'wallet':Wallet object},1:..,} Default Wallet constructor is joinmarket.Wallet, else use TestWallet, which takes a password parameter as in the list passwords. ''' if len(wallet_structures) != n: raise Exception("Number of wallets doesn't match wallet structures") if not fixed_seeds: seeds = chunks(binascii.hexlify(os.urandom(15 * n)), 15 * 2) else: seeds = fixed_seeds wallets = {} for i in range(n): if test_wallet: w = TestWallet(seeds[i], max_mix_depth=5, pwd=passwords[i]) else: if walletclass: wc = walletclass else: wc = get_wallet_cls() w = wc(seeds[i], pwd=None, max_mix_depth=5) wallets[i + start_index] = {'seed': seeds[i], 'wallet': w} for j in range(5): for k in range(wallet_structures[i][j]): deviation = sdev_amt * random.random() amt = mean_amt - sdev_amt / 2.0 + deviation if amt < 0: amt = 0.001 amt = float(Decimal(amt).quantize(Decimal(10)**-8)) jm_single().bc_interface.grab_coins( wallets[i + start_index]['wallet'].get_external_addr(j), amt) #reset the index so the coins can be seen if running in same script wallets[i + start_index]['wallet'].index[j][0] -= wallet_structures[i][j] return wallets
def make_wallets(n, wallet_structures=None, mean_amt=1, sdev_amt=0, start_index=0, fixed_seeds=None, test_wallet=False, passwords=None, walletclass=SegwitWallet, mixdepths=5, fb_indices=[]): '''n: number of wallets to be created wallet_structure: array of n arrays , each subarray specifying the number of addresses to be populated with coins at each depth (for now, this will only populate coins into 'receive' addresses) mean_amt: the number of coins (in btc units) in each address as above sdev_amt: if randomness in amouts is desired, specify here. fb_indices: a list of integers in range(n), and for each of those we will use the fidelity bond wallet type (note: to actually *use* the FB feature the calling code will have to create the FB utxo, itself). Only supported if walletclass=SegwitWallet. Returns: a dict of dicts of form {0:{'seed':seed,'wallet':Wallet object},1:..,} Default Wallet constructor is joinmarket.Wallet, else use TestWallet, which takes a password parameter as in the list passwords. ''' # FIXME: this is basically the same code as jmclient/test/commontest.py if len(wallet_structures) != n: raise Exception("Number of wallets doesn't match wallet structures") if not fixed_seeds: seeds = chunks( binascii.hexlify(os.urandom(BIP32Wallet.ENTROPY_BYTES * n)), BIP32Wallet.ENTROPY_BYTES * 2) else: seeds = fixed_seeds wallets = {} for i in range(n): assert len(seeds[i]) == BIP32Wallet.ENTROPY_BYTES * 2 # FIXME: pwd is ignored (but do we really need this anyway?) if test_wallet and passwords and i < len(passwords): pwd = passwords[i] else: pwd = None if i in fb_indices: assert walletclass == SegwitWallet, "Cannot use FB except for native segwit." wc = WALLET_IMPLEMENTATIONS[get_configured_wallet_type(True)] print("for index: {}, we got wallet type: {}".format(i, wc)) else: wc = walletclass w = open_test_wallet_maybe(seeds[i], seeds[i], mixdepths - 1, test_wallet_cls=wc) wallet_service = WalletService(w) wallets[i + start_index] = { 'seed': seeds[i].decode('ascii'), 'wallet': wallet_service } for j in range(mixdepths): for k in range(wallet_structures[i][j]): deviation = sdev_amt * random.random() amt = mean_amt - sdev_amt / 2.0 + deviation if amt < 0: amt = 0.001 amt = float(Decimal(amt).quantize(Decimal(10)**-8)) jm_single().bc_interface.grab_coins( wallet_service.get_new_addr( j, BaseWallet.ADDRESS_TYPE_INTERNAL), amt) return wallets