def test_pointer_address(self):
        mnemonic = "test walk nut penalty hip pave soap entry language right filter choice"
        passphrase = ""
        node = bip32.from_mnemonic_cardano(mnemonic, passphrase)
        keychain = Keychain(node)

        test_vectors = [
            # network id, pointer, expected result
            (network_ids.MAINNET, CardanoBlockchainPointerType(1, 2, 3),
             "addr1gx2fxv2umyhttkxyxp8x0dlpdt3k6cwng5pxj3jhsydzerspqgpse33frd"
             ),
            (network_ids.TESTNET, CardanoBlockchainPointerType(24157, 177, 42),
             "addr_test1gz2fxv2umyhttkxyxp8x0dlpdt3k6cwng5pxj3jhsydzer5ph3wczvf2pfz4ly"
             )
        ]

        for network_id, pointer, expected_address in test_vectors:
            address_parameters = CardanoAddressParametersType(
                address_type=CardanoAddressType.POINTER,
                address_n=[
                    1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0
                ],
                certificate_pointer=pointer,
            )
            actual_address = derive_human_readable_address(
                keychain, address_parameters, protocol_magics.MAINNET,
                network_id)

            self.assertEqual(actual_address, expected_address)
    def test_pointer_address_invalid_pointers(self):
        mnemonic = "test walk nut penalty hip pave soap entry language right filter choice"
        passphrase = ""
        node = bip32.from_mnemonic_cardano(mnemonic, passphrase)
        keychain = Keychain(node)

        # pointer is None
        with self.assertRaises(wire.DataError):
            address_parameters = CardanoAddressParametersType(
                address_type=CardanoAddressType.POINTER,
                address_n=[
                    1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0
                ],
                certificate_pointer=None,
            )
            derive_human_readable_address(keychain, address_parameters, 0, 0)

        # block index is None
        with self.assertRaises(wire.DataError):
            address_parameters = CardanoAddressParametersType(
                address_type=CardanoAddressType.POINTER,
                address_n=[
                    1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0
                ],
                certificate_pointer=CardanoBlockchainPointerType(
                    block_index=None, tx_index=2, certificate_index=3),
            )
            derive_human_readable_address(keychain, address_parameters, 0, 0)

        # tx index is None
        with self.assertRaises(wire.DataError):
            address_parameters = CardanoAddressParametersType(
                address_type=CardanoAddressType.POINTER,
                address_n=[
                    1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0
                ],
                certificate_pointer=CardanoBlockchainPointerType(
                    block_index=1, tx_index=None, certificate_index=3),
            )
            derive_human_readable_address(keychain, address_parameters, 0, 0)

        # certificate index is None
        with self.assertRaises(wire.DataError):
            address_parameters = CardanoAddressParametersType(
                address_type=CardanoAddressType.POINTER,
                address_n=[
                    1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0
                ],
                certificate_pointer=CardanoBlockchainPointerType(
                    block_index=1, tx_index=2, certificate_index=None),
            )
            derive_human_readable_address(keychain, address_parameters, 0, 0)
    def test_shelley_address_with_byron_namespace(self):
        """
        It shouldn't be possible to derive Shelley addresses
        (Base, Pointer, Enterprise, Reward) with a Byron namespace (44')
        """
        mnemonic = "test walk nut penalty hip pave soap entry language right filter choice"
        passphrase = ""
        node = bip32.from_mnemonic_cardano(mnemonic, passphrase)
        keychain = Keychain(node)

        with self.assertRaises(wire.DataError):
            address_parameters = CardanoAddressParametersType(
                address_type=CardanoAddressType.BASE,
                address_n=[44 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0]
            )
            derive_human_readable_address(keychain, address_parameters, 0, 0)

        with self.assertRaises(wire.DataError):
            address_parameters = CardanoAddressParametersType(
                address_type=CardanoAddressType.POINTER,
                address_n=[44 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
                certificate_pointer=CardanoBlockchainPointerType(block_index=0, tx_index=0, certificate_index=0)
            )
            derive_human_readable_address(keychain, address_parameters, 0, 0)

        with self.assertRaises(wire.DataError):
            address_parameters = CardanoAddressParametersType(
                address_type=CardanoAddressType.ENTERPRISE,
                address_n=[44 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
            )
            derive_human_readable_address(keychain, address_parameters, 0, 0)

        with self.assertRaises(wire.DataError):
            address_parameters = CardanoAddressParametersType(
                address_type=CardanoAddressType.REWARD,
                address_n=[44 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
            )
            derive_human_readable_address(keychain, address_parameters, 0, 0)
    def test_get(self):
        mnemonic = (
            "test walk nut penalty hip pave soap entry language right filter choice"
        )
        passphrase = ""
        node = bip32.from_mnemonic_cardano(mnemonic, passphrase)
        keychain = Keychain(node)

        expected_staking_use_cases = [
            # address parameters, expected staking use case
            (
                CardanoAddressParametersType(
                    address_type=CardanoAddressType.BASE,
                    address_n=[
                        1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0
                    ],
                    address_n_staking=[
                        1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 2, 0
                    ],
                ),
                staking_use_cases.MATCH,
            ),
            (
                CardanoAddressParametersType(
                    address_type=CardanoAddressType.BASE,
                    address_n=[
                        1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0
                    ],
                    address_n_staking=[
                        1852 | HARDENED, 1815 | HARDENED, 2 | HARDENED, 2, 0
                    ],
                ),
                staking_use_cases.MISMATCH,
            ),
            (
                CardanoAddressParametersType(
                    address_type=CardanoAddressType.BASE,
                    address_n=[
                        1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0
                    ],
                    staking_key_hash=unhexlify(
                        "32c728d3861e164cab28cb8f006448139c8f1740ffb8e7aa9e5232dc"
                    ),
                ),
                staking_use_cases.MATCH,
            ),
            (
                CardanoAddressParametersType(
                    address_type=CardanoAddressType.BASE,
                    address_n=[
                        1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0
                    ],
                    staking_key_hash=unhexlify(
                        "122a946b9ad3d2ddf029d3a828f0468aece76895f15c9efbd69b4277"
                    ),
                ),
                staking_use_cases.MISMATCH,
            ),
            (
                CardanoAddressParametersType(
                    address_type=CardanoAddressType.POINTER,
                    address_n=[
                        1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0
                    ],
                    certificate_pointer=CardanoBlockchainPointerType(
                        block_index=1, tx_index=2, certificate_index=3),
                ),
                staking_use_cases.POINTER_ADDRESS,
            ),
            (
                CardanoAddressParametersType(
                    address_type=CardanoAddressType.REWARD,
                    address_n=[
                        1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 2, 0
                    ],
                ),
                staking_use_cases.MATCH,
            ),
            (
                CardanoAddressParametersType(
                    address_type=CardanoAddressType.ENTERPRISE,
                    address_n=[
                        1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0
                    ],
                ),
                staking_use_cases.NO_STAKING,
            ),
            (
                CardanoAddressParametersType(
                    address_type=CardanoAddressType.BYRON,
                    address_n=[
                        44 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0
                    ],
                ),
                staking_use_cases.NO_STAKING,
            ),
        ]

        for address_parameters, expected_staking_use_case in expected_staking_use_cases:
            actual_staking_use_case = staking_use_cases.get(
                keychain, address_parameters)
            self.assertEqual(actual_staking_use_case,
                             expected_staking_use_case)