From be174501bdc8ad0a41be87e679f8e687a16cc38a Mon Sep 17 00:00:00 2001 From: milan-cb Date: Fri, 24 Jan 2025 14:11:48 -0800 Subject: [PATCH 1/3] Bug fix for non-checksummed address (#91) * chore: fixed casing error for assetids * updated changelog * edited changelog to unreleased --- CHANGELOG.md | 6 ++++++ cdp/asset.py | 20 ++++++++++++-------- tests/test_asset.py | 16 ++++++++++++++++ 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b208b01..5a3b60a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # CDP Python SDK Changelog +## Unreleased + +### Fixed + +- Fixed a bug where non-checksummed asset IDs were throwing an error. + ## [0.15.0] - 2025-01-17 ### Added diff --git a/cdp/asset.py b/cdp/asset.py index d03a35d..3ec3073 100644 --- a/cdp/asset.py +++ b/cdp/asset.py @@ -41,14 +41,18 @@ def from_model(cls, model: AssetModel, asset_id: str | None = None) -> "Asset": """ decimals = model.decimals - if asset_id and asset_id != model.asset_id: - match asset_id: - case "gwei": - decimals = GWEI_DECIMALS - case "wei": - decimals = 0 - case _: - raise ValueError(f"Unsupported asset ID: {asset_id}") + if asset_id and model.asset_id: + normalized_asset_id = asset_id.lower() + normalized_model_asset_id = model.asset_id.lower() + + if normalized_asset_id != normalized_model_asset_id: + match normalized_asset_id: + case "gwei": + decimals = GWEI_DECIMALS + case "wei": + decimals = 0 + case _: + raise ValueError(f"Unsupported asset ID: {asset_id}") return cls( network_id=model.network_id, diff --git a/tests/test_asset.py b/tests/test_asset.py index 2cea01b..b9ed48a 100644 --- a/tests/test_asset.py +++ b/tests/test_asset.py @@ -52,6 +52,22 @@ def test_asset_from_model_with_invalid_asset_id(asset_model_factory): with pytest.raises(ValueError, match="Unsupported asset ID: invalid"): Asset.from_model(asset_model, asset_id="invalid") +def test_asset_from_model_with_non_checksummed_address(asset_model_factory): + """Test asset from model with non-checksummed address.""" + asset_model = asset_model_factory(asset_id="0x8309fbdF021eDF768DC13195741940ba544dEa98", decimals=18) + + asset = Asset.from_model(asset_model, asset_id="0x8309fbdf021edf768dc13195741940ba544dea98") + assert asset.asset_id == "0x8309fbdf021edf768dc13195741940ba544dea98" + assert asset.decimals == 18 + +def test_asset_from_model_with_checksummed_address(asset_model_factory): + """Test asset from model with checksummed address.""" + asset_model = asset_model_factory(asset_id="0x8309fbdF021eDF768DC13195741940ba544dEa98", decimals=18) + + asset = Asset.from_model(asset_model, asset_id="0x8309fbdF021eDF768DC13195741940ba544dEa98") + assert asset.asset_id == "0x8309fbdF021eDF768DC13195741940ba544dEa98" + assert asset.decimals == 18 + @patch("cdp.Cdp.api_clients") def test_asset_fetch(mock_api_clients, asset_model_factory): From 173f91ee7e82aa3721e92c699889d28f450d3186 Mon Sep 17 00:00:00 2001 From: milan-cb Date: Mon, 27 Jan 2025 16:47:03 -0800 Subject: [PATCH 2/3] chore: added USDC gasless transfer e2e test (#92) * chore: added USDC gasless transfer e2e test * unset dev configuration for sdk * updated CHANGELOG --- CHANGELOG.md | 4 ++++ tests/test_e2e.py | 24 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a3b60a..4d0113f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +### Added + +- Add E2E test for gasless transfers `Wallet.createTransfer({..., gasless: true})` + ### Fixed - Fixed a bug where non-checksummed asset IDs were throwing an error. diff --git a/tests/test_e2e.py b/tests/test_e2e.py index ab74f88..19a885b 100644 --- a/tests/test_e2e.py +++ b/tests/test_e2e.py @@ -170,3 +170,27 @@ def test_historical_balances(imported_wallet): balances = list(imported_wallet.default_address.historical_balances("eth")) assert balances assert all(balance.amount > 0 for balance in balances) + + +@pytest.mark.e2e +def test_gasless_transfer(imported_wallet): + """Test gasless transfer.""" + destination_wallet = Wallet.create() + + initial_source_balance = imported_wallet.balance("usdc") + initial_dest_balance = destination_wallet.balance("usdc") + + transfer = imported_wallet.transfer( + amount=Decimal("0.000001"), asset_id="usdc", gasless=True, destination=destination_wallet + ).wait() + + time.sleep(20) + + assert transfer.status.value == "complete" + + final_source_balance = imported_wallet.balance("usdc") + final_dest_balance = destination_wallet.balance("usdc") + + assert final_source_balance < initial_source_balance + assert final_dest_balance > initial_dest_balance + assert final_dest_balance == Decimal("0.000001") From 589c859a9f5284be408dd5161ce770bfdd77319c Mon Sep 17 00:00:00 2001 From: milan-cb Date: Tue, 28 Jan 2025 14:02:43 -0800 Subject: [PATCH 3/3] Milan/v0.16.0 release prep (#93) * skipped gasless transfer test * chore: bumped version to v0.16.0 --- CHANGELOG.md | 2 +- cdp/__version__.py | 2 +- docs/conf.py | 2 +- pyproject.toml | 2 +- tests/test_e2e.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d0113f..cf8ab2d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # CDP Python SDK Changelog -## Unreleased +## [0.16.0] - 2025-01-28 ### Added diff --git a/cdp/__version__.py b/cdp/__version__.py index 9da2f8f..5a313cc 100644 --- a/cdp/__version__.py +++ b/cdp/__version__.py @@ -1 +1 @@ -__version__ = "0.15.0" +__version__ = "0.16.0" diff --git a/docs/conf.py b/docs/conf.py index 98b4802..af613b0 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -14,7 +14,7 @@ project = 'CDP SDK' author = 'Coinbase Developer Platform' -release = '0.15.0' +release = '0.16.0' # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration diff --git a/pyproject.toml b/pyproject.toml index 05d0d4b..220674a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "cdp-sdk" -version = "0.15.0" +version = "0.16.0" description = "CDP Python SDK" authors = ["John Peterson "] license = "LICENSE.md" diff --git a/tests/test_e2e.py b/tests/test_e2e.py index 19a885b..04ba70a 100644 --- a/tests/test_e2e.py +++ b/tests/test_e2e.py @@ -172,7 +172,7 @@ def test_historical_balances(imported_wallet): assert all(balance.amount > 0 for balance in balances) -@pytest.mark.e2e +@pytest.mark.skip(reason="Gasless transfers have unpredictable latency") def test_gasless_transfer(imported_wallet): """Test gasless transfer.""" destination_wallet = Wallet.create()