specter-desktop/tests/fix_devices_and_wallets.py
2022-12-19 21:30:17 +01:00

201 lines
6.4 KiB
Python

import pytest
import random
import time
from cryptoadvance.specter.util.mnemonic import generate_mnemonic
from cryptoadvance.specter.process_controller.node_controller import NodeController
from cryptoadvance.specter.managers.wallet_manager import WalletManager
from cryptoadvance.specter.specter import Specter
from cryptoadvance.specter.wallet import Wallet, Device
def create_hot_wallet_device(
specter_regtest_configured, name=None, mnemonic=None
) -> Device:
if mnemonic == None:
mnemonic = generate_mnemonic(strength=128)
if name == None:
name = "_".join(mnemonic.split(" ")[0:3])
wallet_manager = specter_regtest_configured.wallet_manager
device_manager = specter_regtest_configured.device_manager
# Create the device
device = device_manager.add_device(name=name, device_type="bitcoincore", keys=[])
device.setup_device(file_password=None, wallet_manager=wallet_manager)
device.add_hot_wallet_keys(
mnemonic=mnemonic,
passphrase="",
paths=[
"m/49h/1h/0h", # Single Sig (Nested)
"m/84h/1h/0h", # Single Sig (Segwit)'
"m/86h/1h/0h", # Single Sig (Taproot) # Taproot ONLY works if this derivation path is enabled. The wallet descriptor is derived from this
"m/48h/1h/0h/1h", # Multisig Sig (Nested)
"m/48h/1h/0h/2h", # Multisig Sig (Segwit)
# "m/44h/0h/0h", # pkh single-legacy
],
file_password=None,
wallet_manager=wallet_manager,
testnet=True,
keys_range=[0, 1000],
keys_purposes=[],
)
return device
@pytest.fixture
def hot_wallet_device_1(specter_regtest_configured):
return create_hot_wallet_device(specter_regtest_configured)
@pytest.fixture
def hot_wallet_device_2(specter_regtest_configured):
return create_hot_wallet_device(specter_regtest_configured)
@pytest.fixture
def hot_ghost_machine_device(
specter_regtest_configured: Specter, mnemonic_ghost_machine: str
) -> Device:
return create_hot_wallet_device(
specter_regtest_configured,
name="Ghost machine device",
mnemonic=mnemonic_ghost_machine,
)
def create_hot_segwit_wallet(
specter_regtest_configured: Specter, device: Device, wallet_id
) -> Wallet:
wallet_manager = specter_regtest_configured.wallet_manager
assert device.taproot_available(specter_regtest_configured.rpc)
# create the wallet
keys = [key for key in device.keys if key.key_type == "wpkh"]
source_wallet = wallet_manager.create_wallet(wallet_id, 1, "wpkh", keys, [device])
return source_wallet
def create_hot_taproot_wallet(
specter_regtest_configured: Specter, device: Device, wallet_id
) -> Wallet:
wallet_manager = specter_regtest_configured.wallet_manager
assert device.taproot_available(specter_regtest_configured.rpc)
keys = [key for key in device.keys if key.key_type == "tr"]
source_wallet = wallet_manager.create_wallet(wallet_id, 1, "tr", keys, [device])
return source_wallet
@pytest.fixture
def unfunded_hot_wallet_1(specter_regtest_configured, hot_wallet_device_1) -> Wallet:
return create_hot_segwit_wallet(
specter_regtest_configured,
hot_wallet_device_1,
f"a_hotwallet_{random.randint(0, 999999)}",
)
@pytest.fixture
def unfunded_hot_wallet_2(specter_regtest_configured, hot_wallet_device_2) -> Wallet:
return create_hot_segwit_wallet(
specter_regtest_configured,
hot_wallet_device_1,
f"a_hotwallet_{random.randint(0, 999999)}",
)
@pytest.fixture
def unfunded_ghost_machine_wallet(
specter_regtest_configured: Specter, hot_ghost_machine_device: Device
) -> Wallet:
return create_hot_segwit_wallet(
specter_regtest_configured,
hot_ghost_machine_device,
f"ghost_machine",
)
@pytest.fixture
def unfunded_taproot_wallet(
specter_regtest_configured: Specter, hot_ghost_machine_device: Device
) -> Wallet:
return create_hot_taproot_wallet(
specter_regtest_configured,
hot_ghost_machine_device,
f"taproot",
)
@pytest.fixture
def funded_hot_wallet_1(
bitcoin_regtest: NodeController, unfunded_hot_wallet_1: Wallet
) -> Wallet:
funded_hot_wallet_1 = unfunded_hot_wallet_1
assert len(funded_hot_wallet_1.txlist()) == 0
for i in range(0, 10):
bitcoin_regtest.testcoin_faucet(funded_hot_wallet_1.getnewaddress(), amount=1)
funded_hot_wallet_1.update()
for i in range(0, 2):
bitcoin_regtest.testcoin_faucet(
funded_hot_wallet_1.getnewaddress(),
amount=2.5,
confirm_payment=False,
)
time.sleep(1) # needed for tx to propagate
funded_hot_wallet_1.update()
# 12 txs
assert len(funded_hot_wallet_1.txlist()) == 12
# two of them are unconfirmed
assert (
len([tx for tx in funded_hot_wallet_1.txlist() if tx["confirmations"] == 0])
== 2
)
return funded_hot_wallet_1
@pytest.fixture
def funded_hot_wallet_2(
bitcoin_regtest: NodeController, unfunded_hot_wallet_2: Wallet
) -> Wallet:
funded_hot_wallet_2 = unfunded_hot_wallet_2
bitcoin_regtest.testcoin_faucet(funded_hot_wallet_2.getnewaddress())
return funded_hot_wallet_2
@pytest.fixture
def funded_ghost_machine_wallet(
bitcoin_regtest: NodeController, unfunded_ghost_machine_wallet: Wallet
) -> Wallet:
funded_ghost_machine_wallet = unfunded_ghost_machine_wallet
if funded_ghost_machine_wallet.amount_total == 0:
bitcoin_regtest.testcoin_faucet(
funded_ghost_machine_wallet.getnewaddress()
) # default value are 20 BTC
return funded_ghost_machine_wallet
@pytest.fixture
def funded_taproot_wallet(
bitcoin_regtest: NodeController, unfunded_taproot_wallet: Wallet
) -> Wallet:
funded_taproot_wallet = unfunded_taproot_wallet
bitcoin_regtest.testcoin_faucet(
funded_taproot_wallet.getnewaddress()
) # default value are 20 BTC
return funded_taproot_wallet
@pytest.fixture
def wallet(devices_filled_data_folder, device_manager, node):
"""An ordinary wallet without private keys"""
wm = WalletManager(
200100,
devices_filled_data_folder,
node._get_rpc(),
"regtest",
device_manager,
)
device = device_manager.get_by_alias("trezor")
wallet_name = f"test_wallet_{random.randint(0, 999999)}"
wm.create_wallet(wallet_name, 1, "wpkh", [device.keys[5]], [device])
wallet = wm.wallets[wallet_name]
return wallet