Skip to content

Commit 4ec912d

Browse files
chore: Fix Mnemonic Seed Wallet import Specify Network ID (#84)
1 parent 494cc92 commit 4ec912d

File tree

4 files changed

+72
-3
lines changed

4 files changed

+72
-3
lines changed

CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# CDP Python SDK Changelog
22

3+
## Unreleased
4+
5+
### Fixed
6+
7+
- Allow wallet mnemonic seed import to optionally accept `network_id` input argument.
8+
39
## [0.14.0] - 2025-01-14
410

511
### Added

Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ lint-fix:
1212

1313
.PHONY: test
1414
test:
15-
poetry run pytest
15+
poetry run pytest -m "not e2e"
1616

1717
.PHONY: e2e
1818
e2e:

cdp/wallet.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -260,13 +260,14 @@ def list(cls) -> Iterator["Wallet"]:
260260
page = response.next_page
261261

262262
@classmethod
263-
def import_wallet(cls, data: WalletData | MnemonicSeedPhrase) -> "Wallet":
263+
def import_wallet(cls, data: WalletData | MnemonicSeedPhrase, network_id: str = "base-sepolia") -> "Wallet":
264264
"""Import a wallet from previously exported wallet data or a mnemonic seed phrase.
265265
266266
Args:
267267
data (Union[WalletData, MnemonicSeedPhrase]): Either:
268268
- WalletData: The wallet data to import, containing wallet_id and seed
269269
- MnemonicSeedPhrase: A valid BIP-39 mnemonic phrase object for importing external wallets
270+
network_id (str): The network ID of the wallet. Defaults to "base-sepolia".
270271
271272
Returns:
272273
Wallet: The imported wallet.
@@ -291,7 +292,7 @@ def import_wallet(cls, data: WalletData | MnemonicSeedPhrase) -> "Wallet":
291292
seed = seed_bytes.hex()
292293

293294
# Create wallet using the provided seed
294-
wallet = cls.create_with_seed(seed=seed)
295+
wallet = cls.create_with_seed(seed=seed, network_id=network_id)
295296
wallet._set_addresses()
296297
return wallet
297298

tests/test_wallet.py

+62
Original file line numberDiff line numberDiff line change
@@ -742,6 +742,68 @@ def test_wallet_import_from_mnemonic_seed_phrase(
742742
assert wallet.default_address._model.public_key == public_key
743743

744744

745+
@patch("cdp.Cdp.use_server_signer", False)
746+
@patch("cdp.Cdp.api_clients")
747+
@patch("cdp.wallet.Account")
748+
def test_wallet_import_from_mnemonic_seed_phrase_specified_network_id(
749+
mock_account,
750+
mock_api_clients,
751+
wallet_factory,
752+
address_model_factory,
753+
):
754+
"""Test importing a wallet from a mnemonic seed phrase with network ID specified."""
755+
# Valid 24-word mnemonic and expected address
756+
valid_mnemonic = "crouch cereal notice one canyon kiss tape employ ghost column vanish despair eight razor laptop keen rally gaze riot regret assault jacket risk curve"
757+
expected_address = "0x43A0477E658C6e05136e81C576CF02daCEa067bB"
758+
public_key = "0x037e6cbdd1d949f60f41d5db7ffa9b3ddce0b77eab35ef7affd3f64cbfd9e33a91"
759+
760+
# Create mock address model
761+
mock_address = address_model_factory(
762+
address_id=expected_address,
763+
public_key=public_key,
764+
wallet_id="new-wallet-id",
765+
network_id="base-mainnet",
766+
index=0,
767+
)
768+
769+
# Create mock wallet model with the address model
770+
mock_wallet = wallet_factory(
771+
id="new-wallet-id", network_id="base-mainnet", default_address=mock_address
772+
)._model
773+
774+
# Add debug assertions
775+
assert mock_wallet.default_address is not None
776+
assert mock_wallet.default_address.address_id == expected_address
777+
778+
# Mock Account.from_key to return an account with our expected address
779+
mock_account_instance = Mock(spec=Account)
780+
mock_account_instance.address = expected_address
781+
mock_account.from_key = Mock(return_value=mock_account_instance)
782+
783+
# Mock both API calls to return the same wallet model
784+
mock_api_clients.wallets.create_wallet = Mock(return_value=mock_wallet)
785+
mock_api_clients.wallets.get_wallet = Mock(return_value=mock_wallet)
786+
mock_api_clients.addresses.create_address = Mock(return_value=mock_address)
787+
788+
# Mock list_addresses call
789+
mock_address_list = Mock()
790+
mock_address_list.data = [mock_address]
791+
mock_api_clients.addresses.list_addresses = Mock(return_value=mock_address_list)
792+
793+
# Import wallet using mnemonic
794+
from cdp.mnemonic_seed_phrase import MnemonicSeedPhrase
795+
796+
wallet = Wallet.import_wallet(MnemonicSeedPhrase(valid_mnemonic), network_id="base-mainnet")
797+
798+
# Verify the wallet was created successfully
799+
assert isinstance(wallet, Wallet)
800+
801+
# Verify the default address matches expected address
802+
assert wallet.default_address is not None
803+
assert wallet.default_address.address_id == expected_address
804+
assert wallet.default_address._model.public_key == public_key
805+
806+
745807
def test_wallet_import_from_mnemonic_empty_phrase():
746808
"""Test importing a wallet with an empty mnemonic phrase."""
747809
from cdp.mnemonic_seed_phrase import MnemonicSeedPhrase

0 commit comments

Comments
 (0)