| 
4 | 4 | import pytest  | 
5 | 5 | from eth_account import Account  | 
6 | 6 | 
 
  | 
 | 7 | +from cdp import WalletData  | 
7 | 8 | from cdp.client.models.create_address_request import CreateAddressRequest  | 
8 | 9 | from cdp.client.models.create_wallet_request import CreateWalletRequest, CreateWalletRequestWallet  | 
9 | 10 | from cdp.client.models.create_wallet_webhook_request import CreateWalletWebhookRequest  | 
@@ -889,3 +890,85 @@ def test_wallet_import_from_mnemonic_invalid_phrase():  | 
889 | 890 | 
 
  | 
890 | 891 |     with pytest.raises(ValueError, match="Invalid BIP-39 mnemonic seed phrase"):  | 
891 | 892 |         Wallet.import_wallet(MnemonicSeedPhrase("invalid mnemonic phrase"))  | 
 | 893 | + | 
 | 894 | +@patch("cdp.Cdp.use_server_signer", False)  | 
 | 895 | +@patch("cdp.Cdp.api_clients")  | 
 | 896 | +@patch("cdp.wallet.Account")  | 
 | 897 | +def test_wallet_import_wallet_data(  | 
 | 898 | +    mock_account,  | 
 | 899 | +    mock_api_clients,  | 
 | 900 | +    wallet_factory,  | 
 | 901 | +    address_model_factory,  | 
 | 902 | +):  | 
 | 903 | +    """Test importing a wallet from wallet data."""  | 
 | 904 | +    wallet_data = WalletData(  | 
 | 905 | +        wallet_id="087ed3e6-3d60-4273-ae06-9310ce6c5391",  | 
 | 906 | +        seed="e0c727430053b8e4a299c8752175a48c27a6670fa204b5bdcbab08b2fd3d2278f182023dae524cb1b758dd96dac43f78850c71b988aceda27da7c12a06eb7dc5",  | 
 | 907 | +    )  | 
 | 908 | +    first_address = "0x974EaE7AEA7D3A0226855E75762438cc8bF2bfb4"  | 
 | 909 | +    second_address = "0x4B474e2f0b3b6195FD98A7c0ad592F6dF7eD8475"  | 
 | 910 | +    first_public_key = "0x032845fca05f20c848dc2db1acc8e74965846cf78bb84e62e16da20fb1ebf9b41d"  | 
 | 911 | +    second_public_key = "0x02f1c8765ff02ac19f95bd938631219d72fc2f732d3f6b481c1ea36ae70a46d579"  | 
 | 912 | + | 
 | 913 | +    # Create mock address model  | 
 | 914 | +    mock_first_address = address_model_factory(  | 
 | 915 | +        address_id=first_address,  | 
 | 916 | +        public_key=first_public_key,  | 
 | 917 | +        wallet_id="new-wallet-id",  | 
 | 918 | +        network_id="base-mainnet",  | 
 | 919 | +        index=0,  | 
 | 920 | +    )  | 
 | 921 | + | 
 | 922 | +    mock_second_address = address_model_factory(  | 
 | 923 | +        address_id=second_address,  | 
 | 924 | +        public_key=second_public_key,  | 
 | 925 | +        wallet_id="new-wallet-id",  | 
 | 926 | +        network_id="base-mainnet",  | 
 | 927 | +        index=1,  | 
 | 928 | +    )  | 
 | 929 | + | 
 | 930 | +    # Create mock wallet model with the address model  | 
 | 931 | +    mock_wallet = wallet_factory(  | 
 | 932 | +        id="new-wallet-id", network_id="base-mainnet", default_address=mock_first_address  | 
 | 933 | +    )._model  | 
 | 934 | + | 
 | 935 | +    # Add debug assertions  | 
 | 936 | +    assert mock_wallet.default_address is not None  | 
 | 937 | +    assert mock_wallet.default_address.address_id == first_address  | 
 | 938 | +    assert mock_wallet.default_address.index == 0  | 
 | 939 | + | 
 | 940 | +    # Mock Account.from_key to return different addresses for different calls  | 
 | 941 | +    mock_first_account = Mock(spec=Account)  | 
 | 942 | +    mock_first_account.address = second_address  | 
 | 943 | +    mock_second_account = Mock(spec=Account)  | 
 | 944 | +    mock_second_account.address = first_address  | 
 | 945 | +    mock_account.from_key = Mock(side_effect=[mock_first_account, mock_second_account])  | 
 | 946 | + | 
 | 947 | +    # Mock both API calls to return the same wallet model  | 
 | 948 | +    mock_api_clients.wallets.create_wallet = Mock(return_value=mock_wallet)  | 
 | 949 | +    mock_api_clients.wallets.get_wallet = Mock(return_value=mock_wallet)  | 
 | 950 | +    mock_api_clients.addresses.create_address = Mock(return_value=mock_first_address)  | 
 | 951 | + | 
 | 952 | +    # Mock list_addresses call  | 
 | 953 | +    mock_address_list = Mock()  | 
 | 954 | +    # Make the API response to be out of order.  | 
 | 955 | +    mock_address_list.data = [mock_second_address, mock_first_address]  | 
 | 956 | +    mock_api_clients.addresses.list_addresses = Mock(return_value=mock_address_list)  | 
 | 957 | + | 
 | 958 | +    # Import wallet using data  | 
 | 959 | +    wallet = Wallet.import_wallet(wallet_data, network_id="base-mainnet")  | 
 | 960 | + | 
 | 961 | +    # Verify the wallet was created successfully  | 
 | 962 | +    assert isinstance(wallet, Wallet)  | 
 | 963 | + | 
 | 964 | +    # Verify the default address matches expected address  | 
 | 965 | +    assert wallet.default_address is not None  | 
 | 966 | +    assert wallet.default_address.address_id == first_address  | 
 | 967 | +    assert wallet.default_address._model.public_key == first_public_key  | 
 | 968 | +    addresses = wallet.addresses  | 
 | 969 | + | 
 | 970 | +    assert len(addresses) == 2  | 
 | 971 | +    assert addresses[0].address_id == second_address  | 
 | 972 | +    assert addresses[0]._model.public_key == second_public_key  | 
 | 973 | +    assert addresses[1].address_id == first_address  | 
 | 974 | +    assert addresses[1]._model.public_key == first_public_key  | 
0 commit comments