Skip to content

Commit

Permalink
Gateway cuttlefish integration (#811)
Browse files Browse the repository at this point in the history
cuttlefish integration
  • Loading branch information
PawelPawelec-RDX committed Nov 12, 2024
1 parent 89fc1f4 commit 3dd5994
Show file tree
Hide file tree
Showing 1,223 changed files with 19,820 additions and 2,047 deletions.
13 changes: 13 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,19 @@
## 1.9.0
Release built: _not released yet_

### What’s new?
- Added support for the `cuttlefish` protocol version.

### API Changes
- Added a new `/transaction/subintent-status` endpoint to check the status of a transaction subintent.
- Added two new optional fields to the `/transaction/committed-details` endpoint: `subintent_details` and `child_subintent_hashes`, which provide information about transaction subintents if present.
- Added a new `/transaction/preview-v2` endpoint to preview transactions. This supports V2 transactions and beyond. If you still need to preview V1 transactions, use the `/transaction/preview` endpoint instead.

### Database changes
- New `ledger_finalized_subintents` table that stores information about subintent status.
- New `UserV2` ledger transaction type discriminator in the `ledger_transactions` table.
- New `ledger_transaction_subintent_data` table that stores additional information about the transaction's subintents.

## 1.8.2
Release built: 4.11.2024

Expand Down
4 changes: 2 additions & 2 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
<PackageVersion Include="prometheus-net" Version="8.2.1" />
<PackageVersion Include="prometheus-net.AspNetCore" Version="8.2.1" />
<PackageVersion Include="prometheus-net.AspNetCore.HealthChecks" Version="8.2.1" />
<PackageVersion Include="RadixDlt.RadixEngineToolkit" Version="2.1.0" />
<PackageVersion Include="RadixDlt.RadixEngineToolkit" Version="2.2.0-dev9" />
<PackageVersion Include="Swashbuckle.AspNetCore" Version="6.5.0" />
<!-- build time dependencies -->
<PackageVersion Include="coverlet.collector" Version="6.0.1" />
Expand All @@ -34,4 +34,4 @@
<PackageVersion Include="xunit" Version="2.7.0" />
<PackageVersion Include="xunit.runner.visualstudio" Version="2.5.7" />
</ItemGroup>
</Project>
</Project>
30 changes: 15 additions & 15 deletions apps/DataAggregator/packages.lock.json
Original file line number Diff line number Diff line change
Expand Up @@ -636,23 +636,23 @@
"Microsoft.Extensions.Logging.Abstractions": "[8.0.0, )",
"Newtonsoft.Json": "[13.0.3, )",
"Nito.AsyncEx.Coordination": "[5.1.2, )",
"RadixDlt.CoreApiSdk": "[1.7.0-develop, )"
"RadixDlt.CoreApiSdk": "[1.9.0-develop, )"
}
},
"radixdlt.networkgateway.dataaggregator": {
"type": "Project",
"dependencies": {
"RadixDlt.NetworkGateway.Abstractions": "[1.7.0-develop, )"
"RadixDlt.NetworkGateway.Abstractions": "[1.9.0-develop, )"
}
},
"radixdlt.networkgateway.gatewayapi": {
"type": "Project",
"dependencies": {
"FluentValidation.AspNetCore": "[11.3.0, )",
"Microsoft.Extensions.Http.Polly": "[8.0.2, )",
"RadixDlt.NetworkGateway.Abstractions": "[1.7.0-develop, )",
"RadixDlt.NetworkGateway.GatewayApiSdk": "[1.7.0-develop, )",
"RadixDlt.RadixEngineToolkit": "[2.1.0, )"
"RadixDlt.NetworkGateway.Abstractions": "[1.9.0-develop, )",
"RadixDlt.NetworkGateway.GatewayApiSdk": "[1.9.0-develop, )",
"RadixDlt.RadixEngineToolkit": "[2.2.0-dev9, )"
}
},
"radixdlt.networkgateway.gatewayapisdk": {
Expand All @@ -661,7 +661,7 @@
"JsonSubTypes": "[2.0.1, )",
"Newtonsoft.Json": "[13.0.3, )",
"Polly": "[8.3.0, )",
"RadixDlt.NetworkGateway.Abstractions": "[1.7.0-develop, )"
"RadixDlt.NetworkGateway.Abstractions": "[1.9.0-develop, )"
}
},
"radixdlt.networkgateway.postgresintegration": {
Expand All @@ -674,17 +674,17 @@
"Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": "[8.0.2, )",
"Newtonsoft.Json": "[13.0.3, )",
"Npgsql.EntityFrameworkCore.PostgreSQL": "[8.0.2, )",
"RadixDlt.NetworkGateway.Abstractions": "[1.7.0-develop, )",
"RadixDlt.NetworkGateway.DataAggregator": "[1.7.0-develop, )",
"RadixDlt.NetworkGateway.GatewayApi": "[1.7.0-develop, )",
"RadixDlt.RadixEngineToolkit": "[2.1.0, )"
"RadixDlt.NetworkGateway.Abstractions": "[1.9.0-develop, )",
"RadixDlt.NetworkGateway.DataAggregator": "[1.9.0-develop, )",
"RadixDlt.NetworkGateway.GatewayApi": "[1.9.0-develop, )",
"RadixDlt.RadixEngineToolkit": "[2.2.0-dev9, )"
}
},
"radixdlt.networkgateway.prometheusintegration": {
"type": "Project",
"dependencies": {
"RadixDlt.NetworkGateway.DataAggregator": "[1.7.0-develop, )",
"RadixDlt.NetworkGateway.GatewayApi": "[1.7.0-develop, )",
"RadixDlt.NetworkGateway.DataAggregator": "[1.9.0-develop, )",
"RadixDlt.NetworkGateway.GatewayApi": "[1.9.0-develop, )",
"prometheus-net": "[8.2.1, )"
}
},
Expand Down Expand Up @@ -864,9 +864,9 @@
},
"RadixDlt.RadixEngineToolkit": {
"type": "CentralTransitive",
"requested": "[2.1.0, )",
"resolved": "2.1.0",
"contentHash": "+c3+oc6Do0mPO5T1xHKnkzTgXiVPxez6OLWYC+48c3PcOEdUeKxC8u2dxZgSwOuiFItPUkIGQy6uI3+5+D1zcw=="
"requested": "[2.2.0-dev9, )",
"resolved": "2.2.0-dev9",
"contentHash": "FonZwFacydh2ed4V7PLGJ+doR+MXAg+b2llgXfWzYnzHuGk/oE9ETSwl92rjTjbzAy82oz53EI2YTNHWlDOLgw=="
}
}
}
Expand Down
26 changes: 13 additions & 13 deletions apps/DatabaseMigrations/packages.lock.json
Original file line number Diff line number Diff line change
Expand Up @@ -569,23 +569,23 @@
"Microsoft.Extensions.Logging.Abstractions": "[8.0.0, )",
"Newtonsoft.Json": "[13.0.3, )",
"Nito.AsyncEx.Coordination": "[5.1.2, )",
"RadixDlt.CoreApiSdk": "[1.7.0-develop, )"
"RadixDlt.CoreApiSdk": "[1.9.0-develop, )"
}
},
"radixdlt.networkgateway.dataaggregator": {
"type": "Project",
"dependencies": {
"RadixDlt.NetworkGateway.Abstractions": "[1.7.0-develop, )"
"RadixDlt.NetworkGateway.Abstractions": "[1.9.0-develop, )"
}
},
"radixdlt.networkgateway.gatewayapi": {
"type": "Project",
"dependencies": {
"FluentValidation.AspNetCore": "[11.3.0, )",
"Microsoft.Extensions.Http.Polly": "[8.0.2, )",
"RadixDlt.NetworkGateway.Abstractions": "[1.7.0-develop, )",
"RadixDlt.NetworkGateway.GatewayApiSdk": "[1.7.0-develop, )",
"RadixDlt.RadixEngineToolkit": "[2.1.0, )"
"RadixDlt.NetworkGateway.Abstractions": "[1.9.0-develop, )",
"RadixDlt.NetworkGateway.GatewayApiSdk": "[1.9.0-develop, )",
"RadixDlt.RadixEngineToolkit": "[2.2.0-dev9, )"
}
},
"radixdlt.networkgateway.gatewayapisdk": {
Expand All @@ -594,7 +594,7 @@
"JsonSubTypes": "[2.0.1, )",
"Newtonsoft.Json": "[13.0.3, )",
"Polly": "[8.3.0, )",
"RadixDlt.NetworkGateway.Abstractions": "[1.7.0-develop, )"
"RadixDlt.NetworkGateway.Abstractions": "[1.9.0-develop, )"
}
},
"radixdlt.networkgateway.postgresintegration": {
Expand All @@ -607,10 +607,10 @@
"Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": "[8.0.2, )",
"Newtonsoft.Json": "[13.0.3, )",
"Npgsql.EntityFrameworkCore.PostgreSQL": "[8.0.2, )",
"RadixDlt.NetworkGateway.Abstractions": "[1.7.0-develop, )",
"RadixDlt.NetworkGateway.DataAggregator": "[1.7.0-develop, )",
"RadixDlt.NetworkGateway.GatewayApi": "[1.7.0-develop, )",
"RadixDlt.RadixEngineToolkit": "[2.1.0, )"
"RadixDlt.NetworkGateway.Abstractions": "[1.9.0-develop, )",
"RadixDlt.NetworkGateway.DataAggregator": "[1.9.0-develop, )",
"RadixDlt.NetworkGateway.GatewayApi": "[1.9.0-develop, )",
"RadixDlt.RadixEngineToolkit": "[2.2.0-dev9, )"
}
},
"Dapper": {
Expand Down Expand Up @@ -789,9 +789,9 @@
},
"RadixDlt.RadixEngineToolkit": {
"type": "CentralTransitive",
"requested": "[2.1.0, )",
"resolved": "2.1.0",
"contentHash": "+c3+oc6Do0mPO5T1xHKnkzTgXiVPxez6OLWYC+48c3PcOEdUeKxC8u2dxZgSwOuiFItPUkIGQy6uI3+5+D1zcw=="
"requested": "[2.2.0-dev9, )",
"resolved": "2.2.0-dev9",
"contentHash": "FonZwFacydh2ed4V7PLGJ+doR+MXAg+b2llgXfWzYnzHuGk/oE9ETSwl92rjTjbzAy82oz53EI2YTNHWlDOLgw=="
}
}
}
Expand Down
12 changes: 12 additions & 0 deletions apps/GatewayApi/Controllers/TransactionController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,12 @@ public TransactionController(ITransactionHandler transactionHandler)
return await _transactionHandler.Construction(token);
}

