def test_invalid_init(self): key1 = PrivateKey() key2 = PrivateKey() with pytest.raises(TypeError): MultiSig(PrivateKeyTestnet(), [key1.public_key, key2.public_key], 2) with pytest.raises(ValueError): MultiSig(PrivateKey(), [key1.public_key, key2.public_key], 2) with pytest.raises(TypeError): # Public keys must be provided in list or set MultiSig(key1, (key1.public_key, key2.public_key), 1)
def test_lexicographical_ordering_pubkeys(self): key1 = PrivateKey(WALLET_FORMAT_MAIN_1) key2 = PrivateKey(WALLET_FORMAT_MAIN_2) multisig = MultiSig(key1, [key2.public_key, key1.public_key], 2) assert multisig.public_keys == [key2.public_key, key1.public_key] multisig = MultiSig(key1, [key1.public_key, key2.public_key], 2) assert multisig.public_keys == [key1.public_key, key2.public_key] multisig = MultiSig(key1, {key2.public_key, key1.public_key}, 2) assert multisig.public_keys == [key2.public_key, key1.public_key] multisig = MultiSig(key1, {key1.public_key, key2.public_key}, 2) assert multisig.public_keys == [key2.public_key, key1.public_key]
def test_sign_tx_invalid_multisig_already_fully_signed(self): key1 = PrivateKey(WALLET_FORMAT_TEST_1) key2 = PrivateKey(WALLET_FORMAT_TEST_2) multi = MultiSig(key1, [key1.public_key, key2.public_key], 2) txobj = deserialize(FINAL_TX_BATCH) with pytest.raises(ValueError): sign_tx(multi, txobj, unspents=[UNSPENTS_BATCH[0]])
def test_sign_tx_multisig(self): key1 = PrivateKey(WALLET_FORMAT_TEST_1) key2 = PrivateKey(WALLET_FORMAT_TEST_2) multi = MultiSig(key1, [key1.public_key, key2.public_key], 2) txobj = deserialize(UNSIGNED_TX_BATCH) tx = sign_tx(multi, txobj, unspents=[UNSPENTS_BATCH[0]]) assert tx[:238] == FINAL_TX_BATCH[:238]
def test_init_default(self): key1 = PrivateKey() key2 = PrivateKey() multisig = MultiSig(key1, [key1.public_key, key2.public_key], 2) assert multisig._address is None assert multisig.balance == 0 assert multisig.unspents == [] assert multisig.transactions == [] assert multisig.m == 2 multisig2 = MultiSig(key2, [bytes_to_hex(key1.public_key), bytes_to_hex(key2.public_key)], 2) assert multisig2._address is None assert multisig2.balance == 0 assert multisig2.unspents == [] assert multisig2.transactions == [] assert multisig2.m == 2
def test_scriptcode(self): key1 = PrivateKey() key2 = PrivateKey() multisig = MultiSig(key1, [key1.public_key, key2.public_key], 2) assert multisig.scriptcode == multisig.redeemscript assert multisig.segwit_scriptcode == (b'\x00' + b'\x20' + sha256(multisig.redeemscript))
def test_get_unspent_size(self, mock_get_unspent): mock_get_unspent.return_value = yield [ Unspent(amount=1, confirmations=1, script=b'script', txid=b'txid', txindex=0) ] key1 = PrivateKey(WALLET_FORMAT_MAIN_1) multisig1 = MultiSig(key1, [key1.public_key, 33 * b'\x00'], 2) multisig2 = MultiSig(key1, [key1.public_key, 33 * b'\x00'], 1) multisig3 = MultiSig(key1, [key1.public_key, 33 * b'\x00', 33 * b'\x00'], 2) unspent1 = multisig1.get_unspents() unspent2 = multisig2.get_unspents() unspent3 = multisig3.get_unspents() assert unspent1[0].vsize == 262 # Legacy 2-of-2 assert unspent1[1].vsize == 131.5 # Nested Segwit 2-of-2 assert unspent2[0].vsize == 188 # Legacy 1-of-2 assert unspent2[1].vsize == 113 # Nested Segwit 1-of-2 assert unspent3[0].vsize == 298 # Legacy 2-of-3 assert unspent3[1].vsize == 140 # Nested Segwit 2-of-3
def test_can_sign_unspent(self): key1 = PrivateKey(WALLET_FORMAT_MAIN_1) key2 = PrivateKey(WALLET_FORMAT_MAIN_2) multisig = MultiSig(key1, [key1.public_key, key2.public_key], 2) assert multisig.can_sign_unspent(UNSPENTS[3]) assert multisig.can_sign_unspent(UNSPENTS[4]) # Non-segwit multisig: key1 = PrivateKey(WALLET_FORMAT_MAIN) key2 = PrivateKey(WALLET_FORMAT_MAIN_1) multisig = MultiSig(key1, [key1.public_key, key2.public_key], 2) assert multisig.can_sign_unspent(UNSPENTS[7])
def test_repr(self): key1 = PrivateKey(WALLET_FORMAT_MAIN_1) key2 = PrivateKey(WALLET_FORMAT_MAIN_2) multisig = MultiSig(key1, [key1.public_key, key2.public_key], 2) assert repr(multisig) == '<MultiSig: {}>'.format( BITCOIN_ADDRESS_P2SH_MULTISIG)
def test_get_transactions(self): key1 = PrivateKey(WALLET_FORMAT_MAIN_1) key2 = PrivateKey(WALLET_FORMAT_MAIN_2) multisig = MultiSig(key1, [key1.public_key, key2.public_key], 2) transactions = multisig.get_transactions() assert transactions == multisig.transactions
def test_get_unspent(self): key1 = PrivateKey(WALLET_FORMAT_MAIN_1) key2 = PrivateKey(WALLET_FORMAT_MAIN_2) multisig = MultiSig(key1, [key1.public_key, key2.public_key], 2) unspent = multisig.get_unspents() assert unspent == multisig.unspents
def test_get_balance(self): key1 = PrivateKey(WALLET_FORMAT_MAIN_1) key2 = PrivateKey(WALLET_FORMAT_MAIN_2) multisig = MultiSig(key1, [key1.public_key, key2.public_key], 2) balance = int(multisig.get_balance()) assert balance == multisig.balance
def test_address(self): key1 = PrivateKey(WALLET_FORMAT_MAIN_1) key2 = PrivateKey(WALLET_FORMAT_MAIN_2) multisig = MultiSig(key1, [key1.public_key, key2.public_key], 2) assert multisig.address == BITCOIN_ADDRESS_P2SH_MULTISIG assert multisig.segwit_address == BITCOIN_ADDRESS_NP2SH_MULTISIG