示例#1
0
    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)
示例#2
0
    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]
示例#3
0
 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]])
示例#4
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]
示例#5
0
    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
示例#6
0
 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))
示例#7
0
    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
示例#8
0
    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])
示例#9
0
 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)
示例#10
0
 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
示例#11
0
 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
示例#12
0
 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
示例#13
0
 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