[HttpPost("subintent-status")]
public async Task<GatewayModel.TransactionSubintentStatusResponse> Status(GatewayModel.TransactionSubintentStatusRequest request, CancellationToken token)
{
return await _transactionHandler.SubintentStatus(request, token);
}

[HttpPost("status")]
public async Task<GatewayModel.TransactionStatusResponse> Status(GatewayModel.TransactionStatusRequest request, CancellationToken token)
{
Expand All @@ -105,6 +111,12 @@ public TransactionController(ITransactionHandler transactionHandler)
return await _transactionHandler.Preview(request, token);
}

[HttpPost("preview-v2")]
public async Task<GatewayModel.TransactionPreviewV2Response> PreviewV2(GatewayModel.TransactionPreviewV2Request request, CancellationToken token)
{
return await _transactionHandler.PreviewV2(request, token);
}

[HttpPost("submit")]
public async Task<GatewayModel.TransactionSubmitResponse> Submit(GatewayModel.TransactionSubmitRequest request, CancellationToken token)
{
Expand Down
63 changes: 48 additions & 15 deletions apps/GatewayApi/OpenApiDocumentHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -69,9 +69,8 @@
using Microsoft.OpenApi.Writers;
using RadixDlt.NetworkGateway.Abstractions.Network;
using RadixDlt.NetworkGateway.GatewayApi;
using RadixDlt.NetworkGateway.GatewayApi.Handlers;
using RadixDlt.NetworkGateway.GatewayApi.Services;
using RadixDlt.NetworkGateway.GatewayApiSdk.Model;
using RadixEngineToolkit;
using System;
using System.Collections.Generic;
using System.Globalization;
Expand All @@ -88,12 +87,11 @@ public static class OpenApiDocumentHandler
{
public static async Task Handle(
[FromServices] INetworkConfigurationProvider networkConfigurationProvider,
[FromServices] ITransactionHandler transactionHandler,
[FromServices] ILedgerStateQuerier ledgerStateQuerier,
[FromServices] ITransactionQuerier transactionQuerier,
HttpContext context,
CancellationToken token = default)
{
var placeholderReplacements = await GetPlaceholderReplacementsAsync(networkConfigurationProvider, transactionHandler, ledgerStateQuerier, token);
var placeholderReplacements = await GetPlaceholderReplacementsAsync(networkConfigurationProvider, transactionQuerier, token);

var assembly = typeof(GatewayApiBuilder).Assembly;
var stream = assembly.GetManifestResourceStream($"{assembly.GetName().Name}.gateway-api-schema.yaml");
Expand All @@ -103,10 +101,11 @@ public static async Task Handle(
RemoveRedoclySpecificTags(document.Tags);

document.Servers.Clear();
document.Servers.Add(new OpenApiServer
{
Url = "/",
});
document.Servers.Add(
new OpenApiServer
{
Url = "/",
});

context.Response.StatusCode = (int)HttpStatusCode.OK;
context.Response.ContentType = "application/json; charset=utf-8";
Expand All @@ -124,8 +123,10 @@ public static async Task Handle(
response = OptionalReplace(response, "<component-entity-address>", placeholderReplacements.ComponentAddress);
response = OptionalReplace(response, "<package-address>", placeholderReplacements.PackageAddress);
response = OptionalReplace(response, "<transaction-intent-hash>", placeholderReplacements.CommittedTransactionIntentHash);
response = OptionalReplace(response, "<transaction-subintent-hash>", placeholderReplacements.CommittedSubintentHash);
response = OptionalReplace(response, "<network-id>", placeholderReplacements.NetworkId?.ToString());
response = OptionalReplace(response, "<network-name>", placeholderReplacements.NetworkName);
response = OptionalReplace(response, "<sample-preview-transaction-hex>", placeholderReplacements.SamplePreviewTransactionHex);
await context.Response.WriteAsync(response, Encoding.UTF8, token);
}

Expand All @@ -142,7 +143,8 @@ private static void RemoveRedoclySpecificTags(IList<OpenApiTag> tags)
var redoclyLinkTag = new OpenApiTag
{
Name = "Examples + More Docs",
Description = @"Please see the full API documentation in [ReDocly](https://radix-babylon-gateway-api.redoc.ly/) for details about the API abstractions and worked examples for many use cases.",
Description =
@"Please see the full API documentation in [ReDocly](https://radix-babylon-gateway-api.redoc.ly/) for details about the API abstractions and worked examples for many use cases.",
};

tags.Insert(1, redoclyLinkTag);
Expand All @@ -163,17 +165,18 @@ private class PlaceholderReplacements

public string? CommittedTransactionIntentHash { get; set; }

public string? CommittedSubintentHash { get; set; }

public byte? NetworkId { get; set; }

public string? NetworkName { get; set; }

public long LedgerStateVersion { get; set; }
public string? SamplePreviewTransactionHex { get; set; }
}

private static async Task<PlaceholderReplacements> GetPlaceholderReplacementsAsync(
INetworkConfigurationProvider networkConfigurationProvider,
ITransactionHandler transactionHandler,
ILedgerStateQuerier ledgerStateQuerier,
ITransactionQuerier transactionQuerier,
CancellationToken token)
{
var placeholderReplacements = new PlaceholderReplacements();
Expand All @@ -194,8 +197,10 @@ private static async Task<PlaceholderReplacements> GetPlaceholderReplacementsAsy

try
{
var sampleTransaction = (await transactionHandler.StreamTransactions(new StreamTransactionsRequest(limitPerPage: 1), token)).Items.FirstOrDefault();
placeholderReplacements.CommittedTransactionIntentHash = sampleTransaction?.IntentHash;
var (randomIntentHash, randomSubintentHash, currentEpoch) = await transactionQuerier.GetOpenApiDocumentHandlerDetails(token);
placeholderReplacements.CommittedTransactionIntentHash = randomIntentHash;
placeholderReplacements.CommittedSubintentHash = randomSubintentHash;
placeholderReplacements.SamplePreviewTransactionHex = GenerateRandomPreviewTransactionHex(networkConfiguration.Id, (ulong?)currentEpoch);
}
catch (Exception)
{
Expand All @@ -204,4 +209,32 @@ private static async Task<PlaceholderReplacements> GetPlaceholderReplacementsAsy

return placeholderReplacements;
}

private static string GenerateRandomPreviewTransactionHex(byte networkId, ulong? currentEpoch)
{
var random = new Random();
var privateKey = new byte[32];
random.NextBytes(privateKey);

var manifest = new ManifestV2Builder(networkId)
.FaucetLockFee()
.Build();

return Convert.ToHexString(
new PreviewTransactionV2Builder()
.Manifest(manifest)
.IntentHeader(
new IntentHeaderV2(
networkId,
currentEpoch ?? 1UL,
currentEpoch.HasValue ? currentEpoch.Value + 100UL : 1000UL,
null,
null,
1)
)
.TransactionHeader(new TransactionHeaderV2(PrivateKey.NewEd25519(privateKey).PublicKey(), false, 5U * 100u))
.Message(new MessageV2.None())
.Build()
);
}
}
Loading

0 comments on commit 3dd5994

Please sign in to comment.