diff --git a/csharp/src/Data.Npgsql/Migrations/20250812210102_AddAztechComment.Designer.cs b/csharp/src/Data.Npgsql/Migrations/20250812210102_AddAztechComment.Designer.cs
new file mode 100644
index 00000000..36dab38d
--- /dev/null
+++ b/csharp/src/Data.Npgsql/Migrations/20250812210102_AddAztechComment.Designer.cs
@@ -0,0 +1,1069 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+using Train.Solver.Data.Npgsql;
+
+#nullable disable
+
+namespace Train.Solver.Data.Npgsql.Migrations
+{
+ [DbContext(typeof(SolverDbContext))]
+ [Migration("20250812210102_AddAztechComment")]
+ partial class AddAztechComment
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "9.0.0")
+ .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+ NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+
+ modelBuilder.Entity("Train.Solver.Data.Abstractions.Entities.Expense", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("CreatedDate")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("timestamp with time zone")
+ .HasDefaultValueSql("now()");
+
+ b.Property("FeeTokenId")
+ .HasColumnType("integer");
+
+ b.PrimitiveCollection("LastFeeValues")
+ .IsRequired()
+ .HasColumnType("text[]");
+
+ b.Property("TokenId")
+ .HasColumnType("integer");
+
+ b.Property("TransactionType")
+ .HasColumnType("integer")
+ .HasComment("Transfer=0,Approve=1,HTLCCommit=2,HTLCLock=3,HTLCRedeem=4,HTLCRefund=5,HTLCAddLockSig=6");
+
+ b.Property("Version")
+ .IsConcurrencyToken()
+ .ValueGeneratedOnAddOrUpdate()
+ .HasColumnType("xid")
+ .HasColumnName("xmin");
+
+ b.HasKey("Id");
+
+ b.HasIndex("FeeTokenId");
+
+ b.HasIndex("TokenId", "FeeTokenId", "TransactionType")
+ .IsUnique();
+
+ b.ToTable("Expenses");
+ });
+
+ modelBuilder.Entity("Train.Solver.Data.Abstractions.Entities.Network", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("ChainId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("CreatedDate")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("timestamp with time zone")
+ .HasDefaultValueSql("now()");
+
+ b.Property("DisplayName")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("FeePercentageIncrease")
+ .HasColumnType("integer");
+
+ b.Property("FeeType")
+ .HasColumnType("integer");
+
+ b.Property("HTLCNativeContractAddress")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("HTLCTokenContractAddress")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("NativeTokenId")
+ .HasColumnType("integer");
+
+ b.Property("Type")
+ .HasColumnType("integer")
+ .HasComment("EVM=0,Solana=1,Starknet=2,Fuel=3,Aztec=4");
+
+ b.Property("Version")
+ .IsConcurrencyToken()
+ .ValueGeneratedOnAddOrUpdate()
+ .HasColumnType("xid")
+ .HasColumnName("xmin");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Name")
+ .IsUnique();
+
+ b.HasIndex("NativeTokenId");
+
+ b.HasIndex("ChainId", "Type")
+ .IsUnique();
+
+ b.ToTable("Networks");
+ });
+
+ modelBuilder.Entity("Train.Solver.Data.Abstractions.Entities.Node", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("CreatedDate")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("timestamp with time zone")
+ .HasDefaultValueSql("now()");
+
+ b.Property("NetworkId")
+ .HasColumnType("integer");
+
+ b.Property("ProviderName")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Url")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Version")
+ .IsConcurrencyToken()
+ .ValueGeneratedOnAddOrUpdate()
+ .HasColumnType("xid")
+ .HasColumnName("xmin");
+
+ b.HasKey("Id");
+
+ b.HasIndex("NetworkId");
+
+ b.HasIndex("ProviderName", "NetworkId")
+ .IsUnique();
+
+ b.ToTable("Nodes");
+ });
+
+ modelBuilder.Entity("Train.Solver.Data.Abstractions.Entities.RateProvider", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("CreatedDate")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("timestamp with time zone")
+ .HasDefaultValueSql("now()");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Version")
+ .IsConcurrencyToken()
+ .ValueGeneratedOnAddOrUpdate()
+ .HasColumnType("xid")
+ .HasColumnName("xmin");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Name")
+ .IsUnique();
+
+ b.ToTable("RateProviders");
+
+ b.HasData(
+ new
+ {
+ Id = 100000,
+ CreatedDate = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
+ Name = "SameAsset",
+ Version = 0u
+ },
+ new
+ {
+ Id = 100001,
+ CreatedDate = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
+ Name = "Binance",
+ Version = 0u
+ });
+ });
+
+ modelBuilder.Entity("Train.Solver.Data.Abstractions.Entities.Route", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("CreatedDate")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("timestamp with time zone")
+ .HasDefaultValueSql("now()");
+
+ b.Property("DestinationTokenId")
+ .HasColumnType("integer");
+
+ b.Property("DestinationWalletId")
+ .HasColumnType("integer");
+
+ b.Property("IgnoreExpenseFee")
+ .HasColumnType("boolean");
+
+ b.Property("MaxAmountInSource")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("MinAmountInSource")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("RateProviderId")
+ .HasColumnType("integer");
+
+ b.Property("ServiceFeeId")
+ .HasColumnType("integer");
+
+ b.Property("SourceTokenId")
+ .HasColumnType("integer");
+
+ b.Property("SourceWalletId")
+ .HasColumnType("integer");
+
+ b.Property("Status")
+ .HasColumnType("integer")
+ .HasComment("Active=0,Inactive=1,Archived=2");
+
+ b.Property("Version")
+ .IsConcurrencyToken()
+ .ValueGeneratedOnAddOrUpdate()
+ .HasColumnType("xid")
+ .HasColumnName("xmin");
+
+ b.HasKey("Id");
+
+ b.HasIndex("DestinationTokenId");
+
+ b.HasIndex("DestinationWalletId");
+
+ b.HasIndex("RateProviderId");
+
+ b.HasIndex("ServiceFeeId");
+
+ b.HasIndex("SourceWalletId");
+
+ b.HasIndex("SourceTokenId", "DestinationTokenId")
+ .IsUnique();
+
+ b.ToTable("Routes");
+ });
+
+ modelBuilder.Entity("Train.Solver.Data.Abstractions.Entities.ServiceFee", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("CreatedDate")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("timestamp with time zone")
+ .HasDefaultValueSql("now()");
+
+ b.Property("FeeInUsd")
+ .HasColumnType("numeric");
+
+ b.Property("FeePercentage")
+ .HasColumnType("numeric");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Version")
+ .IsConcurrencyToken()
+ .ValueGeneratedOnAddOrUpdate()
+ .HasColumnType("xid")
+ .HasColumnName("xmin");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Name")
+ .IsUnique();
+
+ b.ToTable("ServiceFees");
+
+ b.HasData(
+ new
+ {
+ Id = 100000,
+ CreatedDate = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
+ FeeInUsd = 0m,
+ FeePercentage = 0m,
+ Name = "Free",
+ Version = 0u
+ },
+ new
+ {
+ Id = 100001,
+ CreatedDate = new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
+ FeeInUsd = 0m,
+ FeePercentage = 0m,
+ Name = "Default",
+ Version = 0u
+ });
+ });
+
+ modelBuilder.Entity("Train.Solver.Data.Abstractions.Entities.SignerAgent", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("CreatedDate")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("timestamp with time zone")
+ .HasDefaultValueSql("now()");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.PrimitiveCollection("SupportedTypes")
+ .IsRequired()
+ .HasColumnType("integer[]");
+
+ b.Property("Url")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Version")
+ .IsConcurrencyToken()
+ .ValueGeneratedOnAddOrUpdate()
+ .HasColumnType("xid")
+ .HasColumnName("xmin");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Name")
+ .IsUnique();
+
+ b.ToTable("SignerAgents");
+ });
+
+ modelBuilder.Entity("Train.Solver.Data.Abstractions.Entities.Swap", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("CommitId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("CreatedDate")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("timestamp with time zone")
+ .HasDefaultValueSql("now()");
+
+ b.Property("DestinationAddress")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("DestinationAmount")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("FeeAmount")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Hashlock")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("MetricId")
+ .HasColumnType("integer");
+
+ b.Property("RouteId")
+ .HasColumnType("integer");
+
+ b.Property("SourceAddress")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("SourceAmount")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Version")
+ .IsConcurrencyToken()
+ .ValueGeneratedOnAddOrUpdate()
+ .HasColumnType("xid")
+ .HasColumnName("xmin");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CommitId")
+ .IsUnique();
+
+ b.HasIndex("CreatedDate");
+
+ b.HasIndex("DestinationAddress");
+
+ b.HasIndex("RouteId");
+
+ b.HasIndex("SourceAddress");
+
+ b.ToTable("Swaps");
+ });
+
+ modelBuilder.Entity("Train.Solver.Data.Abstractions.Entities.SwapMetric", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("CreatedDate")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("timestamp with time zone")
+ .HasDefaultValueSql("now()");
+
+ b.Property("DestinationNetwork")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("DestinationToken")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("ProfitInUsd")
+ .HasColumnType("numeric");
+
+ b.Property("SourceNetwork")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("SourceToken")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("SwapId")
+ .HasColumnType("integer");
+
+ b.Property("Version")
+ .IsConcurrencyToken()
+ .ValueGeneratedOnAddOrUpdate()
+ .HasColumnType("xid")
+ .HasColumnName("xmin");
+
+ b.Property("VolumeInUsd")
+ .HasColumnType("numeric");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CreatedDate");
+
+ b.HasIndex("DestinationNetwork");
+
+ b.HasIndex("SourceNetwork");
+
+ b.HasIndex("SwapId")
+ .IsUnique();
+
+ b.ToTable("SwapMetrics");
+ });
+
+ modelBuilder.Entity("Train.Solver.Data.Abstractions.Entities.Token", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Asset")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("CreatedDate")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("timestamp with time zone")
+ .HasDefaultValueSql("now()");
+
+ b.Property("Decimals")
+ .HasColumnType("integer");
+
+ b.Property("NetworkId")
+ .HasColumnType("integer");
+
+ b.Property("TokenContract")
+ .HasColumnType("text");
+
+ b.Property("TokenPriceId")
+ .HasColumnType("integer");
+
+ b.Property("Version")
+ .IsConcurrencyToken()
+ .ValueGeneratedOnAddOrUpdate()
+ .HasColumnType("xid")
+ .HasColumnName("xmin");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Asset");
+
+ b.HasIndex("TokenPriceId");
+
+ b.HasIndex("NetworkId", "Asset")
+ .IsUnique();
+
+ b.ToTable("Tokens");
+ });
+
+ modelBuilder.Entity("Train.Solver.Data.Abstractions.Entities.TokenPrice", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("CreatedDate")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("timestamp with time zone")
+ .HasDefaultValueSql("now()");
+
+ b.Property("ExternalId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("LastUpdated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("PriceInUsd")
+ .HasColumnType("numeric");
+
+ b.Property("Symbol")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Version")
+ .IsConcurrencyToken()
+ .ValueGeneratedOnAddOrUpdate()
+ .HasColumnType("xid")
+ .HasColumnName("xmin");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Symbol")
+ .IsUnique();
+
+ b.ToTable("TokenPrices");
+
+ b.HasData(
+ new
+ {
+ Id = 10002,
+ CreatedDate = new DateTimeOffset(new DateTime(2025, 8, 12, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
+ ExternalId = "bitcoin",
+ LastUpdated = new DateTimeOffset(new DateTime(2025, 8, 12, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
+ PriceInUsd = 0m,
+ Symbol = "BTC",
+ Version = 0u
+ },
+ new
+ {
+ Id = 10008,
+ CreatedDate = new DateTimeOffset(new DateTime(2025, 8, 12, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
+ ExternalId = "fuel-network",
+ LastUpdated = new DateTimeOffset(new DateTime(2025, 8, 12, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
+ PriceInUsd = 0m,
+ Symbol = "FUEL",
+ Version = 0u
+ },
+ new
+ {
+ Id = 10014,
+ CreatedDate = new DateTimeOffset(new DateTime(2025, 8, 12, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
+ ExternalId = "avalanche-2",
+ LastUpdated = new DateTimeOffset(new DateTime(2025, 8, 12, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
+ PriceInUsd = 0m,
+ Symbol = "AVAX",
+ Version = 0u
+ },
+ new
+ {
+ Id = 10018,
+ CreatedDate = new DateTimeOffset(new DateTime(2025, 8, 12, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
+ ExternalId = "optimism",
+ LastUpdated = new DateTimeOffset(new DateTime(2025, 8, 12, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
+ PriceInUsd = 0m,
+ Symbol = "OP",
+ Version = 0u
+ },
+ new
+ {
+ Id = 10026,
+ CreatedDate = new DateTimeOffset(new DateTime(2025, 8, 12, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
+ ExternalId = "ethereum",
+ LastUpdated = new DateTimeOffset(new DateTime(2025, 8, 12, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
+ PriceInUsd = 0m,
+ Symbol = "ETH",
+ Version = 0u
+ },
+ new
+ {
+ Id = 10035,
+ CreatedDate = new DateTimeOffset(new DateTime(2025, 8, 12, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
+ ExternalId = "solana",
+ LastUpdated = new DateTimeOffset(new DateTime(2025, 8, 12, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
+ PriceInUsd = 0m,
+ Symbol = "SOL",
+ Version = 0u
+ },
+ new
+ {
+ Id = 10043,
+ CreatedDate = new DateTimeOffset(new DateTime(2025, 8, 12, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
+ ExternalId = "dai",
+ LastUpdated = new DateTimeOffset(new DateTime(2025, 8, 12, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
+ PriceInUsd = 0m,
+ Symbol = "DAI",
+ Version = 0u
+ },
+ new
+ {
+ Id = 10046,
+ CreatedDate = new DateTimeOffset(new DateTime(2025, 8, 12, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
+ ExternalId = "usd-coin",
+ LastUpdated = new DateTimeOffset(new DateTime(2025, 8, 12, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
+ PriceInUsd = 0m,
+ Symbol = "USDC",
+ Version = 0u
+ },
+ new
+ {
+ Id = 10050,
+ CreatedDate = new DateTimeOffset(new DateTime(2025, 8, 12, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
+ ExternalId = "immutable-x",
+ LastUpdated = new DateTimeOffset(new DateTime(2025, 8, 12, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
+ PriceInUsd = 0m,
+ Symbol = "IMX",
+ Version = 0u
+ },
+ new
+ {
+ Id = 10054,
+ CreatedDate = new DateTimeOffset(new DateTime(2025, 8, 12, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
+ ExternalId = "binancecoin",
+ LastUpdated = new DateTimeOffset(new DateTime(2025, 8, 12, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
+ PriceInUsd = 0m,
+ Symbol = "BNB",
+ Version = 0u
+ },
+ new
+ {
+ Id = 10055,
+ CreatedDate = new DateTimeOffset(new DateTime(2025, 8, 12, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
+ ExternalId = "tether",
+ LastUpdated = new DateTimeOffset(new DateTime(2025, 8, 12, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
+ PriceInUsd = 0m,
+ Symbol = "USDT",
+ Version = 0u
+ },
+ new
+ {
+ Id = 10056,
+ CreatedDate = new DateTimeOffset(new DateTime(2025, 8, 12, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
+ ExternalId = "matic-network",
+ LastUpdated = new DateTimeOffset(new DateTime(2025, 8, 12, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
+ PriceInUsd = 0m,
+ Symbol = "MATIC",
+ Version = 0u
+ },
+ new
+ {
+ Id = 10063,
+ CreatedDate = new DateTimeOffset(new DateTime(2025, 8, 12, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
+ ExternalId = "polygon-ecosystem-token",
+ LastUpdated = new DateTimeOffset(new DateTime(2025, 8, 12, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
+ PriceInUsd = 0m,
+ Symbol = "POL",
+ Version = 0u
+ },
+ new
+ {
+ Id = 10069,
+ CreatedDate = new DateTimeOffset(new DateTime(2025, 8, 12, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
+ ExternalId = "ronin",
+ LastUpdated = new DateTimeOffset(new DateTime(2025, 8, 12, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
+ PriceInUsd = 0m,
+ Symbol = "RON",
+ Version = 0u
+ });
+ });
+
+ modelBuilder.Entity("Train.Solver.Data.Abstractions.Entities.Transaction", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("CreatedDate")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("timestamp with time zone")
+ .HasDefaultValueSql("now()");
+
+ b.Property("FeeAmount")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("NetworkId")
+ .HasColumnType("integer");
+
+ b.Property("Status")
+ .HasColumnType("integer")
+ .HasComment("Completed=0,Initiated=1,Failed=2");
+
+ b.Property("SwapId")
+ .HasColumnType("integer");
+
+ b.Property("Timestamp")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("TransactionHash")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Type")
+ .HasColumnType("integer")
+ .HasComment("Transfer=0,Approve=1,HTLCCommit=2,HTLCLock=3,HTLCRedeem=4,HTLCRefund=5,HTLCAddLockSig=6");
+
+ b.Property("Version")
+ .IsConcurrencyToken()
+ .ValueGeneratedOnAddOrUpdate()
+ .HasColumnType("xid")
+ .HasColumnName("xmin");
+
+ b.HasKey("Id");
+
+ b.HasIndex("NetworkId");
+
+ b.HasIndex("Status");
+
+ b.HasIndex("SwapId");
+
+ b.HasIndex("TransactionHash");
+
+ b.HasIndex("Type");
+
+ b.HasIndex("TransactionHash", "NetworkId")
+ .IsUnique();
+
+ b.ToTable("Transactions");
+ });
+
+ modelBuilder.Entity("Train.Solver.Data.Abstractions.Entities.TrustedWallet", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Address")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("CreatedDate")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("timestamp with time zone")
+ .HasDefaultValueSql("now()");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("NetworkType")
+ .HasColumnType("integer");
+
+ b.Property("Version")
+ .IsConcurrencyToken()
+ .ValueGeneratedOnAddOrUpdate()
+ .HasColumnType("xid")
+ .HasColumnName("xmin");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Address", "NetworkType");
+
+ b.HasIndex("Name", "NetworkType")
+ .IsUnique();
+
+ b.ToTable("TrustedWallets");
+ });
+
+ modelBuilder.Entity("Train.Solver.Data.Abstractions.Entities.Wallet", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Address")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("CreatedDate")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("timestamp with time zone")
+ .HasDefaultValueSql("now()");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("NetworkType")
+ .HasColumnType("integer");
+
+ b.Property("SignerAgentId")
+ .HasColumnType("integer");
+
+ b.Property("Version")
+ .IsConcurrencyToken()
+ .ValueGeneratedOnAddOrUpdate()
+ .HasColumnType("xid")
+ .HasColumnName("xmin");
+
+ b.HasKey("Id");
+
+ b.HasIndex("SignerAgentId");
+
+ b.HasIndex("Address", "NetworkType");
+
+ b.HasIndex("Name", "NetworkType")
+ .IsUnique();
+
+ b.ToTable("Wallets");
+ });
+
+ modelBuilder.Entity("Train.Solver.Data.Abstractions.Entities.Expense", b =>
+ {
+ b.HasOne("Train.Solver.Data.Abstractions.Entities.Token", "FeeToken")
+ .WithMany()
+ .HasForeignKey("FeeTokenId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Train.Solver.Data.Abstractions.Entities.Token", "Token")
+ .WithMany()
+ .HasForeignKey("TokenId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("FeeToken");
+
+ b.Navigation("Token");
+ });
+
+ modelBuilder.Entity("Train.Solver.Data.Abstractions.Entities.Network", b =>
+ {
+ b.HasOne("Train.Solver.Data.Abstractions.Entities.Token", "NativeToken")
+ .WithMany()
+ .HasForeignKey("NativeTokenId");
+
+ b.Navigation("NativeToken");
+ });
+
+ modelBuilder.Entity("Train.Solver.Data.Abstractions.Entities.Node", b =>
+ {
+ b.HasOne("Train.Solver.Data.Abstractions.Entities.Network", "Network")
+ .WithMany("Nodes")
+ .HasForeignKey("NetworkId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Network");
+ });
+
+ modelBuilder.Entity("Train.Solver.Data.Abstractions.Entities.Route", b =>
+ {
+ b.HasOne("Train.Solver.Data.Abstractions.Entities.Token", "DestinationToken")
+ .WithMany()
+ .HasForeignKey("DestinationTokenId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Train.Solver.Data.Abstractions.Entities.Wallet", "DestinationWallet")
+ .WithMany()
+ .HasForeignKey("DestinationWalletId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Train.Solver.Data.Abstractions.Entities.RateProvider", "RateProvider")
+ .WithMany()
+ .HasForeignKey("RateProviderId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Train.Solver.Data.Abstractions.Entities.ServiceFee", "ServiceFee")
+ .WithMany()
+ .HasForeignKey("ServiceFeeId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Train.Solver.Data.Abstractions.Entities.Token", "SourceToken")
+ .WithMany()
+ .HasForeignKey("SourceTokenId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Train.Solver.Data.Abstractions.Entities.Wallet", "SourceWallet")
+ .WithMany()
+ .HasForeignKey("SourceWalletId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("DestinationToken");
+
+ b.Navigation("DestinationWallet");
+
+ b.Navigation("RateProvider");
+
+ b.Navigation("ServiceFee");
+
+ b.Navigation("SourceToken");
+
+ b.Navigation("SourceWallet");
+ });
+
+ modelBuilder.Entity("Train.Solver.Data.Abstractions.Entities.Swap", b =>
+ {
+ b.HasOne("Train.Solver.Data.Abstractions.Entities.Route", "Route")
+ .WithMany()
+ .HasForeignKey("RouteId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Route");
+ });
+
+ modelBuilder.Entity("Train.Solver.Data.Abstractions.Entities.SwapMetric", b =>
+ {
+ b.HasOne("Train.Solver.Data.Abstractions.Entities.Swap", "Swap")
+ .WithOne("Metric")
+ .HasForeignKey("Train.Solver.Data.Abstractions.Entities.SwapMetric", "SwapId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Swap");
+ });
+
+ modelBuilder.Entity("Train.Solver.Data.Abstractions.Entities.Token", b =>
+ {
+ b.HasOne("Train.Solver.Data.Abstractions.Entities.Network", "Network")
+ .WithMany("Tokens")
+ .HasForeignKey("NetworkId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Train.Solver.Data.Abstractions.Entities.TokenPrice", "TokenPrice")
+ .WithMany()
+ .HasForeignKey("TokenPriceId")
+ .OnDelete(DeleteBehavior.NoAction)
+ .IsRequired();
+
+ b.Navigation("Network");
+
+ b.Navigation("TokenPrice");
+ });
+
+ modelBuilder.Entity("Train.Solver.Data.Abstractions.Entities.Transaction", b =>
+ {
+ b.HasOne("Train.Solver.Data.Abstractions.Entities.Network", "Network")
+ .WithMany()
+ .HasForeignKey("NetworkId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Train.Solver.Data.Abstractions.Entities.Swap", "Swap")
+ .WithMany("Transactions")
+ .HasForeignKey("SwapId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.Navigation("Network");
+
+ b.Navigation("Swap");
+ });
+
+ modelBuilder.Entity("Train.Solver.Data.Abstractions.Entities.Wallet", b =>
+ {
+ b.HasOne("Train.Solver.Data.Abstractions.Entities.SignerAgent", "SignerAgent")
+ .WithMany()
+ .HasForeignKey("SignerAgentId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("SignerAgent");
+ });
+
+ modelBuilder.Entity("Train.Solver.Data.Abstractions.Entities.Network", b =>
+ {
+ b.Navigation("Nodes");
+
+ b.Navigation("Tokens");
+ });
+
+ modelBuilder.Entity("Train.Solver.Data.Abstractions.Entities.Swap", b =>
+ {
+ b.Navigation("Metric");
+
+ b.Navigation("Transactions");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/csharp/src/Data.Npgsql/Migrations/20250812210102_AddAztechComment.cs b/csharp/src/Data.Npgsql/Migrations/20250812210102_AddAztechComment.cs
new file mode 100644
index 00000000..a8048dbb
--- /dev/null
+++ b/csharp/src/Data.Npgsql/Migrations/20250812210102_AddAztechComment.cs
@@ -0,0 +1,38 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace Train.Solver.Data.Npgsql.Migrations
+{
+ ///
+ public partial class AddAztechComment : Migration
+ {
+ ///
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.AlterColumn(
+ name: "Type",
+ table: "Networks",
+ type: "integer",
+ nullable: false,
+ comment: "EVM=0,Solana=1,Starknet=2,Fuel=3,Aztec=4",
+ oldClrType: typeof(int),
+ oldType: "integer",
+ oldComment: "EVM=0,Solana=1,Starknet=2,Fuel=3");
+ }
+
+ ///
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.AlterColumn(
+ name: "Type",
+ table: "Networks",
+ type: "integer",
+ nullable: false,
+ comment: "EVM=0,Solana=1,Starknet=2,Fuel=3",
+ oldClrType: typeof(int),
+ oldType: "integer",
+ oldComment: "EVM=0,Solana=1,Starknet=2,Fuel=3,Aztec=4");
+ }
+ }
+}
diff --git a/csharp/src/Data.Npgsql/Migrations/SolverDbContextModelSnapshot.cs b/csharp/src/Data.Npgsql/Migrations/SolverDbContextModelSnapshot.cs
index 5cc6a85d..bdf2b8aa 100644
--- a/csharp/src/Data.Npgsql/Migrations/SolverDbContextModelSnapshot.cs
+++ b/csharp/src/Data.Npgsql/Migrations/SolverDbContextModelSnapshot.cs
@@ -109,7 +109,7 @@ protected override void BuildModel(ModelBuilder modelBuilder)
b.Property("Type")
.HasColumnType("integer")
- .HasComment("EVM=0,Solana=1,Starknet=2,Fuel=3");
+ .HasComment("EVM=0,Solana=1,Starknet=2,Fuel=3,Aztec=4");
b.Property("Version")
.IsConcurrencyToken()