Repository: safe-global/safe-config-service

Issue:
Add internal transaction service url to /chains
In addition to the public transaction url returned for each chain, an internal one should be returned and should be only used by the client gateway. 

```javascript
GET /api/v1/chains/

[
  {
    ...
    "transactionService": <url>,
    "transactionServiceCluster": <url> // this should only be used by the client gateway and not exposed to the clients
  }
]
```


@gnosis/safe-services 


Discussion:
I don't know if we can return that (security wise), I will let devops know
I feel that maybe the best solution would be having an internal DNS that will point our external `transactionService` to the `transactionServiceCluster`, so only one url will be needed and devops will be in charge of deciding where to point
> I feel that maybe the best solution would be having an internal DNS that will point our external `transactionService` to the `transactionServiceCluster`, so only one url will be needed and devops will be in charge of deciding where to point

@fmrsabino Devops will analyze this and answer here
We have decided to move forward with this ticket

Resolving patch:
diff --git a/src/chains/migrations/0028_chain_vpc_transaction_service_uri.py b/src/chains/migrations/0028_chain_vpc_transaction_service_uri.py
new file mode 100644
--- /dev/null
+++ b/src/chains/migrations/0028_chain_vpc_transaction_service_uri.py
@@ -0,0 +1,19 @@
+# Generated by Django 3.2.7 on 2021-09-27 09:58
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("chains", "0027_chain_description"),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name="chain",
+            name="vpc_transaction_service_uri",
+            field=models.URLField(default=""),
+            preserve_default=False,
+        ),
+    ]
diff --git a/src/chains/models.py b/src/chains/models.py
--- a/src/chains/models.py
+++ b/src/chains/models.py
@@ -52,6 +52,7 @@ class RpcAuthentication(models.TextChoices):
     currency_decimals = models.IntegerField(default=18)
     currency_logo_uri = models.ImageField(upload_to=native_currency_path)
     transaction_service_uri = models.URLField()
+    vpc_transaction_service_uri = models.URLField()
     theme_text_color = models.CharField(
         validators=[color_validator],
         max_length=9,
diff --git a/src/chains/serializers.py b/src/chains/serializers.py
--- a/src/chains/serializers.py
+++ b/src/chains/serializers.py
@@ -88,6 +88,7 @@ class ChainSerializer(serializers.ModelSerializer):
     transaction_service = serializers.URLField(
         source="transaction_service_uri", default=None
     )
+    vpc_transaction_service = serializers.URLField(source="vpc_transaction_service_uri")
     theme = serializers.SerializerMethodField()
     gas_price = serializers.SerializerMethodField()
     ens_registry_address = EthereumAddressField()
@@ -104,6 +105,7 @@ class Meta:
             "block_explorer_uri_template",
             "native_currency",
             "transaction_service",
+            "vpc_transaction_service",
             "theme",
             "gas_price",
             "ens_registry_address",


Test patch:
diff --git a/src/chains/tests/factories.py b/src/chains/tests/factories.py
--- a/src/chains/tests/factories.py
+++ b/src/chains/tests/factories.py
@@ -31,6 +31,7 @@ class Meta:
     currency_decimals = factory.Faker("pyint")
     currency_logo_uri = factory.django.ImageField()
     transaction_service_uri = factory.Faker("url")
+    vpc_transaction_service_uri = factory.Faker("url")
     theme_text_color = factory.Faker("hex_color")
     theme_background_color = factory.Faker("hex_color")
     ens_registry_address = factory.LazyAttribute(
diff --git a/src/chains/tests/test_views.py b/src/chains/tests/test_views.py
--- a/src/chains/tests/test_views.py
+++ b/src/chains/tests/test_views.py
@@ -49,6 +49,7 @@ def test_json_payload_format(self):
                         "logoUri": chain.currency_logo_uri.url,
                     },
                     "transactionService": chain.transaction_service_uri,
+                    "vpcTransactionService": chain.vpc_transaction_service_uri,
                     "theme": {
                         "textColor": chain.theme_text_color,
                         "backgroundColor": chain.theme_background_color,
@@ -155,6 +156,7 @@ def test_json_payload_format(self):
                 "logoUri": chain.currency_logo_uri.url,
             },
             "transactionService": chain.transaction_service_uri,
+            "vpcTransactionService": chain.vpc_transaction_service_uri,
             "theme": {
                 "textColor": chain.theme_text_color,
                 "backgroundColor": chain.theme_background_color,
@@ -210,6 +212,7 @@ def test_match(self):
                 "logo_uri": chain.currency_logo_uri.url,
             },
             "transaction_service": chain.transaction_service_uri,
+            "vpc_transaction_service": chain.vpc_transaction_service_uri,
             "theme": {
                 "text_color": chain.theme_text_color,
                 "background_color": chain.theme_background_color,