Skip to content

Commit 6e4e3bc

Browse files
authored
fix: fix import_wallet to use the right address index
fix: fix import_wallet to use the right address index
2 parents 4c282ee + 8677625 commit 6e4e3bc

File tree

6 files changed

+93
-4
lines changed

6 files changed

+93
-4
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# CDP Python SDK Changelog
22

3+
## [0.18.1] - 2025-02-13
4+
5+
## Fixed
6+
7+
- Bug fix for Wallet.import_wallet() when addresses are not returned in order of their address_index.
8+
39
## [0.18.0] - 2025-02-12
410

511
### Added

cdp/__version__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "0.18.0"
1+
__version__ = "0.18.1"

cdp/wallet.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -728,7 +728,7 @@ def _set_addresses(self) -> None:
728728
addresses = Cdp.api_clients.addresses.list_addresses(self.id, limit=self.MAX_ADDRESSES)
729729

730730
self._addresses = [
731-
self._build_wallet_address(model, index) for index, model in enumerate(addresses.data)
731+
self._build_wallet_address(model, model.index) for _, model in enumerate(addresses.data)
732732
]
733733

734734
def _build_wallet_address(self, model: AddressModel, index: int | None = None) -> WalletAddress:

docs/conf.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
project = 'CDP SDK'
1616
author = 'Coinbase Developer Platform'
17-
release = '0.18.0'
17+
release = '0.18.1'
1818

1919
# -- General configuration ---------------------------------------------------
2020
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "cdp-sdk"
3-
version = "0.18.0"
3+
version = "0.18.1"
44
description = "CDP Python SDK"
55
authors = ["John Peterson <[email protected]>"]
66
license = "LICENSE.md"

tests/test_wallet.py

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import pytest
55
from eth_account import Account
66

7+
from cdp import WalletData
78
from cdp.client.models.create_address_request import CreateAddressRequest
89
from cdp.client.models.create_wallet_request import CreateWalletRequest, CreateWalletRequestWallet
910
from cdp.client.models.create_wallet_webhook_request import CreateWalletWebhookRequest
@@ -889,3 +890,85 @@ def test_wallet_import_from_mnemonic_invalid_phrase():
889890

890891
with pytest.raises(ValueError, match="Invalid BIP-39 mnemonic seed phrase"):
891892
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

Comments
 (0)