diff --git a/src/Blockcore.Indexer.Angor/AngorStartup.cs b/src/Blockcore.Indexer.Angor/AngorStartup.cs index 0e22b7d..7d71dee 100644 --- a/src/Blockcore.Indexer.Angor/AngorStartup.cs +++ b/src/Blockcore.Indexer.Angor/AngorStartup.cs @@ -32,7 +32,7 @@ public void ConfigureServices(IServiceCollection services) services.AddSingleton(); services.AddScoped(); - services.AddScoped(); + services.AddScoped(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) diff --git a/src/Blockcore.Indexer.Angor/Operations/Types/ProjectStats.cs b/src/Blockcore.Indexer.Angor/Operations/Types/ProjectStats.cs index 189c538..f7c4412 100644 --- a/src/Blockcore.Indexer.Angor/Operations/Types/ProjectStats.cs +++ b/src/Blockcore.Indexer.Angor/Operations/Types/ProjectStats.cs @@ -4,6 +4,7 @@ public class ProjectStats { public long InvestorCount { get; set; } public long AmountInvested { get; set; } + public long AmountSpentSoFarByFounder { get; set; } public long AmountInPenalties { get; set; } - public long CountInPenalties { get; set; } + public int CountInPenalties { get; set; } } diff --git a/src/Blockcore.Indexer.Angor/Properties/launchSettings.json b/src/Blockcore.Indexer.Angor/Properties/launchSettings.json index 17e333c..ac598f2 100644 --- a/src/Blockcore.Indexer.Angor/Properties/launchSettings.json +++ b/src/Blockcore.Indexer.Angor/Properties/launchSettings.json @@ -1,6 +1,6 @@ { "profiles": { - "TBTC-signet": { + "Angor TBTC-signet": { "commandName": "Project", "commandLineArgs": "--chain=TBTC --Network:RPCPort=38332", "dotnetRunMessages": true, diff --git a/src/Blockcore.Indexer.Angor/Storage/Mongo/AngorMongoBuilder.cs b/src/Blockcore.Indexer.Angor/Storage/Mongo/AngorMongoBuilder.cs index c6b775b..c5f3674 100644 --- a/src/Blockcore.Indexer.Angor/Storage/Mongo/AngorMongoBuilder.cs +++ b/src/Blockcore.Indexer.Angor/Storage/Mongo/AngorMongoBuilder.cs @@ -52,7 +52,7 @@ public override Task OnExecute() //TODO move this to the block indexer task runner, but we'll need to move the indexes in there to a different class for each project/blockchain AngorMongoDb.InvestmentTable.Indexes .CreateOne(new CreateIndexModel(Builders - .IndexKeys.Hashed(_ => _.TransactionIndex))); + .IndexKeys.Hashed(_ => _.TransactionId))); return Task.CompletedTask; } diff --git a/src/Blockcore.Indexer.Angor/Storage/Mongo/AngorMongoData.cs b/src/Blockcore.Indexer.Angor/Storage/Mongo/AngorMongoData.cs index 5dfb2f3..01a6764 100644 --- a/src/Blockcore.Indexer.Angor/Storage/Mongo/AngorMongoData.cs +++ b/src/Blockcore.Indexer.Angor/Storage/Mongo/AngorMongoData.cs @@ -6,9 +6,11 @@ using Blockcore.Indexer.Core.Settings; using Blockcore.Indexer.Core.Storage; using Blockcore.Indexer.Core.Storage.Mongo; +using Blockcore.Indexer.Core.Storage.Mongo.Types; using Blockcore.Indexer.Core.Storage.Types; using Blockcore.Indexer.Core.Sync; using Microsoft.Extensions.Options; +using MongoDB.Bson; using MongoDB.Driver; namespace Blockcore.Indexer.Angor.Storage.Mongo; @@ -54,28 +56,170 @@ public AngorMongoData(ILogger dbLogger, SyncConnection connection, public async Task GetProjectStatsAsync(string projectId) { - var project = mongoDb.ProjectTable + var projectExists = mongoDb.ProjectTable .AsQueryable() - .FirstOrDefault(_ => _.AngorKey == projectId); + .Any(_ => _.AngorKey == projectId); - if (project != null) + if (projectExists) { - var total = await mongoDb.InvestmentTable.CountDocumentsAsync(Builders.Filter.Eq(_ => _.AngorKey, project.AngorKey)); + var total = await mongoDb.InvestmentTable.CountDocumentsAsync(Builders.Filter.Eq(_ => _.AngorKey, projectId)); var sum = mongoDb.InvestmentTable.AsQueryable() .Where(_ => _.AngorKey == projectId) .Sum(s => s.AmountSats); + var spendingSummery = await GetSpentProjectFundsSplitToFounderAndPenalty(projectId); + return new ProjectStats { InvestorCount = total, AmountInvested = sum, + AmountSpentSoFarByFounder = spendingSummery.founderSpent, + AmountInPenalties = spendingSummery.investorWithdrawn, + CountInPenalties = spendingSummery.invetorTrxCount }; } return null; } + + private async Task<(long founderSpent, long investorWithdrawn, int invetorTrxCount)> GetSpentProjectFundsSplitToFounderAndPenalty(string projectId) + { + var founderSummery = "founder"; var investorSummery = "investor"; var total = "total"; var trxCount = "trxCount"; + + var outputsSpentSummery = await mongoDb.InvestmentTable.Aggregate(PipelineDefinition.Create( + //Filter by project id + new BsonDocument("$match", + new BsonDocument(nameof(Investment.AngorKey), projectId)), + //Break down to object per stage outpoint for the inner join + new BsonDocument("$unwind", + new BsonDocument("path", "$" + nameof(Investment.StageOutpoint))), + // Inner join to input table on outpoint for each stage + new BsonDocument("$lookup", + new BsonDocument + { + { "from", "Input" }, + { "localField", nameof(Investment.StageOutpoint) }, + { "foreignField", nameof(InputTable.Outpoint) }, + { "as", "inputs" } + }), + new BsonDocument("$unwind", "$inputs"), + //Aggregate the value by investment transaction and spending transaction and counting the number of trx in both + new BsonDocument("$group", + new BsonDocument + { + { "_id", + new BsonDocument + { + { "TransactionId", "$" + nameof(Investment.TransactionId) }, + { "TrxHash", "$inputs." + nameof(InputTable.TrxHash)} + } }, + { "spent", + new BsonDocument("$sum", "$inputs." + nameof(InputTable.Value)) }, + { "numTrx", + new BsonDocument("$sum", 1) } + }), + //Aggregate the value on 1 trx in both transactions or more than 1 in both transactions to identify founder and investor patterns + new BsonDocument("$group", + new BsonDocument + { + { "_id", + new BsonDocument("$cond", + new BsonDocument + { + { "if", + new BsonDocument("$eq", + new BsonArray + { + "$numTrx", + 1 + }) }, + { "then", founderSummery }, + { "else", investorSummery } + }) }, + { total, + new BsonDocument("$sum", "$spent") }, + { trxCount, + new BsonDocument("$sum", 1) } + }))) + .ToListAsync(); + + var founder = outputsSpentSummery.SingleOrDefault(x => x["_id"] == founderSummery); + + var investor = outputsSpentSummery.SingleOrDefault(x => x["_id"] == investorSummery); + + return (founder?[total].AsInt64 ?? 0, investor?[total].AsInt64 ?? 0, investor?[trxCount].AsInt32 ?? 0); + } + + //Not used but kept for now for reference + private Task GetTotalInvestmentWithdrawn(string projectId) + { + return mongoDb.InvestmentTable.Aggregate(PipelineDefinition.Create(new[] + { + new BsonDocument("$match", + new BsonDocument("AngorKey", projectId)), + new BsonDocument("$lookup", + new BsonDocument + { + { "from", "Input" }, + { "localField", "TransactionId" }, + { "foreignField", "Outpoint.TransactionId" }, + { "as", "joinedData" } + }), + new BsonDocument("$unwind", "$joinedData"), + new BsonDocument("$group", + new BsonDocument + { + { + "_id", new BsonDocument { { "AngorKey", "$AngorKey" }, { "TransactionId", "$joinedData.TrxHash" } } + }, + { "count", new BsonDocument("$sum", 1) }, + { "totalValue", new BsonDocument("$sum", "$joinedData.Value") } + }), + new BsonDocument("$match", + new BsonDocument("count", + new BsonDocument("$gt", 1))), + new BsonDocument("$group", + new BsonDocument + { + { "_id", "$_id.AngorKey" }, { "totalValueSum", new BsonDocument("$sum", "$totalValue") } + }), + new BsonDocument("$project", + new BsonDocument { { "_id", 0 }, { "AngorKey", "$_id" }, { "totalValueSum", 1 } }) + })) + .FirstOrDefaultAsync(); + } + + /// + /// Sum of all inputs spending outputs from the investment transaction + /// + private Task GetSumOfOutputsSpentOnProject(string projectId) + { + return mongoDb.InvestmentTable.Aggregate(PipelineDefinition.Create(new[] + { + new BsonDocument("$match", + new BsonDocument("AngorKey", projectId)), + new BsonDocument("$lookup", + new BsonDocument + { + { "from", "Input" }, + { "localField", "TransactionId" }, + { "foreignField", "Outpoint.TransactionId" }, + { "as", "inputs" } + }), + new BsonDocument("$unwind", + new BsonDocument("path", "$inputs")), + new BsonDocument("$group", + new BsonDocument + { + { "_id", "$AngorKey" }, + { "Spent", + new BsonDocument("$sum", "$inputs.Value") } + }) + })).FirstOrDefaultAsync(); + } + public async Task> GetProjectsAsync(int? offset, int limit) { long total = await mongoDb.ProjectTable.CountDocumentsAsync(FilterDefinition.Empty); @@ -115,7 +259,7 @@ public async Task> GetProjectInvestmentsAsync(str .Take(limit) .Select(_ => new ProjectInvestment { - TransactionId = _.TransactionIndex, + TransactionId = _.TransactionId, TotalAmount = _.AmountSats, InvestorPublicKey = _.InvestorPubKey, HashOfSecret = _.SecretHash @@ -138,7 +282,7 @@ public Task GetInvestmentsByInvestorPubKeyAsync(string invest .Project(_ => new ProjectInvestment { TotalAmount = _.AmountSats, - TransactionId = _.TransactionIndex, + TransactionId = _.TransactionId, InvestorPublicKey = _.InvestorPubKey, HashOfSecret = _.SecretHash }) diff --git a/src/Blockcore.Indexer.Angor/Storage/Mongo/Types/Investment.cs b/src/Blockcore.Indexer.Angor/Storage/Mongo/Types/Investment.cs index d7ca14a..d82d9ca 100644 --- a/src/Blockcore.Indexer.Angor/Storage/Mongo/Types/Investment.cs +++ b/src/Blockcore.Indexer.Angor/Storage/Mongo/Types/Investment.cs @@ -1,3 +1,5 @@ +using Blockcore.Indexer.Core.Storage.Mongo.Types; + namespace Blockcore.Indexer.Angor.Storage.Mongo.Types; public class Investment @@ -10,9 +12,9 @@ public class Investment public long BlockIndex { get; set; } - public string TransactionIndex { get; set; } + public string TransactionId { get; set; } public long AmountSats { get; set; } - + public List StageOutpoint { get; set; } } diff --git a/src/Blockcore.Indexer.Angor/Sync/SyncTasks/ProjectTransactionsSyncRunner.cs b/src/Blockcore.Indexer.Angor/Sync/SyncTasks/ProjectTransactionsSyncRunner.cs index 58125e9..2900423 100644 --- a/src/Blockcore.Indexer.Angor/Sync/SyncTasks/ProjectTransactionsSyncRunner.cs +++ b/src/Blockcore.Indexer.Angor/Sync/SyncTasks/ProjectTransactionsSyncRunner.cs @@ -5,103 +5,165 @@ using Blockcore.Indexer.Core.Sync.SyncTasks; using Blockcore.NBitcoin.DataEncoders; using Microsoft.Extensions.Options; +using MongoDB.Bson; using MongoDB.Driver; using MongoDB.Driver.Linq; namespace Blockcore.Indexer.Angor.Sync.SyncTasks; -public class ProjectTransactionsSyncRunner : TaskRunner +public class ProjectInvestmentsSyncRunner : TaskRunner { readonly IAngorMongoDb angorMongoDb; - ILogger logger; + ILogger logger; - public ProjectTransactionsSyncRunner(IOptions configuration, ILogger logger, + public ProjectInvestmentsSyncRunner(IOptions configuration, ILogger logger, IAngorMongoDb angorMongoDb) : base(configuration, logger) { this.angorMongoDb = angorMongoDb; this.logger = logger; + Delay = TimeSpan.FromMinutes(1); } public override async Task OnExecute() { - var investmentsInProjectOutputs = await angorMongoDb.ProjectTable.AsQueryable() - .GroupJoin( - angorMongoDb.OutputTable.AsQueryable() - .AsQueryable(), - p => p.AddressOnFeeOutput, - o => o.Address, - (project, outputs) => new { project.TransactionId, outputs }) - .SelectMany(project => project.outputs,(p, o) => new - { - outputTransactionId = o.Outpoint.TransactionId, - isCreateProject = p.TransactionId == o.Outpoint.TransactionId, - - }) - .Where(t => t.isCreateProject == false) - .GroupJoin(angorMongoDb.InvestmentTable.AsQueryable(), - x => x.outputTransactionId, - i => i.TransactionIndex, - (data,investments) => new {data.outputTransactionId,data.isCreateProject,investments}) - .Where(data => !data.investments.Any()) + var investmentsInProjectOutputs = await angorMongoDb.ProjectTable.Aggregate(PipelineDefinition.Create( + new[] + { + new BsonDocument("$lookup", + new BsonDocument + { + { "from", "Investment" }, + { "let", new BsonDocument("angorProjectId", "_id") }, + { + "pipeline", new BsonArray + { + new BsonDocument("$match", + new BsonDocument("$expr", + new BsonDocument("$eq", + new BsonArray { "$AngorKey", "$$angorProjectId" }))), + new BsonDocument("$group", + new BsonDocument + { + { "_id", "$AngorKey" }, + { "projectMaxBlockScanned", new BsonDocument("$max", "$BlockIndex") } + }), + new BsonDocument("$project", + new BsonDocument("projectMaxBlockScanned", 1)) + } + }, + { "as", "joinedData" } + }), + new BsonDocument("$unwind", + new BsonDocument { { "path", "$joinedData" }, { "preserveNullAndEmptyArrays", true } }), + new BsonDocument("$project", + new BsonDocument + { + { "AddressOnFeeOutput", 1 }, { "TransactionId", 1 }, { "projectMaxBlockScanned", new BsonDocument("$ifNull", new BsonArray { "$joinedData.projectMaxBlockScanned", 0 }) } + }), + new BsonDocument("$lookup", + new BsonDocument + { + { "from", "Output" }, + { "let", new BsonDocument{{"address" , "$AddressOnFeeOutput" },{"trx", "$TransactionId"},{"projectMaxBlockScanned", "$projectMaxBlockScanned"}}}, + { "pipeline", new BsonArray + { + new BsonDocument("$match", + new BsonDocument("$expr", + new BsonDocument("$eq", + new BsonArray { "$Address", "$$address" }))), + new BsonDocument("$match", + new BsonDocument("$expr", + new BsonDocument("$and", new BsonArray + { + new BsonDocument("$gt", + new BsonArray { "$BlockIndex","$$projectMaxBlockScanned"}), + new BsonDocument("$ne", + new BsonArray { "$$trx","$Outpoint.TransactionId"}) + }))) + } }, + { "as", "o" } + }), + new BsonDocument("$unwind", "$o"), + new BsonDocument("$project", + new BsonDocument + { + { "OutputTransactionId", "$o.Outpoint.TransactionId" }, + { "OutputBlockIndex", "$o.BlockIndex" } + }) + })) .ToListAsync(); - var investments = new List(); + var investmentTasks = investmentsInProjectOutputs.Select(ValidateAndCreateInvestmentAsync).ToList(); - foreach (var investmentOutput in investmentsInProjectOutputs) - { - var allOutputsOnInvestmentTransaction = await angorMongoDb.OutputTable.AsQueryable() - .Where(output => output.Outpoint.TransactionId == investmentOutput.outputTransactionId) - .ToListAsync(); + await Task.WhenAll(investmentTasks); + + var investments = investmentTasks.AsEnumerable() + .Select(x => x.Result) + .Where(x => x != null) + .OrderBy(x => x!.BlockIndex) + .Distinct() + .ToList(); - if (allOutputsOnInvestmentTransaction.All(_ => _.Address != "none")) //TODO replace with a better indicator of stage investments - continue; + if (!investments.Any()) + return false; - var feeOutput = allOutputsOnInvestmentTransaction.Single(_ => _.Outpoint.OutputIndex == 0); - var projectDataOutput = allOutputsOnInvestmentTransaction.Single(_ => _.Outpoint.OutputIndex == 1); + await angorMongoDb.InvestmentTable.InsertManyAsync(investments); - var projectInfoScript = Script.FromHex(projectDataOutput.ScriptHex); + return true; - var investorPubKey = Encoders.Hex.EncodeData(projectInfoScript.ToOps()[1].PushData); + } - if (investments.Any(_ => _.InvestorPubKey == investorPubKey) || - angorMongoDb.InvestmentTable.AsQueryable().Any(_ => _.InvestorPubKey == investorPubKey)) //Investor key is the _id of that document - { - logger.LogInformation($"Multiple transactions with the same investor public key {investorPubKey} for the same project {feeOutput.ScriptHex}"); - continue; - } + async Task ValidateAndCreateInvestmentAsync(BsonDocument investmentOutput) + { + var allOutputsOnInvestmentTransaction = await angorMongoDb.OutputTable.AsQueryable() + .Where(output => output.BlockIndex == investmentOutput["OutputBlockIndex"] && + output.Outpoint.TransactionId == investmentOutput["OutputTransactionId"]) + .ToListAsync(); - var project = await angorMongoDb.ProjectTable.Aggregate() - .Match(_ => _.AngorKeyScriptHex == feeOutput.ScriptHex) - .SingleOrDefaultAsync(); + if (allOutputsOnInvestmentTransaction.All(x => + x.Address != "none")) //TODO replace with a better indicator of stage investments + return null; - if (project == null) - continue; + var feeOutput = allOutputsOnInvestmentTransaction.Single(x => x.Outpoint.OutputIndex == 0); + var projectDataOutput = allOutputsOnInvestmentTransaction.Single(x => x.Outpoint.OutputIndex == 1); - var hashOfSecret = projectInfoScript.ToOps().Count == 3 - ? Encoders.Hex.EncodeData(projectInfoScript.ToOps()[2].PushData) - : string.Empty; + var projectInfoScript = Script.FromHex(projectDataOutput.ScriptHex); - var investment = new Investment - { - InvestorPubKey = investorPubKey, - AngorKey = project.AngorKey, - AmountSats = allOutputsOnInvestmentTransaction.Where(_ => _.Address == "none").Sum(_ => _.Value), - BlockIndex = feeOutput.BlockIndex, - SecretHash = hashOfSecret, - TransactionIndex = feeOutput.Outpoint.TransactionId, - }; + var investorPubKey = Encoders.Hex.EncodeData(projectInfoScript.ToOps()[1].PushData); - investments.Add(investment); + if (angorMongoDb.InvestmentTable.AsQueryable() + .Any(_ => _.InvestorPubKey == investorPubKey)) //Investor key is the _id of that document + { + logger.LogInformation( + $"Multiple transactions with the same investor public key {investorPubKey} for the same project {feeOutput.ScriptHex}"); + return null; } - if (!investments.Any()) - return false; + var project = await angorMongoDb.ProjectTable + .Aggregate() //TODO not sure we need this as we get the lookup from the project table to begin with + .Match(_ => _.AngorKeyScriptHex == feeOutput.ScriptHex) + .SingleOrDefaultAsync(); - await angorMongoDb.InvestmentTable.InsertManyAsync(investments); + if (project == null) + return null; - return true; + var hashOfSecret = projectInfoScript.ToOps().Count == 3 + ? Encoders.Hex.EncodeData(projectInfoScript.ToOps()[2].PushData) + : string.Empty; + var stages = allOutputsOnInvestmentTransaction.Where(_ => _.Address == "none"); + + return new Investment + { + InvestorPubKey = investorPubKey, + AngorKey = project.AngorKey, + AmountSats = stages.Sum(_ => _.Value), + BlockIndex = feeOutput.BlockIndex, + SecretHash = hashOfSecret, + TransactionId = feeOutput.Outpoint.TransactionId, + StageOutpoint = stages.Select(x => x.Outpoint).ToList() + }; } } diff --git a/src/Blockcore.Indexer.Angor/Sync/SyncTasks/ProjectsSyncRunner.cs b/src/Blockcore.Indexer.Angor/Sync/SyncTasks/ProjectsSyncRunner.cs index 8748726..173a1c5 100644 --- a/src/Blockcore.Indexer.Angor/Sync/SyncTasks/ProjectsSyncRunner.cs +++ b/src/Blockcore.Indexer.Angor/Sync/SyncTasks/ProjectsSyncRunner.cs @@ -46,24 +46,33 @@ public override async Task OnExecute() ? AngorMongoDb.ProjectTable.AsQueryable().Max(p => p.BlockIndex) : 0; - var test = AngorMongoDb.OutputTable.AsQueryable() + var investmentslookup = AngorMongoDb.OutputTable.AsQueryable() .Where(_ => _.BlockIndex > blockIndexed && - _.Outpoint.OutputIndex == 1 && _.Address == "TX_NULL_DATA" && + _.Outpoint.OutputIndex == 1 && _.CoinBase == false) // && //_.ScriptHex.Length == 136) .OrderBy(_ => _.BlockIndex) .ToList(); - foreach (OutputTable outputTable in test) + var projectTasks = investmentslookup.Select(CheckAndAddProjectAsync).ToList(); + + await Task.WhenAll(projectTasks); + + var projects = projectTasks + .Where(x => x.Result != null) + .Select(x => x.Result!) + .ToList(); + + if (projects.Any()) { - await CheckAndAddProjectAsync(outputTable); + await AngorMongoDb.ProjectTable.InsertManyAsync(projects); } return false; } - async Task CheckAndAddProjectAsync(OutputTable output) + async Task CheckAndAddProjectAsync(OutputTable output) { var script = Script.FromHex(output.ScriptHex); @@ -73,21 +82,19 @@ async Task CheckAndAddProjectAsync(OutputTable output) ops.First().Name != Op.GetOpName(OpcodeType.OP_RETURN) || ops[1].PushData.Length != 33 || ops[2].PushData.Length != 32) - return; + return null; var founderKey = new PubKey(script.ToOps()[1].PushData); var checkForExistingProject = await AngorMongoDb.ProjectTable.AsQueryable() .AnyAsync(_ => _.FounderKey == founderKey.ToHex()); - if (checkForExistingProject) return; - - var nPubKey = Encoders.Hex.EncodeData(script.ToOps()[2].PushData); //Schnorr signature not supported + if (checkForExistingProject) return null; var projectId = GetProjectIdDerivation(founderKey.ToHex()); if (projectId == 0) - return; + return null; var angorKey = extendedPublicKey.Derive(projectId).PubKey; @@ -95,6 +102,8 @@ async Task CheckAndAddProjectAsync(OutputTable output) var projectIdentifier = encoder.Encode(0, angorKey.WitHash.ToBytes()); + var nPubKey = Encoders.Hex.EncodeData(script.ToOps()[2].PushData); //Schnorr signature not supported + var angorFeeOutput = await AngorMongoDb.OutputTable .AsQueryable() .Where(_ => @@ -105,9 +114,9 @@ async Task CheckAndAddProjectAsync(OutputTable output) _.ScriptHex == angorKey.WitHash.ScriptPubKey.ToHex()) .FirstOrDefaultAsync(); - if (angorFeeOutput == null) return; + if (angorFeeOutput == null) return null; - await AngorMongoDb.ProjectTable.InsertOneAsync(new Project + return new Project { AngorKey = projectIdentifier, TransactionId = output.Outpoint.TransactionId, @@ -116,7 +125,7 @@ await AngorMongoDb.ProjectTable.InsertOneAsync(new Project FounderKey = founderKey.ToHex(), NPubKey = nPubKey, AddressOnFeeOutput = angorFeeOutput.Address - }); + }; } private uint GetProjectIdDerivation(string founderKey) diff --git a/src/Blockcore.Indexer.Angor/appsettings.Development.json b/src/Blockcore.Indexer.Angor/appsettings.Development.json index e68ac67..7734e79 100644 --- a/src/Blockcore.Indexer.Angor/appsettings.Development.json +++ b/src/Blockcore.Indexer.Angor/appsettings.Development.json @@ -12,7 +12,7 @@ "Indexer": { "DatabaseNameSubfix": true, "ConnectionString": "mongodb://localhost", - "RpcDomain": "10.22.156.65", + "RpcDomain": "207.180.254.78", // Store the trx hex in mongo storage or read it from RPC "StoreRawTransactions": false } diff --git a/src/Blockcore.Indexer.Cirrus.Tests/Blockcore.Indexer.Cirrus.Tests.csproj b/src/Blockcore.Indexer.Cirrus.Tests/Blockcore.Indexer.Cirrus.Tests.csproj index d245fae..4acb276 100644 --- a/src/Blockcore.Indexer.Cirrus.Tests/Blockcore.Indexer.Cirrus.Tests.csproj +++ b/src/Blockcore.Indexer.Cirrus.Tests/Blockcore.Indexer.Cirrus.Tests.csproj @@ -9,7 +9,7 @@ - + diff --git a/src/Blockcore.Indexer.Core/Blockcore.Indexer.Core.csproj b/src/Blockcore.Indexer.Core/Blockcore.Indexer.Core.csproj index 046eea7..9ba8b80 100644 --- a/src/Blockcore.Indexer.Core/Blockcore.Indexer.Core.csproj +++ b/src/Blockcore.Indexer.Core/Blockcore.Indexer.Core.csproj @@ -4,7 +4,7 @@ - +