diff --git a/src/chains/migrations/0042_chain_balances_provider_chain_name_and_more.py b/src/chains/migrations/0042_chain_balances_provider_chain_name_and_more.py new file mode 100644 index 00000000..49fb6f93 --- /dev/null +++ b/src/chains/migrations/0042_chain_balances_provider_chain_name_and_more.py @@ -0,0 +1,26 @@ +# Generated by Django 4.2.2 on 2024-06-13 11:11 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("chains", "0041_chain_prices_provider_chain_name_and_more"), + ] + + operations = [ + migrations.AddField( + model_name="chain", + name="balances_provider_chain_name", + field=models.CharField(blank=True, max_length=255, null=True), + ), + migrations.AddField( + model_name="chain", + name="balances_provider_enabled", + field=models.BooleanField( + default=False, + help_text="This flag informs API clients whether the balances provider is enabled for the chain", + ), + ), + ] diff --git a/src/chains/migrations/tests/test_migration_0042.py b/src/chains/migrations/tests/test_migration_0042.py new file mode 100644 index 00000000..9b7fc12f --- /dev/null +++ b/src/chains/migrations/tests/test_migration_0042.py @@ -0,0 +1,45 @@ +from django.db.migrations.state import StateApps + +from chains.migrations.tests.utils import TestMigrations + + +class Migration0042TestCase(TestMigrations): + migrate_from = "0041_chain_prices_provider_chain_name_and_more" + migrate_to = "0042_chain_balances_provider_chain_name_and_more" + + def setUpBeforeMigration(self, apps: StateApps) -> None: + Chain = apps.get_model("chains", "Chain") + Chain.objects.create( + id=1, + name="Mainnet", + short_name="eth", + description="", + l2=False, + rpc_authentication="API_KEY_PATH", + rpc_uri="https://mainnet.infura.io/v3/", + safe_apps_rpc_authentication="API_KEY_PATH", + safe_apps_rpc_uri="https://mainnet.infura.io/v3/", + block_explorer_uri_address_template="https://etherscan.io/address/{{address}}", + block_explorer_uri_tx_hash_template="https://etherscan.io/tx/{{txHash}}", + currency_name="Ether", + currency_symbol="ETH", + currency_decimals=18, + currency_logo_uri="https://gnosis-safe-token-logos.s3.amazonaws.com/ethereum-eth-logo.png", + transaction_service_uri="http://mainnet-safe-transaction-web.safe.svc.cluster.local", + vpc_transaction_service_uri="", + theme_text_color="#001428", + theme_background_color="#E8E7E6", + ens_registry_address="0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", + recommended_master_copy_version="1.3.0", + prices_provider_native_coin="ethereum", + prices_provider_chain_name="ethereum", + hidden=False, + ) + + def test_new_fields(self) -> None: + Chain = self.apps_registry.get_model("chains", "Chain") + + chain = Chain.objects.get(id=1) + + self.assertEqual(chain.balances_provider_chain_name, None) + self.assertEqual(chain.balances_provider_enabled, False) diff --git a/src/chains/models.py b/src/chains/models.py index f29189fe..42601a04 100644 --- a/src/chains/models.py +++ b/src/chains/models.py @@ -140,6 +140,13 @@ class RpcAuthentication(models.TextChoices): max_length=255, null=True, blank=True ) prices_provider_chain_name = models.CharField(max_length=255, null=True, blank=True) + balances_provider_chain_name = models.CharField( + max_length=255, null=True, blank=True + ) + balances_provider_enabled = models.BooleanField( + default=False, + help_text="This flag informs API clients whether the balances provider is enabled for the chain", + ) hidden = models.BooleanField(default=False) def get_disabled_wallets(self) -> QuerySet["Wallet"]: diff --git a/src/chains/serializers.py b/src/chains/serializers.py index 23d300fe..d7f28e35 100644 --- a/src/chains/serializers.py +++ b/src/chains/serializers.py @@ -86,6 +86,11 @@ class PricesProviderSerializer(serializers.Serializer[Chain]): chain_name = serializers.CharField(source="prices_provider_chain_name") +class BalancesProviderSerializer(serializers.Serializer[Chain]): + chain_name = serializers.CharField(source="balances_provider_chain_name") + enabled = serializers.BooleanField(source="balances_provider_enabled") + + class BaseRpcUriSerializer(serializers.Serializer[Chain]): authentication = serializers.SerializerMethodField() value = serializers.SerializerMethodField(method_name="get_rpc_value") @@ -162,6 +167,7 @@ class ChainSerializer(serializers.ModelSerializer[Chain]): block_explorer_uri_template = serializers.SerializerMethodField() native_currency = serializers.SerializerMethodField() prices_provider = serializers.SerializerMethodField() + balances_provider = serializers.SerializerMethodField() transaction_service = serializers.URLField( source="transaction_service_uri", default=None ) @@ -188,6 +194,7 @@ class Meta: "block_explorer_uri_template", "native_currency", "prices_provider", + "balances_provider", "transaction_service", "vpc_transaction_service", "theme", @@ -247,3 +254,7 @@ def get_features(self, instance: Chain) -> ReturnDict[Any, Any]: @swagger_serializer_method(serializer_or_field=PricesProviderSerializer) # type: ignore[misc] def get_prices_provider(self, instance: Chain) -> ReturnDict[Any, Any]: return PricesProviderSerializer(instance).data + + @swagger_serializer_method(serializer_or_field=BalancesProviderSerializer) # type: ignore[misc] + def get_balances_provider(self, instance: Chain) -> ReturnDict[Any, Any]: + return BalancesProviderSerializer(instance).data diff --git a/src/chains/tests/factories.py b/src/chains/tests/factories.py index 5f6cbe0f..60153838 100644 --- a/src/chains/tests/factories.py +++ b/src/chains/tests/factories.py @@ -48,6 +48,8 @@ class Meta: recommended_master_copy_version = "1.3.0" prices_provider_native_coin = factory.Faker("cryptocurrency_code") prices_provider_chain_name = factory.Faker("company") + balances_provider_chain_name = factory.Faker("company") + balances_provider_enabled = factory.Faker("pybool") hidden = False diff --git a/src/chains/tests/test_views.py b/src/chains/tests/test_views.py index eb7ed778..9072f5be 100644 --- a/src/chains/tests/test_views.py +++ b/src/chains/tests/test_views.py @@ -70,6 +70,10 @@ def test_json_payload_format(self) -> None: "nativeCoin": chain.prices_provider_native_coin, "chainName": chain.prices_provider_chain_name, }, + "balancesProvider": { + "chainName": chain.balances_provider_chain_name, + "enabled": chain.balances_provider_enabled, + }, "transactionService": chain.transaction_service_uri, "vpcTransactionService": chain.vpc_transaction_service_uri, "theme": { @@ -193,6 +197,10 @@ def test_json_payload_format(self) -> None: "nativeCoin": chain.prices_provider_native_coin, "chainName": chain.prices_provider_chain_name, }, + "balancesProvider": { + "chainName": chain.balances_provider_chain_name, + "enabled": chain.balances_provider_enabled, + }, "transactionService": chain.transaction_service_uri, "vpcTransactionService": chain.vpc_transaction_service_uri, "theme": {