From cec27b2cf7307ff55b16ab57615f9e292a3d30ea Mon Sep 17 00:00:00 2001 From: ThatBen Date: Tue, 11 Mar 2025 15:00:27 +0100 Subject: [PATCH 01/15] wip --- ProjectPlugins/CodexClient/CodexAccess.cs | 2 +- ProjectPlugins/CodexClient/Mapper.cs | 12 ++- .../CodexClient/MarketplaceAccess.cs | 6 +- .../CodexClient/MarketplaceTypes.cs | 43 +++++++++-- .../ChainMonitor/ChainEvents.cs | 1 - .../ChainMonitor/ChainState.cs | 3 +- .../ChainMonitor/PeriodMonitor.cs | 22 +++++- .../CodexContractsAccess.cs | 3 - .../MarketTests/ChainMonitor.cs | 49 ++++++++++++ .../MarketTests/ContractFailedTest.cs | 21 +++--- .../MarketTests/ContractSuccessfulTest.cs | 3 +- .../MarketplaceAutoBootstrapDistTest.cs | 75 +++++++++++++++++-- Tests/CodexReleaseTests/Parallelism.cs | 2 +- Tests/DistTestCore/Helpers/AssertHelpers.cs | 1 - .../BasicTests/MarketplaceTests.cs | 2 +- Tests/ExperimentalTests/CodexDistTest.cs | 1 + .../UtilityTests/DiscordBotTests.cs | 2 +- Tools/CodexNetDeployer/CodexNodeStarter.cs | 2 +- Tools/TestNetRewarder/EventsFormatter.cs | 8 +- 19 files changed, 203 insertions(+), 55 deletions(-) create mode 100644 Tests/CodexReleaseTests/MarketTests/ChainMonitor.cs diff --git a/ProjectPlugins/CodexClient/CodexAccess.cs b/ProjectPlugins/CodexClient/CodexAccess.cs index 5627d631..ca11ebee 100644 --- a/ProjectPlugins/CodexClient/CodexAccess.cs +++ b/ProjectPlugins/CodexClient/CodexAccess.cs @@ -143,7 +143,7 @@ namespace CodexClient return mapper.Map(OnCodex(api => api.ListDataAsync())); } - public StorageAvailability SalesAvailability(StorageAvailability request) + public StorageAvailability SalesAvailability(CreateStorageAvailability request) { var body = mapper.Map(request); var read = OnCodex(api => api.OfferStorageAsync(body)); diff --git a/ProjectPlugins/CodexClient/Mapper.cs b/ProjectPlugins/CodexClient/Mapper.cs index af851f22..fdaf05db 100644 --- a/ProjectPlugins/CodexClient/Mapper.cs +++ b/ProjectPlugins/CodexClient/Mapper.cs @@ -37,7 +37,7 @@ namespace CodexClient }; } - public CodexOpenApi.SalesAvailabilityCREATE Map(StorageAvailability availability) + public CodexOpenApi.SalesAvailabilityCREATE Map(CreateStorageAvailability availability) { return new CodexOpenApi.SalesAvailabilityCREATE { @@ -71,15 +71,13 @@ namespace CodexClient { return new StorageAvailability ( + availability.Id, ToByteSize(availability.TotalSize), ToTimespan(availability.Duration), new TestToken(ToBigIng(availability.MinPricePerBytePerSecond)), - new TestToken(ToBigIng(availability.TotalCollateral)) - ) - { - Id = availability.Id, - FreeSpace = ToByteSize(availability.FreeSize), - }; + new TestToken(ToBigIng(availability.TotalCollateral)), + ToByteSize(availability.FreeSize) + ); } public StoragePurchase Map(CodexOpenApi.Purchase purchase) diff --git a/ProjectPlugins/CodexClient/MarketplaceAccess.cs b/ProjectPlugins/CodexClient/MarketplaceAccess.cs index b08acfcc..f1c5fddb 100644 --- a/ProjectPlugins/CodexClient/MarketplaceAccess.cs +++ b/ProjectPlugins/CodexClient/MarketplaceAccess.cs @@ -6,7 +6,7 @@ namespace CodexClient { public interface IMarketplaceAccess { - string MakeStorageAvailable(StorageAvailability availability); + string MakeStorageAvailable(CreateStorageAvailability availability); StorageAvailability[] GetAvailabilities(); IStoragePurchaseContract RequestStorage(StoragePurchaseRequest purchase); } @@ -49,7 +49,7 @@ namespace CodexClient return new StoragePurchaseContract(log, codexAccess, response, purchase, hooks); } - public string MakeStorageAvailable(StorageAvailability availability) + public string MakeStorageAvailable(CreateStorageAvailability availability) { availability.Log(log); @@ -77,7 +77,7 @@ namespace CodexClient public class MarketplaceUnavailable : IMarketplaceAccess { - public string MakeStorageAvailable(StorageAvailability availability) + public string MakeStorageAvailable(CreateStorageAvailability availability) { Unavailable(); throw new NotImplementedException(); diff --git a/ProjectPlugins/CodexClient/MarketplaceTypes.cs b/ProjectPlugins/CodexClient/MarketplaceTypes.cs index b9f80228..00214b83 100644 --- a/ProjectPlugins/CodexClient/MarketplaceTypes.cs +++ b/ProjectPlugins/CodexClient/MarketplaceTypes.cs @@ -84,9 +84,9 @@ namespace CodexClient //public PoRParameters Por { get; set; } } - public class StorageAvailability + public class CreateStorageAvailability { - public StorageAvailability(ByteSize totalSpace, TimeSpan maxDuration, TestToken minPricePerBytePerSecond, TestToken totalCollateral) + public CreateStorageAvailability(ByteSize totalSpace, TimeSpan maxDuration, TestToken minPricePerBytePerSecond, TestToken totalCollateral) { TotalSpace = totalSpace; MaxDuration = maxDuration; @@ -94,20 +94,49 @@ namespace CodexClient TotalCollateral = totalCollateral; } - public string Id { get; set; } = string.Empty; public ByteSize TotalSpace { get; } public TimeSpan MaxDuration { get; } public TestToken MinPricePerBytePerSecond { get; } - public TestToken TotalCollateral { get; } - public ByteSize FreeSpace { get; set; } = ByteSize.Zero; + public TestToken TotalCollateral { get; } public void Log(ILog log) { - log.Log($"Storage Availability: (" + + log.Log($"Create storage Availability: (" + $"totalSize: {TotalSpace}, " + - $"maxDuration: {Time.FormatDuration(MaxDuration)}, " + + $"maxDuration: {Time.FormatDuration(MaxDuration)}, " + $"minPricePerBytePerSecond: {MinPricePerBytePerSecond}, " + $"totalCollateral: {TotalCollateral})"); } } + + public class StorageAvailability + { + public StorageAvailability(string id, ByteSize totalSpace, TimeSpan maxDuration, TestToken minPricePerBytePerSecond, TestToken totalCollateral, ByteSize freeSpace) + { + Id = id; + TotalSpace = totalSpace; + MaxDuration = maxDuration; + MinPricePerBytePerSecond = minPricePerBytePerSecond; + TotalCollateral = totalCollateral; + FreeSpace = freeSpace; + } + + public string Id { get; } + public ByteSize TotalSpace { get; } + public TimeSpan MaxDuration { get; } + public TestToken MinPricePerBytePerSecond { get; } + public TestToken TotalCollateral { get; } + public ByteSize FreeSpace { get; } + + public void Log(ILog log) + { + log.Log($"Storage Availability: (" + + $"id: {Id}, " + + $"totalSize: {TotalSpace}, " + + $"maxDuration: {Time.FormatDuration(MaxDuration)}, " + + $"minPricePerBytePerSecond: {MinPricePerBytePerSecond}, " + + $"totalCollateral: {TotalCollateral}, " + + $"freeSpace: {FreeSpace})"); + } + } } diff --git a/ProjectPlugins/CodexContractsPlugin/ChainMonitor/ChainEvents.cs b/ProjectPlugins/CodexContractsPlugin/ChainMonitor/ChainEvents.cs index 8c2992da..6bbfa3cc 100644 --- a/ProjectPlugins/CodexContractsPlugin/ChainMonitor/ChainEvents.cs +++ b/ProjectPlugins/CodexContractsPlugin/ChainMonitor/ChainEvents.cs @@ -1,5 +1,4 @@ using CodexContractsPlugin.Marketplace; -using System.Collections.Generic; using Utils; namespace CodexContractsPlugin.ChainMonitor diff --git a/ProjectPlugins/CodexContractsPlugin/ChainMonitor/ChainState.cs b/ProjectPlugins/CodexContractsPlugin/ChainMonitor/ChainState.cs index 0035dc98..6b924585 100644 --- a/ProjectPlugins/CodexContractsPlugin/ChainMonitor/ChainState.cs +++ b/ProjectPlugins/CodexContractsPlugin/ChainMonitor/ChainState.cs @@ -1,6 +1,5 @@ using BlockchainUtils; using CodexContractsPlugin.Marketplace; -using GethPlugin; using Logging; using System.Numerics; using Utils; @@ -79,7 +78,7 @@ namespace CodexContractsPlugin.ChainMonitor throw new Exception(msg); } - log.Log($"ChainState updating: {events.BlockInterval} = {events.All.Length} events."); + log.Debug($"ChainState updating: {events.BlockInterval} = {events.All.Length} events."); // Run through each block and apply the events to the state in order. var span = events.BlockInterval.TimeRange.Duration; diff --git a/ProjectPlugins/CodexContractsPlugin/ChainMonitor/PeriodMonitor.cs b/ProjectPlugins/CodexContractsPlugin/ChainMonitor/PeriodMonitor.cs index 538ae124..30403d2a 100644 --- a/ProjectPlugins/CodexContractsPlugin/ChainMonitor/PeriodMonitor.cs +++ b/ProjectPlugins/CodexContractsPlugin/ChainMonitor/PeriodMonitor.cs @@ -39,8 +39,6 @@ namespace CodexContractsPlugin.ChainMonitor private void CreateReportForPeriod(ulong lastBlockInPeriod, ulong periodNumber, IChainStateRequest[] requests) { - log.Log("Creating report for period " + periodNumber); - ulong total = 0; ulong required = 0; var missed = new List(); @@ -63,7 +61,9 @@ namespace CodexContractsPlugin.ChainMonitor } } } - reports.Add(new PeriodReport(periodNumber, total, required, missed.ToArray())); + var report = new PeriodReport(periodNumber, total, required, missed.ToArray()); + log.Log($"Period report: {report}"); + reports.Add(report); } } @@ -108,6 +108,16 @@ namespace CodexContractsPlugin.ChainMonitor public ulong TotalNumSlots { get; } public ulong TotalProofsRequired { get; } public PeriodProofMissed[] MissedProofs { get; } + + public override string ToString() + { + var missed = "None"; + if (MissedProofs.Length > 0) + { + missed = string.Join("+", MissedProofs.Select(p => $"{p.FormatHost()} missed {p.Request.Request.Id} slot {p.SlotIndex}")); + } + return $"Period:{PeriodNumber}=[Slots:{TotalNumSlots},ProofsRequired:{TotalProofsRequired},ProofsMissed:{missed}]"; + } } public class PeriodProofMissed @@ -122,5 +132,11 @@ namespace CodexContractsPlugin.ChainMonitor public EthAddress? Host { get; } public IChainStateRequest Request { get; } public int SlotIndex { get; } + + public string FormatHost() + { + if (Host == null) return "Unknown host"; + return Host.Address; + } } } diff --git a/ProjectPlugins/CodexContractsPlugin/CodexContractsAccess.cs b/ProjectPlugins/CodexContractsPlugin/CodexContractsAccess.cs index 120574b4..14143e11 100644 --- a/ProjectPlugins/CodexContractsPlugin/CodexContractsAccess.cs +++ b/ProjectPlugins/CodexContractsPlugin/CodexContractsAccess.cs @@ -3,11 +3,8 @@ using CodexContractsPlugin.Marketplace; using GethPlugin; using Logging; using Nethereum.ABI; -using Nethereum.ABI.FunctionEncoding.Attributes; using Nethereum.Contracts; -using Nethereum.Hex.HexConvertors.Extensions; using Nethereum.Util; -using NethereumWorkflow; using Newtonsoft.Json; using Newtonsoft.Json.Converters; using Utils; diff --git a/Tests/CodexReleaseTests/MarketTests/ChainMonitor.cs b/Tests/CodexReleaseTests/MarketTests/ChainMonitor.cs new file mode 100644 index 00000000..72b9da02 --- /dev/null +++ b/Tests/CodexReleaseTests/MarketTests/ChainMonitor.cs @@ -0,0 +1,49 @@ +using CodexContractsPlugin; +using CodexContractsPlugin.ChainMonitor; +using Logging; + +namespace CodexReleaseTests.MarketTests +{ + public class ChainMonitor + { + private readonly ChainState chainMonitor; + private readonly TimeSpan interval; + private CancellationTokenSource cts = new CancellationTokenSource(); + private Task worker = null!; + + public ChainMonitor(ILog log, ICodexContracts contracts, DateTime startUtc, TimeSpan interval) + { + chainMonitor = new ChainState(log, contracts, new DoNothingChainEventHandler(), startUtc, true); + this.interval = interval; + } + + public void Start() + { + cts = new CancellationTokenSource(); + worker = Task.Run(Worker); + } + + public void Stop() + { + cts.Cancel(); + worker.Wait(); + + worker = null!; + cts = null!; + } + + public PeriodMonitorResult GetPeriodReports() + { + return chainMonitor.PeriodMonitor.GetAndClearReports(); + } + + private void Worker() + { + while (!cts.IsCancellationRequested) + { + Thread.Sleep(interval); + chainMonitor.Update(); + } + } + } +} diff --git a/Tests/CodexReleaseTests/MarketTests/ContractFailedTest.cs b/Tests/CodexReleaseTests/MarketTests/ContractFailedTest.cs index caeaed9b..455306be 100644 --- a/Tests/CodexReleaseTests/MarketTests/ContractFailedTest.cs +++ b/Tests/CodexReleaseTests/MarketTests/ContractFailedTest.cs @@ -7,14 +7,16 @@ namespace CodexReleaseTests.MarketTests { public class ContractFailedTest : MarketplaceAutoBootstrapDistTest { - protected override int NumberOfHosts => 4; + private const int FilesizeMb = 10; + private const int NumberOfSlots = 3; + + protected override int NumberOfHosts => 6; protected override int NumberOfClients => 1; - protected override ByteSize HostAvailabilitySize => 1.GB(); - protected override TimeSpan HostAvailabilityMaxDuration => TimeSpan.FromDays(1.0); + protected override ByteSize HostAvailabilitySize => (5 * FilesizeMb).MB(); + protected override TimeSpan HostAvailabilityMaxDuration => TimeSpan.FromDays(5.0); private readonly TestToken pricePerBytePerSecond = 10.TstWei(); [Test] - [Ignore("Disabled for now: Test is unstable.")] public void ContractFailed() { var hosts = StartHosts(); @@ -32,6 +34,7 @@ namespace CodexReleaseTests.MarketTests hosts.Stop(waitTillStopped: true); WaitForSlotFreedEvents(); + AssertProofMissedReports(); request.WaitForContractFailed(); } @@ -47,7 +50,7 @@ namespace CodexReleaseTests.MarketTests { var events = GetContracts().GetEvents(GetTestRunTimeRange()); var slotFreed = events.GetSlotFreedEvents(); - if (slotFreed.Length == NumberOfHosts) + if (slotFreed.Length == NumberOfSlots) { Log($"{nameof(WaitForSlotFreedEvents)} took {Time.FormatDuration(DateTime.UtcNow - start)}"); return; @@ -86,16 +89,16 @@ namespace CodexReleaseTests.MarketTests private IStoragePurchaseContract CreateStorageRequest(ICodexNode client) { - var cid = client.UploadFile(GenerateTestFile(5.MB())); + var cid = client.UploadFile(GenerateTestFile(FilesizeMb.MB())); return client.Marketplace.RequestStorage(new StoragePurchaseRequest(cid) { Duration = TimeSpan.FromHours(1.0), Expiry = TimeSpan.FromHours(0.2), - MinRequiredNumberOfNodes = (uint)NumberOfHosts, - NodeFailureTolerance = (uint)(NumberOfHosts / 2), + MinRequiredNumberOfNodes = NumberOfSlots, + NodeFailureTolerance = 1, PricePerBytePerSecond = pricePerBytePerSecond, ProofProbability = 1, // Require a proof every period - CollateralPerByte = 1.Tst() + CollateralPerByte = 1.TstWei() }); } } diff --git a/Tests/CodexReleaseTests/MarketTests/ContractSuccessfulTest.cs b/Tests/CodexReleaseTests/MarketTests/ContractSuccessfulTest.cs index 8431d121..7b9dd82e 100644 --- a/Tests/CodexReleaseTests/MarketTests/ContractSuccessfulTest.cs +++ b/Tests/CodexReleaseTests/MarketTests/ContractSuccessfulTest.cs @@ -20,6 +20,7 @@ namespace CodexReleaseTests.MarketTests { var hosts = StartHosts(); var client = StartClients().Single(); + AssertHostAvailabilitiesAreEmpty(hosts); var request = CreateStorageRequest(client); @@ -34,12 +35,12 @@ namespace CodexReleaseTests.MarketTests AssertClientHasPaidForContract(pricePerBytePerSecond, client, request, hosts); AssertHostsWerePaidForContract(pricePerBytePerSecond, request, hosts); AssertHostsCollateralsAreUnchanged(hosts); + AssertHostAvailabilitiesAreEmpty(hosts); } private IStoragePurchaseContract CreateStorageRequest(ICodexNode client) { var cid = client.UploadFile(GenerateTestFile(FilesizeMb.MB())); - var config = GetContracts().Deployment.Config; return client.Marketplace.RequestStorage(new StoragePurchaseRequest(cid) { Duration = GetContractDuration(), diff --git a/Tests/CodexReleaseTests/MarketTests/MarketplaceAutoBootstrapDistTest.cs b/Tests/CodexReleaseTests/MarketTests/MarketplaceAutoBootstrapDistTest.cs index 6e898bfe..17d83e3a 100644 --- a/Tests/CodexReleaseTests/MarketTests/MarketplaceAutoBootstrapDistTest.cs +++ b/Tests/CodexReleaseTests/MarketTests/MarketplaceAutoBootstrapDistTest.cs @@ -1,5 +1,6 @@ using CodexClient; using CodexContractsPlugin; +using CodexContractsPlugin.ChainMonitor; using CodexContractsPlugin.Marketplace; using CodexPlugin; using CodexTests; @@ -22,13 +23,17 @@ namespace CodexReleaseTests.MarketTests base.LifecycleStart(lifecycle); var geth = StartGethNode(s => s.IsMiner()); var contracts = Ci.StartCodexContracts(geth); - handles.Add(lifecycle, new MarketplaceHandle(geth, contracts)); + var monitor = new ChainMonitor(lifecycle.Log, contracts, lifecycle.TestStart, TimeSpan.FromSeconds(1.0)); + monitor.Start(); + + handles.Add(lifecycle, new MarketplaceHandle(geth, contracts, monitor)); } protected override void LifecycleStop(TestLifecycle lifecycle, DistTestResult result) { - base.LifecycleStop(lifecycle, result); + handles[lifecycle].Monitor.Stop(); handles.Remove(lifecycle); + base.LifecycleStop(lifecycle, result); } protected IGethNode GetGeth() @@ -44,18 +49,27 @@ namespace CodexReleaseTests.MarketTests protected TimeSpan GetPeriodDuration() { var config = GetContracts().Deployment.Config; - return TimeSpan.FromSeconds(((double)config.Proofs.Period)); + return TimeSpan.FromSeconds(config.Proofs.Period); + } + + protected PeriodMonitorResult GetPeriodMonitorReports() + { + return handles[Get()].Monitor.GetPeriodReports(); } protected abstract int NumberOfHosts { get; } protected abstract int NumberOfClients { get; } protected abstract ByteSize HostAvailabilitySize { get; } protected abstract TimeSpan HostAvailabilityMaxDuration { get; } + protected TimeSpan HostBlockTTL { get; } = TimeSpan.FromMinutes(1.0); public ICodexNodeGroup StartHosts() { var hosts = StartCodex(NumberOfHosts, s => s .WithName("host") + .WithBlockTTL(HostBlockTTL) + .WithBlockMaintenanceNumber(100000) + .WithBlockMaintenanceInterval(HostBlockTTL / 4) .EnableMarketplace(GetGeth(), GetContracts(), m => m .WithInitial(StartingBalanceEth.Eth(), StartingBalanceTST.Tst()) .AsStorageNode() @@ -67,17 +81,49 @@ namespace CodexReleaseTests.MarketTests { AssertTstBalance(host, StartingBalanceTST.Tst(), nameof(StartHosts)); AssertEthBalance(host, StartingBalanceEth.Eth(), nameof(StartHosts)); - - host.Marketplace.MakeStorageAvailable(new StorageAvailability( + + var spaceBefore = host.Space(); + Assert.That(spaceBefore.QuotaReservedBytes, Is.EqualTo(0)); + Assert.That(spaceBefore.QuotaUsedBytes, Is.EqualTo(0)); + + host.Marketplace.MakeStorageAvailable(new CreateStorageAvailability( totalSpace: HostAvailabilitySize, maxDuration: HostAvailabilityMaxDuration, minPricePerBytePerSecond: 1.TstWei(), totalCollateral: 999999.Tst()) ); + + var spaceAfter = host.Space(); + Assert.That(spaceAfter.QuotaReservedBytes, Is.EqualTo(HostAvailabilitySize.SizeInBytes)); + Assert.That(spaceAfter.QuotaUsedBytes, Is.EqualTo(0)); } return hosts; } + public void AssertHostAvailabilitiesAreEmpty(IEnumerable hosts) + { + var retry = GetAvailabilitySpaceAssertRetry(); + retry.Run(() => + { + foreach (var host in hosts) + { + AssertHostAvailabilitiesAreEmpty(host); + } + }); + } + + private void AssertHostAvailabilitiesAreEmpty(ICodexNode host) + { + var availabilities = host.Marketplace.GetAvailabilities(); + foreach (var a in availabilities) + { + if (a.FreeSpace.SizeInBytes != a.TotalSpace.SizeInBytes) + { + throw new Exception(nameof(AssertHostAvailabilitiesAreEmpty) + $" free: {a.FreeSpace} total: {a.TotalSpace}"); + } + } + } + public void AssertTstBalance(ICodexNode node, TestToken expectedBalance, string message) { AssertTstBalance(node.EthAddress, expectedBalance, message); @@ -121,6 +167,14 @@ namespace CodexReleaseTests.MarketTests onFail: f => { }); } + private Retry GetAvailabilitySpaceAssertRetry() + { + return new Retry("AssertAvailabilitySpace", + maxTimeout: HostBlockTTL * 3, + sleepAfterFail: TimeSpan.FromSeconds(10.0), + onFail: f => { }); + } + private TestToken GetTstBalance(ICodexNode node) { return GetContracts().GetTestTokenBalance(node); @@ -305,6 +359,13 @@ namespace CodexReleaseTests.MarketTests }, description); } + protected void AssertEnoughProofMissedForSlotFree(ICodexNodeGroup hosts) + { + var slotFills = GetOnChainSlotFills(hosts); + + todo for each filled slot, there should be enough proofs missed to trigger the slot-free event. + } + public class SlotFill { public SlotFill(SlotFilledEventDTO slotFilledEvent, ICodexNode host) @@ -319,14 +380,16 @@ namespace CodexReleaseTests.MarketTests private class MarketplaceHandle { - public MarketplaceHandle(IGethNode geth, ICodexContracts contracts) + public MarketplaceHandle(IGethNode geth, ICodexContracts contracts, ChainMonitor monitor) { Geth = geth; Contracts = contracts; + Monitor = monitor; } public IGethNode Geth { get; } public ICodexContracts Contracts { get; } + public ChainMonitor Monitor { get; } } } } diff --git a/Tests/CodexReleaseTests/Parallelism.cs b/Tests/CodexReleaseTests/Parallelism.cs index a1b26c73..cd0a4299 100644 --- a/Tests/CodexReleaseTests/Parallelism.cs +++ b/Tests/CodexReleaseTests/Parallelism.cs @@ -1,6 +1,6 @@ using NUnit.Framework; -[assembly: LevelOfParallelism(1)] +[assembly: LevelOfParallelism(10)] namespace CodexReleaseTests.DataTests { } diff --git a/Tests/DistTestCore/Helpers/AssertHelpers.cs b/Tests/DistTestCore/Helpers/AssertHelpers.cs index c0f995d3..0b2efbbc 100644 --- a/Tests/DistTestCore/Helpers/AssertHelpers.cs +++ b/Tests/DistTestCore/Helpers/AssertHelpers.cs @@ -10,7 +10,6 @@ namespace DistTestCore.Helpers { try { - Time.WaitUntil(() => { var c = constraint.Resolve(); return c.ApplyTo(actual()).IsSuccess; diff --git a/Tests/ExperimentalTests/BasicTests/MarketplaceTests.cs b/Tests/ExperimentalTests/BasicTests/MarketplaceTests.cs index f8ef52d5..7ad08ad3 100644 --- a/Tests/ExperimentalTests/BasicTests/MarketplaceTests.cs +++ b/Tests/ExperimentalTests/BasicTests/MarketplaceTests.cs @@ -50,7 +50,7 @@ namespace ExperimentalTests.BasicTests { AssertBalance(contracts, host, Is.EqualTo(hostInitialBalance)); - var availability = new StorageAvailability( + var availability = new CreateStorageAvailability( totalSpace: 10.GB(), maxDuration: TimeSpan.FromMinutes(30), minPricePerBytePerSecond: 1.TstWei(), diff --git a/Tests/ExperimentalTests/CodexDistTest.cs b/Tests/ExperimentalTests/CodexDistTest.cs index 4cc9c707..922f5959 100644 --- a/Tests/ExperimentalTests/CodexDistTest.cs +++ b/Tests/ExperimentalTests/CodexDistTest.cs @@ -182,6 +182,7 @@ namespace CodexTests public void AssertBalance(ICodexContracts contracts, ICodexNode codexNode, Constraint constraint, string msg = "") { + Assert.Fail("Depricated, use MarketplaceAutobootstrapDistTest assertBalances instead."); AssertHelpers.RetryAssert(constraint, () => contracts.GetTestTokenBalance(codexNode), nameof(AssertBalance) + msg); } diff --git a/Tests/ExperimentalTests/UtilityTests/DiscordBotTests.cs b/Tests/ExperimentalTests/UtilityTests/DiscordBotTests.cs index abebac0c..8fdb79ec 100644 --- a/Tests/ExperimentalTests/UtilityTests/DiscordBotTests.cs +++ b/Tests/ExperimentalTests/UtilityTests/DiscordBotTests.cs @@ -198,7 +198,7 @@ namespace ExperimentalTests.UtilityTests .AsStorageNode() .AsValidator())); - var availability = new StorageAvailability( + var availability = new CreateStorageAvailability( totalSpace: Mult(GetMinFileSize(), GetNumberOfLiveHosts()), maxDuration: TimeSpan.FromMinutes(30), minPricePerBytePerSecond: 1.TstWei(), diff --git a/Tools/CodexNetDeployer/CodexNodeStarter.cs b/Tools/CodexNetDeployer/CodexNodeStarter.cs index 92fc77c0..77a09d32 100644 --- a/Tools/CodexNetDeployer/CodexNodeStarter.cs +++ b/Tools/CodexNetDeployer/CodexNodeStarter.cs @@ -69,7 +69,7 @@ namespace CodexNetDeployer if (config.ShouldMakeStorageAvailable) { - var availability = new StorageAvailability( + var availability = new CreateStorageAvailability( totalSpace: config.StorageSell!.Value.MB(), maxDuration: TimeSpan.FromSeconds(config.MaxDuration), minPricePerBytePerSecond: config.MinPricePerBytePerSecond.TstWei(), diff --git a/Tools/TestNetRewarder/EventsFormatter.cs b/Tools/TestNetRewarder/EventsFormatter.cs index 388515d3..7e363432 100644 --- a/Tools/TestNetRewarder/EventsFormatter.cs +++ b/Tools/TestNetRewarder/EventsFormatter.cs @@ -165,13 +165,7 @@ namespace TestNetRewarder private void DescribeMissedProof(List lines, PeriodProofMissed missedProof) { - lines.Add($"[{FormatHost(missedProof.Host)}] missed proof for {FormatRequestId(missedProof.Request)} (slotIndex: {missedProof.SlotIndex})"); - } - - private string FormatHost(EthAddress? host) - { - if (host == null) return "Unknown host"; - return host.Address; + lines.Add($"[{missedProof.FormatHost()}] missed proof for {FormatRequestId(missedProof.Request)} (slotIndex: {missedProof.SlotIndex})"); } private void AddRequestBlock(RequestEvent requestEvent, string eventName, params string[] content) From a676e0463d04e0b3b3f5c7daa117b04a7036769e Mon Sep 17 00:00:00 2001 From: Ben Date: Wed, 12 Mar 2025 14:06:17 +0100 Subject: [PATCH 02/15] Sets up asserting of balances in case of failed contract. --- Framework/KubernetesWorkflow/LogHandler.cs | 4 + Framework/Utils/EthAddress.cs | 10 ++ ProjectPlugins/CodexClient/CodexAccess.cs | 4 +- ProjectPlugins/CodexClient/CodexClient.csproj | 1 + .../CodexClient/StoragePurchaseContract.cs | 23 +++- .../MarketTests/ContractFailedTest.cs | 108 ++++++++++++++---- .../MarketplaceAutoBootstrapDistTest.cs | 46 ++++++-- Tests/CodexReleaseTests/Parallelism.cs | 2 +- .../Utils/EthAddressEqualityTests.cs | 46 ++++++++ 9 files changed, 209 insertions(+), 35 deletions(-) create mode 100644 Tests/FrameworkTests/Utils/EthAddressEqualityTests.cs diff --git a/Framework/KubernetesWorkflow/LogHandler.cs b/Framework/KubernetesWorkflow/LogHandler.cs index af77ef75..b8a8fa4b 100644 --- a/Framework/KubernetesWorkflow/LogHandler.cs +++ b/Framework/KubernetesWorkflow/LogHandler.cs @@ -40,6 +40,10 @@ namespace KubernetesWorkflow protected override void ProcessLine(string line) { + // This line is not useful and has no topic so we can't filter it with + // normal log-level controls. + if (line.Contains("Received JSON-RPC response") && !line.Contains("topics=")) return; + LogFile.WriteRaw(line); } } diff --git a/Framework/Utils/EthAddress.cs b/Framework/Utils/EthAddress.cs index 61c2776c..a16f4b46 100644 --- a/Framework/Utils/EthAddress.cs +++ b/Framework/Utils/EthAddress.cs @@ -30,5 +30,15 @@ { return Address; } + + public static bool operator ==(EthAddress a, EthAddress b) + { + return a.Address == b.Address; + } + + public static bool operator !=(EthAddress a, EthAddress b) + { + return a.Address != b.Address; + } } } diff --git a/ProjectPlugins/CodexClient/CodexAccess.cs b/ProjectPlugins/CodexClient/CodexAccess.cs index ca11ebee..e9a49224 100644 --- a/ProjectPlugins/CodexClient/CodexAccess.cs +++ b/ProjectPlugins/CodexClient/CodexAccess.cs @@ -11,7 +11,7 @@ namespace CodexClient private readonly ILog log; private readonly IHttpFactory httpFactory; private readonly IProcessControl processControl; - private ICodexInstance instance; + private readonly ICodexInstance instance; private readonly Mapper mapper = new Mapper(); public CodexAccess(ILog log, IHttpFactory httpFactory, IProcessControl processControl, ICodexInstance instance) @@ -25,8 +25,6 @@ namespace CodexClient public void Stop(bool waitTillStopped) { processControl.Stop(waitTillStopped); - // Prevents accidental use after stop: - instance = null!; } public IDownloadedLog DownloadLog(string additionalName = "") diff --git a/ProjectPlugins/CodexClient/CodexClient.csproj b/ProjectPlugins/CodexClient/CodexClient.csproj index cc417a9e..17a76836 100644 --- a/ProjectPlugins/CodexClient/CodexClient.csproj +++ b/ProjectPlugins/CodexClient/CodexClient.csproj @@ -30,6 +30,7 @@ + diff --git a/ProjectPlugins/CodexClient/StoragePurchaseContract.cs b/ProjectPlugins/CodexClient/StoragePurchaseContract.cs index 618ca1c3..a1ae1394 100644 --- a/ProjectPlugins/CodexClient/StoragePurchaseContract.cs +++ b/ProjectPlugins/CodexClient/StoragePurchaseContract.cs @@ -1,4 +1,5 @@ using CodexClient.Hooks; +using CodexContractsPlugin.Marketplace; using Logging; using Newtonsoft.Json; using Utils; @@ -14,7 +15,7 @@ namespace CodexClient void WaitForStorageContractSubmitted(); void WaitForStorageContractStarted(); void WaitForStorageContractFinished(); - void WaitForContractFailed(); + void WaitForContractFailed(MarketplaceConfig config); } public class StoragePurchaseContract : IStoragePurchaseContract @@ -99,7 +100,7 @@ namespace CodexClient AssertDuration(SubmittedToFinished, timeout, nameof(SubmittedToFinished)); } - public void WaitForContractFailed() + public void WaitForContractFailed(MarketplaceConfig config) { if (!contractStartedUtc.HasValue) { @@ -107,9 +108,27 @@ namespace CodexClient } var currentContractTime = DateTime.UtcNow - contractSubmittedUtc!.Value; var timeout = (Purchase.Duration - currentContractTime) + gracePeriod; + var minTimeout = TimeNeededToFailEnoughProofsToFreeASlot(config); + + if (timeout < minTimeout) + { + throw new ArgumentOutOfRangeException( + $"Test is misconfigured. Assuming a proof is required every period, it will take {Time.FormatDuration(minTimeout)} " + + $"to fail enough proofs for a slot to be freed. But, the storage contract will complete in {Time.FormatDuration(timeout)}. " + + $"Increase the duration." + ); + } + WaitForStorageContractState(timeout, "failed"); } + private TimeSpan TimeNeededToFailEnoughProofsToFreeASlot(MarketplaceConfig config) + { + var numMissedProofsRequiredForFree = config.Collateral.MaxNumberOfSlashes; + var timePerProof = TimeSpan.FromSeconds(config.Proofs.Period); + return timePerProof * (numMissedProofsRequiredForFree + 1); + } + private void WaitForStorageContractState(TimeSpan timeout, string desiredState, int sleep = 1000) { var waitStart = DateTime.UtcNow; diff --git a/Tests/CodexReleaseTests/MarketTests/ContractFailedTest.cs b/Tests/CodexReleaseTests/MarketTests/ContractFailedTest.cs index 455306be..5c1d3be3 100644 --- a/Tests/CodexReleaseTests/MarketTests/ContractFailedTest.cs +++ b/Tests/CodexReleaseTests/MarketTests/ContractFailedTest.cs @@ -1,6 +1,9 @@ using CodexClient; +using CodexContractsPlugin.ChainMonitor; using CodexContractsPlugin.Marketplace; +using CodexPlugin; using NUnit.Framework; +using System.Numerics; using Utils; namespace CodexReleaseTests.MarketTests @@ -21,7 +24,7 @@ namespace CodexReleaseTests.MarketTests { var hosts = StartHosts(); var client = StartClients().Single(); - StartValidator(); + var validator = StartValidator(); var request = CreateStorageRequest(client); @@ -32,32 +35,97 @@ namespace CodexReleaseTests.MarketTests AssertContractSlotsAreFilledByHosts(request, hosts); hosts.Stop(waitTillStopped: true); + + var config = GetContracts().Deployment.Config; + request.WaitForContractFailed(config); - WaitForSlotFreedEvents(); - AssertProofMissedReports(); + var frees = GetOnChainSlotFrees(hosts); + Assert.That(frees.Length, Is.EqualTo( + request.Purchase.MinRequiredNumberOfNodes - request.Purchase.NodeFailureTolerance)); - request.WaitForContractFailed(); + var periodReports = GetPeriodMonitorReports(); + var missedProofs = periodReports.Reports.SelectMany(r => r.MissedProofs).ToArray(); + AssertEnoughProofsWereMissedForSlotFree(frees, missedProofs, config); + + AssertClientPaidNothing(client); + AssertValidatorWasPaidPerMissedProof(validator, request, missedProofs, config); + AssertHostCollateralWasBurned(hosts, request); } - private void WaitForSlotFreedEvents() + private void AssertClientPaidNothing(ICodexNode client) { - Log(nameof(WaitForSlotFreedEvents)); + AssertTstBalance(client, StartingBalanceTST.Tst(), "Client should not have paid for failed contract."); + } - var start = DateTime.UtcNow; - var timeout = CalculateContractFailTimespan(); + private void AssertValidatorWasPaidPerMissedProof(ICodexNode validator, IStoragePurchaseContract request, PeriodProofMissed[] missedProofs, MarketplaceConfig config) + { + var rewardPerMissedProof = GetValidatorRewardPerMissedProof(request, config); + var totalValidatorReward = rewardPerMissedProof * missedProofs.Length; - while (DateTime.UtcNow < start + timeout) + AssertTstBalance(validator, StartingBalanceTST.Tst() + totalValidatorReward, $"Validator is rewarded per slot marked as missing. " + + $"numberOfMissedProofs: {missedProofs.Length} rewardPerMissedProof: {rewardPerMissedProof}"); + } + + private TestToken GetCollatoralPerSlot(IStoragePurchaseContract request) + { + var slotSize = new ByteSize(Convert.ToInt64(request.GetStatus()!.Request.Ask.SlotSize)); + return new TestToken(request.Purchase.CollateralPerByte.TstWei * slotSize.SizeInBytes); + } + + private void AssertHostCollateralWasBurned(ICodexNodeGroup hosts, IStoragePurchaseContract request) + { + var slotFills = GetOnChainSlotFills(hosts); + foreach (var host in hosts) { - var events = GetContracts().GetEvents(GetTestRunTimeRange()); - var slotFreed = events.GetSlotFreedEvents(); - if (slotFreed.Length == NumberOfSlots) - { - Log($"{nameof(WaitForSlotFreedEvents)} took {Time.FormatDuration(DateTime.UtcNow - start)}"); - return; - } - GetContracts().WaitUntilNextPeriod(); + AssertHostCollateralWasBurned(host, slotFills, request); } - Assert.Fail($"{nameof(WaitForSlotFreedEvents)} failed after {Time.FormatDuration(timeout)}"); + } + + private void AssertHostCollateralWasBurned(ICodexNode host, SlotFill[] slotFills, IStoragePurchaseContract request) + { + // In case of a failed contract, the entire slotColateral is lost. + var filledByHost = slotFills.Where(f => f.Host.EthAddress == host.EthAddress).ToArray(); + var numSlotsOfHost = filledByHost.Length; + var collatoralPerSlot = GetCollatoralPerSlot(request); + var totalCost = collatoralPerSlot * numSlotsOfHost; + + AssertTstBalance(host, StartingBalanceTST.Tst() - totalCost, $"Host has lost collateral for each slot. " + + $"numberOfSlotsByHost: {numSlotsOfHost} collateralPerSlot: {collatoralPerSlot}"); + } + + private TestToken GetValidatorRewardPerMissedProof(IStoragePurchaseContract request, MarketplaceConfig config) + { + var collatoralPerSlot = GetCollatoralPerSlot(request); + var slashPercentage = config.Collateral.SlashPercentage; + var validatorRewardPercentage = config.Collateral.ValidatorRewardPercentage; + + var rewardPerMissedProof = + PercentageOf( + PercentageOf(collatoralPerSlot, slashPercentage), + validatorRewardPercentage); + + return rewardPerMissedProof; + } + + private TestToken PercentageOf(TestToken value, byte percentage) + { + var p = new BigInteger(percentage); + return new TestToken((value.TstWei * p) / 100); + } + + private void AssertEnoughProofsWereMissedForSlotFree(SlotFree[] frees, PeriodProofMissed[] missedProofs, MarketplaceConfig config) + { + foreach (var free in frees) + { + AssertEnoughProofsWereMissedForSlotFree(free, missedProofs, config); + } + } + + private void AssertEnoughProofsWereMissedForSlotFree(SlotFree free, PeriodProofMissed[] missedProofs, MarketplaceConfig config) + { + var missedByHost = missedProofs.Where(p => p.Host != null && p.Host.Address == free.Host.EthAddress.Address).ToArray(); + var maxNumMissedProofsBeforeFreeSlot = config.Collateral.MaxNumberOfSlashes; + Assert.That(missedByHost.Length, Is.EqualTo(maxNumMissedProofsBeforeFreeSlot)); } private TimeSpan CalculateContractFailTimespan() @@ -92,8 +160,8 @@ namespace CodexReleaseTests.MarketTests var cid = client.UploadFile(GenerateTestFile(FilesizeMb.MB())); return client.Marketplace.RequestStorage(new StoragePurchaseRequest(cid) { - Duration = TimeSpan.FromHours(1.0), - Expiry = TimeSpan.FromHours(0.2), + Duration = TimeSpan.FromMinutes(10.0), + Expiry = TimeSpan.FromMinutes(5.0), MinRequiredNumberOfNodes = NumberOfSlots, NodeFailureTolerance = 1, PricePerBytePerSecond = pricePerBytePerSecond, diff --git a/Tests/CodexReleaseTests/MarketTests/MarketplaceAutoBootstrapDistTest.cs b/Tests/CodexReleaseTests/MarketTests/MarketplaceAutoBootstrapDistTest.cs index 17d83e3a..04957541 100644 --- a/Tests/CodexReleaseTests/MarketTests/MarketplaceAutoBootstrapDistTest.cs +++ b/Tests/CodexReleaseTests/MarketTests/MarketplaceAutoBootstrapDistTest.cs @@ -68,8 +68,8 @@ namespace CodexReleaseTests.MarketTests var hosts = StartCodex(NumberOfHosts, s => s .WithName("host") .WithBlockTTL(HostBlockTTL) - .WithBlockMaintenanceNumber(100000) - .WithBlockMaintenanceInterval(HostBlockTTL / 4) + .WithBlockMaintenanceNumber(100) + .WithBlockMaintenanceInterval(HostBlockTTL / 2) .EnableMarketplace(GetGeth(), GetContracts(), m => m .WithInitial(StartingBalanceEth.Eth(), StartingBalanceTST.Tst()) .AsStorageNode() @@ -236,6 +236,29 @@ namespace CodexReleaseTests.MarketTests }).ToArray(); } + public SlotFree[] GetOnChainSlotFrees(ICodexNodeGroup possibleHosts, string purchaseId) + { + var fills = GetOnChainSlotFrees(possibleHosts); + return fills.Where(f => f + .SlotFreedEvent.RequestId.ToHex(false).ToLowerInvariant() == purchaseId.ToLowerInvariant()) + .ToArray(); + } + + public SlotFree[] GetOnChainSlotFrees(ICodexNodeGroup possibleHosts) + { + var events = GetContracts().GetEvents(GetTestRunTimeRange()); + var fills = GetOnChainSlotFills(possibleHosts); + var frees = events.GetSlotFreedEvents(); + return frees.Select(f => + { + var matchingFill = fills.Single(fill => fill.SlotFilledEvent.RequestId == f.RequestId && + fill.SlotFilledEvent.SlotIndex == f.SlotIndex); + + return new SlotFree(f, matchingFill.Host); + + }).ToArray(); + } + protected void AssertClientHasPaidForContract(TestToken pricePerBytePerSecond, ICodexNode client, IStoragePurchaseContract contract, ICodexNodeGroup hosts) { var expectedBalance = StartingBalanceTST.Tst() - GetContractFinalCost(pricePerBytePerSecond, contract, hosts); @@ -359,13 +382,6 @@ namespace CodexReleaseTests.MarketTests }, description); } - protected void AssertEnoughProofMissedForSlotFree(ICodexNodeGroup hosts) - { - var slotFills = GetOnChainSlotFills(hosts); - - todo for each filled slot, there should be enough proofs missed to trigger the slot-free event. - } - public class SlotFill { public SlotFill(SlotFilledEventDTO slotFilledEvent, ICodexNode host) @@ -378,6 +394,18 @@ namespace CodexReleaseTests.MarketTests public ICodexNode Host { get; } } + public class SlotFree + { + public SlotFree(SlotFreedEventDTO slotFreedEvent, ICodexNode host) + { + SlotFreedEvent = slotFreedEvent; + Host = host; + } + + public SlotFreedEventDTO SlotFreedEvent { get; } + public ICodexNode Host { get; } + } + private class MarketplaceHandle { public MarketplaceHandle(IGethNode geth, ICodexContracts contracts, ChainMonitor monitor) diff --git a/Tests/CodexReleaseTests/Parallelism.cs b/Tests/CodexReleaseTests/Parallelism.cs index cd0a4299..a1b26c73 100644 --- a/Tests/CodexReleaseTests/Parallelism.cs +++ b/Tests/CodexReleaseTests/Parallelism.cs @@ -1,6 +1,6 @@ using NUnit.Framework; -[assembly: LevelOfParallelism(10)] +[assembly: LevelOfParallelism(1)] namespace CodexReleaseTests.DataTests { } diff --git a/Tests/FrameworkTests/Utils/EthAddressEqualityTests.cs b/Tests/FrameworkTests/Utils/EthAddressEqualityTests.cs new file mode 100644 index 00000000..72cb8a67 --- /dev/null +++ b/Tests/FrameworkTests/Utils/EthAddressEqualityTests.cs @@ -0,0 +1,46 @@ +using GethPlugin; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Utils; + +namespace FrameworkTests.Utils +{ + [TestFixture] + public class EthAddressEqualityTests + { + [Test] + [Combinatorial] + public void Equal( + [Values(1, 2, 3, 4, 5)] int runs + ) + { + var account = EthAccountGenerator.GenerateNew(); + + var str = account.EthAddress.Address; + + var addr = new EthAddress(str); + + Assert.That(addr, Is.EqualTo(account.EthAddress)); + Assert.That(addr == account.EthAddress); + Assert.That(!(addr != account.EthAddress)); + } + + [Test] + [Combinatorial] + public void NotEqual( + [Values(1, 2, 3, 4, 5)] int runs + ) + { + var account1 = EthAccountGenerator.GenerateNew(); + var account2 = EthAccountGenerator.GenerateNew(); + + Assert.That(account1.EthAddress, Is.Not.EqualTo(account2.EthAddress)); + Assert.That(account1.EthAddress != account2.EthAddress); + Assert.That(!(account1.EthAddress == account2.EthAddress)); + } + } +} From c4758023301f0d5681cc7b3b740fe482a017b2d5 Mon Sep 17 00:00:00 2001 From: Ben Date: Wed, 12 Mar 2025 14:26:56 +0100 Subject: [PATCH 03/15] cleans up purchaseUTC when storage fails --- Tools/AutoClient/Modes/FolderStore/FileSaver.cs | 6 ++---- Tools/AutoClient/Modes/FolderStore/FolderStatus.cs | 7 +++++++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Tools/AutoClient/Modes/FolderStore/FileSaver.cs b/Tools/AutoClient/Modes/FolderStore/FileSaver.cs index 733044d2..86507044 100644 --- a/Tools/AutoClient/Modes/FolderStore/FileSaver.cs +++ b/Tools/AutoClient/Modes/FolderStore/FileSaver.cs @@ -165,8 +165,7 @@ namespace AutoClient.Modes.FolderStore } catch (Exception exc) { - entry.EncodedCid = string.Empty; - entry.PurchaseId = string.Empty; + entry.ClearPurchase(); saveChanges(); log.Error("Failed to start new purchase: " + exc); HasFailed = true; @@ -215,8 +214,7 @@ namespace AutoClient.Modes.FolderStore else if (!update.IsSubmitted) { Log("Request failed to start. State: " + update.State); - entry.EncodedCid = string.Empty; - entry.PurchaseId = string.Empty; + entry.ClearPurchase(); saveChanges(); return; } diff --git a/Tools/AutoClient/Modes/FolderStore/FolderStatus.cs b/Tools/AutoClient/Modes/FolderStore/FolderStatus.cs index e9b7ec14..abb9c52a 100644 --- a/Tools/AutoClient/Modes/FolderStore/FolderStatus.cs +++ b/Tools/AutoClient/Modes/FolderStore/FolderStatus.cs @@ -16,6 +16,13 @@ public string EncodedCid { get; set; } = string.Empty; public string PurchaseId { get; set; } = string.Empty; public DateTime PurchaseFinishedUtc { get; set; } = DateTime.MinValue; + + public void ClearPurchase() + { + EncodedCid = string.Empty; + PurchaseId = string.Empty; + PurchaseFinishedUtc = DateTime.MinValue; + } } [Serializable] From 604b0f22411586a7d69417eaf9f7d86e647ce413 Mon Sep 17 00:00:00 2001 From: Ben Date: Wed, 12 Mar 2025 15:03:06 +0100 Subject: [PATCH 04/15] Accounts for pointer downtime in waitForFailed time calculation --- ProjectPlugins/CodexClient/StoragePurchaseContract.cs | 7 ++++++- Tests/CodexReleaseTests/MarketTests/ContractFailedTest.cs | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/ProjectPlugins/CodexClient/StoragePurchaseContract.cs b/ProjectPlugins/CodexClient/StoragePurchaseContract.cs index a1ae1394..3a7c7d9a 100644 --- a/ProjectPlugins/CodexClient/StoragePurchaseContract.cs +++ b/ProjectPlugins/CodexClient/StoragePurchaseContract.cs @@ -126,7 +126,12 @@ namespace CodexClient { var numMissedProofsRequiredForFree = config.Collateral.MaxNumberOfSlashes; var timePerProof = TimeSpan.FromSeconds(config.Proofs.Period); - return timePerProof * (numMissedProofsRequiredForFree + 1); + var result = timePerProof * (numMissedProofsRequiredForFree + 1); + + // Times 2! + // Because of pointer-downtime it's possible that some periods even though there's a probability of 100% + // will not require any proof. To be safe we take twice the required time. + return result * 2; } private void WaitForStorageContractState(TimeSpan timeout, string desiredState, int sleep = 1000) diff --git a/Tests/CodexReleaseTests/MarketTests/ContractFailedTest.cs b/Tests/CodexReleaseTests/MarketTests/ContractFailedTest.cs index 5c1d3be3..f4301f39 100644 --- a/Tests/CodexReleaseTests/MarketTests/ContractFailedTest.cs +++ b/Tests/CodexReleaseTests/MarketTests/ContractFailedTest.cs @@ -160,7 +160,7 @@ namespace CodexReleaseTests.MarketTests var cid = client.UploadFile(GenerateTestFile(FilesizeMb.MB())); return client.Marketplace.RequestStorage(new StoragePurchaseRequest(cid) { - Duration = TimeSpan.FromMinutes(10.0), + Duration = TimeSpan.FromMinutes(20.0), Expiry = TimeSpan.FromMinutes(5.0), MinRequiredNumberOfNodes = NumberOfSlots, NodeFailureTolerance = 1, From 0f84e6da5cc894cf1273c72a215873c73f793376 Mon Sep 17 00:00:00 2001 From: Ben Date: Wed, 9 Apr 2025 09:09:40 +0200 Subject: [PATCH 05/15] fixed conflicts --- ProjectPlugins/CodexClient/Mapper.cs | 2 +- .../MarketTests/MarketplaceAutoBootstrapDistTest.cs | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/ProjectPlugins/CodexClient/Mapper.cs b/ProjectPlugins/CodexClient/Mapper.cs index 3a7f1866..f72d7760 100644 --- a/ProjectPlugins/CodexClient/Mapper.cs +++ b/ProjectPlugins/CodexClient/Mapper.cs @@ -36,7 +36,7 @@ namespace CodexClient }; } - public CodexOpenApi.SalesAvailability Map(StorageAvailability availability) + public CodexOpenApi.SalesAvailability Map(CreateStorageAvailability availability) { return new CodexOpenApi.SalesAvailability { diff --git a/Tests/CodexReleaseTests/MarketTests/MarketplaceAutoBootstrapDistTest.cs b/Tests/CodexReleaseTests/MarketTests/MarketplaceAutoBootstrapDistTest.cs index 13db8225..2c6844e9 100644 --- a/Tests/CodexReleaseTests/MarketTests/MarketplaceAutoBootstrapDistTest.cs +++ b/Tests/CodexReleaseTests/MarketTests/MarketplaceAutoBootstrapDistTest.cs @@ -173,7 +173,8 @@ namespace CodexReleaseTests.MarketTests return new Retry("AssertAvailabilitySpace", maxTimeout: HostBlockTTL * 3, sleepAfterFail: TimeSpan.FromSeconds(10.0), - onFail: f => { }); + onFail: f => { }, + failFast: false); } private TestToken GetTstBalance(ICodexNode node) From d5832d517f345647141d716b2efcb0ec2927dd2e Mon Sep 17 00:00:00 2001 From: ThatBen Date: Thu, 17 Apr 2025 17:54:30 +0200 Subject: [PATCH 06/15] Update marketplace contract --- ProjectPlugins/CodexContractsPlugin/Marketplace/Marketplace.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ProjectPlugins/CodexContractsPlugin/Marketplace/Marketplace.cs b/ProjectPlugins/CodexContractsPlugin/Marketplace/Marketplace.cs index e46bbdd9..ae309f1f 100644 --- a/ProjectPlugins/CodexContractsPlugin/Marketplace/Marketplace.cs +++ b/ProjectPlugins/CodexContractsPlugin/Marketplace/Marketplace.cs @@ -15,7 +15,7 @@ namespace CodexContractsPlugin.Marketplace public class MarketplaceDeploymentBase : ContractDeploymentMessage { - public static string BYTECODE = "0x60c060405234801561001057600080fd5b50604051614f0a380380614f0a83398101604081905261002f9161053b565b602083015180516040850151516001805460ff191660ff90921691909117905582906001600160401b03811660000361007b5760405163015536c760e51b815260040160405180910390fd5b6001600160401b031660805261010043116100a9576040516338f5f66160e11b815260040160405180910390fd5b8151600280546020850151604086015160608701516001600160401b039586166001600160801b0319909416939093176801000000000000000095909216949094021761ffff60801b1916600160801b60ff9485160260ff60881b191617600160881b9390911692909202919091178155608083015183919060039061012f90826106d9565b5050600480546001600160a01b0319166001600160a01b0393841617905550831660a05250825151606460ff909116111561017d576040516302bd816360e41b815260040160405180910390fd5b606483600001516040015160ff1611156101aa576040516354e5e0ab60e11b815260040160405180910390fd5b825160408101516020909101516064916101c391610797565b60ff1611156101e5576040516317ff9d0f60e21b815260040160405180910390fd5b82518051600b805460208085015160408087015160609788015160ff90811663010000000263ff0000001992821662010000029290921663ffff0000199482166101000261ffff1990971698821698909817959095179290921695909517178355808801518051600c80549383015196830151978301518516600160881b0260ff60881b1998909516600160801b029790971661ffff60801b196001600160401b0397881668010000000000000000026001600160801b031990951697909216969096179290921791909116939093171783556080820151869391929190600d906102d090826106d9565b50505060408201515160038201805460ff191660ff909216919091179055606090910151600490910180546001600160401b0319166001600160401b03909216919091179055506107c8915050565b634e487b7160e01b600052604160045260246000fd5b60405160a081016001600160401b03811182821017156103575761035761031f565b60405290565b604051608081016001600160401b03811182821017156103575761035761031f565b604051601f8201601f191681016001600160401b03811182821017156103a7576103a761031f565b604052919050565b805160ff811681146103c057600080fd5b919050565b80516001600160401b03811681146103c057600080fd5b600060a082840312156103ee57600080fd5b6103f6610335565b9050610401826103c5565b815261040f602083016103c5565b6020820152610420604083016103af565b6040820152610431606083016103af565b606082015260808201516001600160401b0381111561044f57600080fd5b8201601f8101841361046057600080fd5b80516001600160401b038111156104795761047961031f565b61048c601f8201601f191660200161037f565b8181528560208385010111156104a157600080fd5b60005b828110156104c0576020818501810151838301820152016104a4565b5060006020838301015280608085015250505092915050565b6000602082840312156104eb57600080fd5b604051602081016001600160401b038111828210171561050d5761050d61031f565b60405290508061051c836103af565b905292915050565b80516001600160a01b03811681146103c057600080fd5b60008060006060848603121561055057600080fd5b83516001600160401b0381111561056657600080fd5b840180860360e081121561057957600080fd5b61058161035d565b608082121561058f57600080fd5b61059761035d565b91506105a2836103af565b82526105b0602084016103af565b60208301526105c1604084016103af565b60408301526105d2606084016103af565b60608301529081526080820151906001600160401b038211156105f457600080fd5b610600888385016103dc565b60208201526106128860a085016104d9565b604082015261062360c084016103c5565b6060820152945061063991505060208501610524565b915061064760408501610524565b90509250925092565b600181811c9082168061066457607f821691505b60208210810361068457634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156106d457806000526020600020601f840160051c810160208510156106b15750805b601f840160051c820191505b818110156106d157600081556001016106bd565b50505b505050565b81516001600160401b038111156106f2576106f261031f565b610706816107008454610650565b8461068a565b6020601f82116001811461073a57600083156107225750848201515b600019600385901b1c1916600184901b1784556106d1565b600084815260208120601f198516915b8281101561076a578785015182556020948501946001909201910161074a565b50848210156107885786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b60ff81811683821602908116908181146107c157634e487b7160e01b600052601160045260246000fd5b5092915050565b60805160a0516146e5610825600039600081816104bf01528181610f7001528181612019015281816125d30152818161268301528181612812015281816128c20152612cec01526000818161355601526137e601526146e56000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80636e2b54ee116100f9578063c0cc4add11610097578063e8aa0a0711610071578063e8aa0a0714610461578063f752196b14610474578063fb1e61ca1461049d578063fc0c546a146104bd57600080fd5b8063c0cc4add14610428578063c5d433511461043b578063d02bbe331461044e57600080fd5b8063a29c29a4116100d3578063a29c29a4146103b2578063a3a0807e146103c5578063b396dc79146103e8578063be5cdc481461040857600080fd5b80636e2b54ee146103845780639777b72c1461039757806399b6da0c1461039f57600080fd5b8063329b5a0b1161016657806351a766421161014057806351a76642146103035780635da73835146103165780636b00c8cf1461032b5780636c70bee91461036f57600080fd5b8063329b5a0b14610298578063458d2bf1146102cb5780634641dce6146102de57600080fd5b806312827602116101a2578063128276021461022e5780631d873c1b14610241578063237d84821461025457806326d6f8341461026757600080fd5b806302fa8e65146101c957806305b90773146101f95780630aefaabe14610219575b600080fd5b6101dc6101d73660046138b3565b6104e3565b6040516001600160401b0390911681526020015b60405180910390f35b61020c6102073660046138b3565b6105c1565b6040516101f091906138e2565b61022c610227366004613911565b6106e4565b005b61022c61023c366004613978565b610877565b61022c61024f3660046139bb565b610948565b61022c610262366004613978565b610dfa565b61028a6102753660046138b3565b60009081526012602052604090206003015490565b6040519081526020016101f0565b6101dc6102a63660046138b3565b600090815260116020526040902060020154600160c01b90046001600160401b031690565b61028a6102d93660046138b3565b611046565b6102f16102ec3660046138b3565b61105f565b60405160ff90911681526020016101f0565b61028a6103113660046138b3565b611072565b61031e6110d1565b6040516101f091906139fb565b6103576103393660046138b3565b6000908152601260205260409020600401546001600160a01b031690565b6040516001600160a01b0390911681526020016101f0565b6103776110f8565b6040516101f09190613ad9565b61022c6103923660046138b3565b61126f565b61031e61127c565b61022c6103ad366004613b61565b61129b565b61022c6103c03660046138b3565b6117e1565b6103d86103d33660046138b3565b611833565b60405190151581526020016101f0565b6103fb6103f63660046138b3565b61186f565b6040516101f09190613c90565b61041b6104163660046138b3565b611b51565b6040516101f09190613ccb565b6103d86104363660046138b3565b611c1f565b61022c610449366004613cdf565b611c32565b6103d861045c366004613978565b6120b3565b61022c61046f366004613d04565b61211f565b6101dc6104823660046138b3565b6000908152600660205260409020546001600160401b031690565b6104b06104ab3660046138b3565b612298565b6040516101f09190613d32565b7f0000000000000000000000000000000000000000000000000000000000000000610357565b6000806104ef836105c1565b90506000816004811115610505576105056138cc565b148061052257506001816004811115610520576105206138cc565b145b1561054e575050600090815260116020526040902060020154600160801b90046001600160401b031690565b6002816004811115610562576105626138cc565b0361058e575050600090815260116020526040902060020154600160c01b90046001600160401b031690565b6000838152601160205260409020600201546105ba90600160801b90046001600160401b0316426124ae565b9392505050565b60008181526010602052604081205482906001600160a01b03166105f857604051635eeb253d60e11b815260040160405180910390fd5b600083815260116020526040812090815460ff16600481111561061d5761061d6138cc565b14801561065c5750600084815260116020526040902060020154600160c01b90046001600160401b03166001600160401b0316426001600160401b0316115b1561066b5760029250506106de565b6001815460ff166004811115610683576106836138cc565b14806106a457506000815460ff1660048111156106a2576106a26138cc565b145b80156106c8575060028101546001600160401b03600160801b909104811642909116115b156106d75760039250506106de565b5460ff1691505b50919050565b826000808281526012602052604090205460ff166006811115610709576107096138cc565b0361072757604051638b41ec7f60e01b815260040160405180910390fd5b600084815260126020526040902060048101546001600160a01b0316331461077b576040517f57a6f4e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061078686611b51565b9050600481600681111561079c5761079c6138cc565b036107d3576040517fc2cbf77700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028160068111156107e7576107e76138cc565b03610801576107fc82600101548787876124c4565b61086f565b6005816006811115610815576108156138cc565b0361082a576107fc826001015487878761270d565b600381600681111561083e5761083e6138cc565b0361084d576107fc3387612956565b6001816006811115610861576108616138cc565b0361086f5761086f86612978565b505050505050565b61088182826120b3565b6108b7576040517f424a04ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108c38383612bd0565b60008181526020819052604090209091506108de9033612c15565b50600154600082815260208190526040902060ff909116906108ff90612c2a565b03610943576040516001600160401b038316815283907fc8e6c955744189a19222ec226b72ac1435d88d5745252dac56e6f679f64c037a9060200160405180910390a25b505050565b60008381526010602052604090205483906001600160a01b031661097f57604051635eeb253d60e11b815260040160405180910390fd5b600084815260106020526040902060048101546001600160401b03908116908516106109d7576040517f3b920b8800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006109e38686612bd0565b60008181526020819052604090209091506109fe9033612c34565b610a34576040517fd651ce1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152601260209081526040808320600181018a90556002810180546fffffffffffffffff00000000000000001916600160401b6001600160401b038c1602179055898452601190925282209091610a8d84611b51565b6006811115610a9e57610a9e6138cc565b14158015610ac657506006610ab284611b51565b6006811115610ac357610ac36138cc565b14155b15610afd576040517fff556acf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60048201805473ffffffffffffffffffffffffffffffffffffffff1916331790556002820180546001600160401b03421667ffffffffffffffff19909116179055610b6e83600090815260056020526040902080546001600160401b03421667ffffffffffffffff19909116179055565b610b78838761211f565b60028101805460019190600090610b999084906001600160401b0316613d5b565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550610bde888360020160009054906101000a90046001600160401b0316612c56565b816001016000828254610bf19190613d7a565b90915550506040805160e081018252600186015481526002860154602082015260038601549181019190915260048501546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c08201526000908190610c6a90612c85565b90506006610c7786611b51565b6006811115610c8857610c886138cc565b03610cbb57600b54606490610ca09060ff1683613d8d565b610caa9190613dba565b610cb49082613d7a565b9150610cbf565b8091505b610cc93383612ca4565b8160136000016000828254610cde9190613dce565b9091555050600384018190556004840154610d02906001600160a01b031686612d78565b835460ff191660011784556040516001600160401b038a1681528a907f8f301470a994578b52323d625dfbf827ca5208c81747d3459be7b8867baec3ec9060200160405180910390a2600486015460028401546001600160401b039081169116148015610d8457506000835460ff166004811115610d8257610d826138cc565b145b15610dee57825460ff191660011783556002830180546001600160401b034216600160401b026fffffffffffffffff0000000000000000199091161790556040518a907f85e1543bf2f84fe80c6badbce3648c8539ad1df4d2b3d822938ca0538be727e690600090a25b50505050505050505050565b6001610e0583611b51565b6006811115610e1657610e166138cc565b14610e4d576040517fae9dcffd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e578282612d9a565b6000828152601260209081526040808320600180820154855260108452828520600b54845160e08101865292820154835260028201549583019590955260038101549382019390935260048301546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0820152909391926064916201000090910460ff1690610efa90612c85565b610f049190613d8d565b610f0e9190613dba565b600b54909150600090606490610f2e906301000000900460ff1684613d8d565b610f389190613dba565b90508060136001016000828254610f4f9190613dce565b909155505060405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015610fc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe59190613de1565b610ff157610ff1613e03565b818460030160008282546110059190613d7a565b9091555050600b5460008781526006602052604090205461010090910460ff16906001600160401b03166001600160401b03161061086f5761086f86612978565b600061105982611054612fb1565b612fbc565b92915050565b60006110598261106d612fb1565b612fd0565b60008181526012602090815260408083206001810154845260109092528220600c54610100906110ac90600160801b900460ff1682613e19565b60018301546110bf9161ffff1690613d8d565b6110c99190613dba565b949350505050565b336000908152600a602052604090206060906110f3906110f090613062565b90565b905090565b61110061380b565b604080516101008082018352600b805460ff8082166080808701918252948304821660a080880191909152620100008404831660c08801526301000000909304821660e0870152855285519182018652600c80546001600160401b038082168552600160401b820416602085810191909152600160801b82048416988501989098527101000000000000000000000000000000000090049091166060830152600d80549596939593870194929391928401916111bb90613e33565b80601f01602080910402602001604051908101604052809291908181526020018280546111e790613e33565b80156112345780601f1061120957610100808354040283529160200191611234565b820191906000526020600020905b81548152906001019060200180831161121757829003601f168201915b5050509190925250505081526040805160208181018352600385015460ff1682528301526004909201546001600160401b0316910152919050565b6112798133611c32565b50565b3360009081526009602052604090206060906110f3906110f090613062565b60006112ae6112a983613fc4565b61306f565b9050336112be60208401846140cd565b6001600160a01b0316146112e5576040516334c69e3160e11b815260040160405180910390fd5b6000818152601060205260409020546001600160a01b031615611334576040517ffc7d069000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611346610140830161012084016140ea565b6001600160401b0316158061138d575061136660e0830160c084016140ea565b6001600160401b0316611381610140840161012085016140ea565b6001600160401b031610155b156113c4576040517fdf63f61a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113d460a08301608084016140ea565b6001600160401b0316600003611416576040517f535ed2be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61142660a08301608084016140ea565b6001600160401b0316611440610100840160e085016140ea565b6001600160401b03161115611481576040517fb9551ab100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61149160e0830160c084016140ea565b6001600160401b03166000036114d3576040517f090a5ecd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020820135600003611511576040517f6aba7aae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606082013560000361154f576040517ffb7df0c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604082013560000361158d576040517f47ba51c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61159b610100830183614107565b6115a59080614127565b90506000036115e0576040517f86f8cf9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f546001600160401b03166115fc60e0840160c085016140ea565b6001600160401b0316111561163d576040517f1267b3f200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152601060205260409020829061165782826142c7565b5061166a905060e0830160c084016140ea565b6116749042613d5b565b600082815260116020526040902060020180546001600160401b0392909216600160801b0267ffffffffffffffff60801b199092169190911790556116c1610140830161012084016140ea565b6116cb9042613d5b565b600082815260116020908152604090912060020180546001600160401b0393909316600160c01b0277ffffffffffffffffffffffffffffffffffffffffffffffff9093169290921790915561172c90611726908401846140cd565b8261309f565b600061173f61173a84613fc4565b6130c1565b600083815260116020526040812060010182905560138054929350839290919061176a908490613dce565b9091555061177a90503382612ca4565b6000828152601160209081526040918290206002015491517f1bf9c457accf8703dbf7cdf1b58c2f74ddf2e525f98155c70b3d318d74609bd8926117d492869290880191600160c01b90046001600160401b03169061447b565b60405180910390a1505050565b806000808281526012602052604090205460ff166006811115611806576118066138cc565b0361182457604051638b41ec7f60e01b815260040160405180910390fd5b61182f8233336106e4565b5050565b600080600061184984611844612fb1565b6130fd565b90925090508180156110c95750600254600160801b900460ff9081169116109392505050565b6118f260405180604001604052806138746040805160a080820183526000808352835160e081018552818152602080820183905281860183905260608083018490526080830184905293820183905260c0820183905280850191909152845180860186529283528201529091820190815260006020820181905260409091015290565b816000808281526012602052604090205460ff166006811115611917576119176138cc565b0361193557604051638b41ec7f60e01b815260040160405180910390fd5b60008381526012602052604090206119c660405180604001604052806138746040805160a080820183526000808352835160e081018552818152602080820183905281860183905260608083018490526080830184905293820183905260c0820183905280850191909152845180860186529283528201529091820190815260006020820181905260409091015290565b600180830154600090815260106020908152604091829020825160a0808201855282546001600160a01b03168252845160e08101865295830154865260028301548685015260038301548686015260048301546001600160401b038082166060890152600160401b820481166080890152600160801b8204811692880192909252600160c01b90041660c0860152918201939093528151808301835260058401805492949385019282908290611a7b90613e33565b80601f0160208091040260200160405190810160405280929190818152602001828054611aa790613e33565b8015611af45780601f10611ac957610100808354040283529160200191611af4565b820191906000526020600020905b815481529060010190602001808311611ad757829003601f168201915b50505091835250506001919091015460209182015290825260078301546001600160401b0390811683830152600890930154604090920191909152918352600290930154600160401b900490921691810191909152915050919050565b600081815260126020526040812060018101548203611b735750600092915050565b6000611b8282600101546105c1565b90506004825460ff166006811115611b9c57611b9c6138cc565b03611bab575060049392505050565b6002816004811115611bbf57611bbf6138cc565b03611bce575060059392505050565b6003816004811115611be257611be26138cc565b03611bf1575060029392505050565b6004816004811115611c0557611c056138cc565b03611c14575060039392505050565b505460ff1692915050565b600061105982611c2d612fb1565b6131b5565b60008281526010602052604090205482906001600160a01b0316611c6957604051635eeb253d60e11b815260040160405180910390fd5b6000838152601060209081526040808320601190925290912081546001600160a01b03163314611cac576040516334c69e3160e11b815260040160405180910390fd5b6000611cb7866105c1565b90506002816004811115611ccd57611ccd6138cc565b14158015611ced57506004816004811115611cea57611cea6138cc565b14155b8015611d0b57506003816004811115611d0857611d086138cc565b14155b15611d42576040517fc00b5b5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160010154600003611d80576040517fbd8bdd9400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002816004811115611d9457611d946138cc565b03611e3257815460ff1916600217825560405186907ff903f4774c7bd27355f9d7fcbc382b079b164a697a44ac5d95267a4c3cb3bb2290600090a2600086815260116020526040902060020154611dfc908790600160c01b90046001600160401b0316612c56565b6002830154611e1491906001600160401b0316613d8d565b826001016000828254611e279190613dce565b90915550611fbf9050565b6004816004811115611e4657611e466138cc565b03611fb3576040805160a0808201835285546001600160a01b03168252825160e08101845260018701548152600287015460208281019190915260038801548286015260048801546001600160401b038082166060850152600160401b820481166080850152600160801b8204811694840194909452600160c01b900490921660c08201529082015281518083018352600586018054611fa994889390850192909182908290611ef590613e33565b80601f0160208091040260200160405190810160405280929190818152602001828054611f2190613e33565b8015611f6e5780601f10611f4357610100808354040283529160200191611f6e565b820191906000526020600020905b815481529060010190602001808311611f5157829003601f168201915b50505091835250506001919091015460209182015290825260078301546001600160401b0316908201526008909101546040909101526130c1565b6001830155611fbf565b815460ff191660031782555b8254611fd4906001600160a01b0316876131ec565b600182015460148054829190600090611fee908490613dce565b909155505060405163a9059cbb60e01b81526001600160a01b038781166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015612062573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120869190613de1565b6120a357604051637c2ccffd60e11b815260040160405180910390fd5b5050600060019091015550505050565b600033816120c18585612bd0565b90506120cc8161320e565b80156120f55750600154600082815260208190526040902060ff909116906120f390612c2a565b105b8015612116575060008181526020819052604090206121149083612c34565b155b95945050505050565b6000828152601260209081526040808320600101548084526010909252909120546001600160a01b031661216657604051635eeb253d60e11b815260040160405180910390fd5b600083815260126020526040902060048101546001600160a01b031633146121ba576040517fce351b9400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600181015460009081526010602052604080822081516003808252608082019093529092918160200160208202803683370190505090506122026121fd87611046565b61323b565b8160008151811061221557612215614528565b6020908102919091010152600682015461222e9061324c565b8160018151811061224157612241614528565b6020026020010181815250508260020160089054906101000a90046001600160401b03166001600160401b03168160028151811061228157612281614528565b60200260200101818152505061086f868683613258565b61230d6040805160a080820183526000808352835160e081018552818152602080820183905281860183905260608083018490526080830184905293820183905260c0820183905280850191909152845180860186529283528201529091820190815260006020820181905260409091015290565b60008281526010602052604090205482906001600160a01b031661234457604051635eeb253d60e11b815260040160405180910390fd5b600083815260106020908152604091829020825160a0808201855282546001600160a01b03168252845160e0810186526001840154815260028401548186015260038401548187015260048401546001600160401b038082166060840152600160401b820481166080840152600160801b8204811693830193909352600160c01b900490911660c082015292810192909252825180840184526005820180549394929392850192829082906123f890613e33565b80601f016020809104026020016040519081016040528092919081815260200182805461242490613e33565b80156124715780601f1061244657610100808354040283529160200191612471565b820191906000526020600020905b81548152906001019060200180831161245457829003601f168201915b50505091835250506001919091015460209182015290825260078301546001600160401b0316908201526008909101546040909101529392505050565b60008183106124bd57816105ba565b5090919050565b60008481526010602052604090205484906001600160a01b03166124fb57604051635eeb253d60e11b815260040160405180910390fd5b600085815260116020908152604080832060108352818420815460ff1916600317825588855260129093529220815461253d906001600160a01b0316896131ec565b6004810154612555906001600160a01b031688612956565b6002810154600090612571908a906001600160401b0316612c56565b60038301549091506125838183613dce565b60148054600090612595908490613dce565b90915550508254600490849060ff1916600183021790555060405163a9059cbb60e01b81526001600160a01b038981166004830152602482018490527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af115801561261c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126409190613de1565b61265d57604051637c2ccffd60e11b815260040160405180910390fd5b60405163a9059cbb60e01b81526001600160a01b038881166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af11580156126cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126f09190613de1565b610dee57604051637c2ccffd60e11b815260040160405180910390fd5b60008481526010602052604090205484906001600160a01b031661274457604051635eeb253d60e11b815260040160405180910390fd5b6000848152601260205260409020600481015461276a906001600160a01b031686612956565b60028101546000906127b09088906001600160401b03166127ab826000908152601160205260409020600201546001600160401b03600160c01b9091041690565b6133f6565b60038301549091506127c28183613dce565b601480546000906127d4908490613dce565b90915550508254600490849060ff1916600183021790555060405163a9059cbb60e01b81526001600160a01b038781166004830152602482018490527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af115801561285b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287f9190613de1565b61289c57604051637c2ccffd60e11b815260040160405180910390fd5b60405163a9059cbb60e01b81526001600160a01b038681166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af115801561290b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061292f9190613de1565b61294c57604051637c2ccffd60e11b815260040160405180910390fd5b5050505050505050565b6001600160a01b0382166000908152600a6020526040902061094390826134d5565b600081815260126020908152604080832060018101548085526011909352922060028301546129b19083906001600160401b0316612c56565b8160010160008282546129c49190613dce565b909155505060048301546129e1906001600160a01b031685612956565b60008481526020819052604081209081816129fc8282613881565b5050845460ff1916600617855550506002808401805467ffffffffffffffff1916905560006003850181905560048501805473ffffffffffffffffffffffffffffffffffffffff19169055908201805460019290612a649084906001600160401b031661453e565b82546101009290920a6001600160401b038181021990931691831602179091556002850154604051600160401b90910490911681528391507f33ba8f7627565d89f7ada2a6b81ea532b7aa9b11e91a78312d6e1fca0bfcd1dc9060200160405180910390a26000848152600660205260409020805467ffffffffffffffff19169055600082815260106020526040812060028301546004820154919291612b17916001600160401b03908116911661453e565b60048301546001600160401b039182169250600160c01b90041681118015612b5457506001835460ff166004811115612b5257612b526138cc565b145b1561086f57825460ff19166004178355612b6f60014261453e565b6002840180546001600160401b0392909216600160801b0267ffffffffffffffff60801b1990921691909117905560405184907f4769361a442504ecaf038f35e119bcccdd5e42096b24c09e3c17fd17c6684c0290600090a2505050505050565b60008282604051602001612bf79291909182526001600160401b0316602082015260400190565b60405160208183030381529060405280519060200120905092915050565b60006105ba836001600160a01b0384166134e1565b6000611059825490565b6001600160a01b038116600090815260018301602052604081205415156105ba565b6000828152601160205260408120600201546105ba9084908490600160801b90046001600160401b03166133f6565b600081608001516001600160401b031682604001516110599190613d8d565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152306024830181905260448301849052917f0000000000000000000000000000000000000000000000000000000000000000909116906323b872dd906064016020604051808303816000875af1158015612d37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d5b9190613de1565b61094357604051637c2ccffd60e11b815260040160405180910390fd5b6001600160a01b0382166000908152600a602052604090206109439082613530565b6000612da58261353c565b6001600160401b03169050428110612de9576040517f6b4b1a4e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600254612e0690600160401b90046001600160401b031682613dce565b4210612e3e576040517fde55698e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526007602090815260408083206001600160401b038616845290915290205460ff1615612e9a576040517efab7d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ea483836131b5565b612eda576040517fd3ffa66b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526008602090815260408083206001600160401b038616845290915290205460ff1615612f37576040517f98e7e55100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526008602090815260408083206001600160401b038087168552908352818420805460ff1916600190811790915587855260069093529083208054929390929091612f8891859116613d5b565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550505050565b60006110f34261354f565b60006105ba612fcb8484612fd0565b61357b565b600080612fdf6101004361455d565b6002549091506000906101009061300e9071010000000000000000000000000000000000900460ff1686614571565b6130189190614593565b6001600160401b0316905060006130316101008761455d565b90506000610100826130438587613dce565b61304d9190613dce565b613057919061455d565b979650505050505050565b606060006105ba836135d5565b6000816040516020016130829190613d32565b604051602081830303815290604052805190602001209050919050565b6001600160a01b03821660009081526009602052604090206109439082613530565b60006130d08260200151613631565b602083015160a08101516060909101516130ea9190614571565b6001600160401b03166110599190613d8d565b600080600061310b85611b51565b60008681526005602052604081205491925090613130906001600160401b031661354f565b90506001826006811115613146576131466138cc565b14158061315a57506131588582613650565b155b1561316d576000809350935050506131ae565b6131778686612fd0565b925060006131848461357b565b9050600061319188611072565b90508015806131a757506131a5818361455d565b155b9550505050505b9250929050565b60008060006131c485856130fd565b90925090508180156121165750600254600160801b900460ff90811691161015949350505050565b6001600160a01b038216600090815260096020526040902061094390826134d5565b60008060008381526012602052604090205460ff166006811115613234576132346138cc565b1492915050565b600060ff198216816110c982613666565b6000806105ba83613666565b60008381526007602052604081209061326f612fb1565b6001600160401b0316815260208101919091526040016000205460ff16156132c3576040517f3edef7db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600480546040517f94c8919d0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116916394c8919d9161330d9186918691016145c1565b602060405180830381865afa15801561332a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061334e9190613de1565b613384576040517ffcd03a4700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083815260076020526040812060019161339d612fb1565b6001600160401b031681526020808201929092526040908101600020805460ff19169315159390931790925590518481527f3b989d183b84b02259d7c14b34a9c9eb0fccb4c355a920d25e581e25aef4993d91016117d4565b60008381526010602052604081206001600160401b0380841690851610613449576040517f56607cb000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160e081018252600183015481526002830154602082015260038301549181019190915260048201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c08201526134b890613631565b6134c2858561453e565b6001600160401b03166121169190613d8d565b60006105ba83836136d8565b600081815260018301602052604081205461352857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611059565b506000611059565b60006105ba83836134e1565b600061105961354a836137d2565b6137df565b60006110597f00000000000000000000000000000000000000000000000000000000000000008361466b565b60008060ff831661358d600143613d7a565b6135979190613d7a565b40905060008190036135ab576135ab613e03565b60408051602081018390520160405160208183030381529060405280519060200120915050919050565b60608160000180548060200260200160405190810160405280929190818152602001828054801561362557602002820191906000526020600020905b815481526020019060010190808311613611575b50505050509050919050565b600081608001516001600160401b031682602001516110599190613d8d565b60006001600160401b03808416908316106105ba565b7fff00000000000000000000000000000000000000000000000000000000000000811660015b60208110156106de57600891821c916136a6908290613d8d565b83901b7fff0000000000000000000000000000000000000000000000000000000000000016919091179060010161368c565b600081815260018301602052604081205480156137c15760006136fc600183613d7a565b855490915060009061371090600190613d7a565b905081811461377557600086600001828154811061373057613730614528565b906000526020600020015490508087600001848154811061375357613753614528565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061378657613786614699565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611059565b6000915050611059565b5092915050565b6000611059826001613d5b565b60006110597f000000000000000000000000000000000000000000000000000000000000000083614571565b60408051610100810182526000608080830182815260a080850184905260c0850184905260e08501849052908452845190810185528281526020808201849052818601849052606080830185905292820192909252818401528351908101845290815290918201905b8152600060209091015290565b508054600082559060005260206000209081019061127991905b808211156138af576000815560010161389b565b5090565b6000602082840312156138c557600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b60208101600583106138f6576138f66138cc565b91905290565b6001600160a01b038116811461127957600080fd5b60008060006060848603121561392657600080fd5b833592506020840135613938816138fc565b91506040840135613948816138fc565b809150509250925092565b6001600160401b038116811461127957600080fd5b803561397381613953565b919050565b6000806040838503121561398b57600080fd5b82359150602083013561399d81613953565b809150509250929050565b600061010082840312156106de57600080fd5b600080600061014084860312156139d157600080fd5b8335925060208401356139e381613953565b91506139f285604086016139a8565b90509250925092565b602080825282518282018190526000918401906040840190835b81811015613a33578351835260209384019390920191600101613a15565b509095945050505050565b6000815180845260005b81811015613a6457602081850181015186830182015201613a48565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160401b0381511682526001600160401b03602082015116602083015260ff604082015116604083015260ff60608201511660608301526000608082015160a060808501526110c960a0850182613a3e565b602081526000825160ff815116602084015260ff602082015116604084015260ff604082015116606084015260ff606082015116608084015250602083015160e060a0840152613b2d610100840182613a84565b90506040840151613b4460c08501825160ff169052565b5060608401516001600160401b03811660e0850152509392505050565b600060208284031215613b7357600080fd5b81356001600160401b03811115613b8957600080fd5b820161016081850312156105ba57600080fd5b6000815160408452613bb16040850182613a3e565b602093840151949093019390935250919050565b6001600160a01b038151168252600060208201518051602085015260208101516040850152604081015160608501526001600160401b0360608201511660808501526001600160401b0360808201511660a08501526001600160401b0360a08201511660c08501526001600160401b0360c08201511660e0850152506040820151610160610100850152613c5d610160850182613b9c565b90506060830151613c7a6101208601826001600160401b03169052565b5060808301516101408501528091505092915050565b602081526000825160406020840152613cac6060840182613bc5565b90506001600160401b0360208501511660408401528091505092915050565b60208101600783106138f6576138f66138cc565b60008060408385031215613cf257600080fd5b82359150602083013561399d816138fc565b6000806101208385031215613d1857600080fd5b82359150613d2984602085016139a8565b90509250929050565b6020815260006105ba6020830184613bc5565b634e487b7160e01b600052601160045260246000fd5b6001600160401b03818116838216019081111561105957611059613d45565b8181038181111561105957611059613d45565b808202811582820484141761105957611059613d45565b634e487b7160e01b600052601260045260246000fd5b600082613dc957613dc9613da4565b500490565b8082018082111561105957611059613d45565b600060208284031215613df357600080fd5b815180151581146105ba57600080fd5b634e487b7160e01b600052600160045260246000fd5b61ffff828116828216039081111561105957611059613d45565b600181811c90821680613e4757607f821691505b6020821081036106de57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715613e9f57613e9f613e67565b60405290565b60405160a081016001600160401b0381118282101715613e9f57613e9f613e67565b60405160e081016001600160401b0381118282101715613e9f57613e9f613e67565b604051601f8201601f191681016001600160401b0381118282101715613f1157613f11613e67565b604052919050565b600060408284031215613f2b57600080fd5b613f33613e7d565b905081356001600160401b03811115613f4b57600080fd5b8201601f81018413613f5c57600080fd5b80356001600160401b03811115613f7557613f75613e67565b613f88601f8201601f1916602001613ee9565b818152856020838501011115613f9d57600080fd5b81602084016020830137600060209282018301528352928301359282019290925292915050565b6000813603610160811215613fd857600080fd5b613fe0613ea5565b8335613feb816138fc565b815260e0601f1983011215613fff57600080fd5b614007613ec7565b6020858101358252604080870135918301919091526060860135908201529150608084013561403581613953565b606083015260a084013561404881613953565b608083015260c084013561405b81613953565b60a083015260e084013561406e81613953565b60c08301526020810191909152610100830135906001600160401b0382111561409657600080fd5b6140a236838601613f19565b60408201526140b46101208501613968565b6060820152610140939093013560808401525090919050565b6000602082840312156140df57600080fd5b81356105ba816138fc565b6000602082840312156140fc57600080fd5b81356105ba81613953565b60008235603e1983360301811261411d57600080fd5b9190910192915050565b6000808335601e1984360301811261413e57600080fd5b8301803591506001600160401b0382111561415857600080fd5b6020019150368190038213156131ae57600080fd5b6000813561105981613953565b601f82111561094357806000526020600020601f840160051c810160208510156141a15750805b601f840160051c820191505b818110156141c157600081556001016141ad565b5050505050565b8135601e198336030181126141dc57600080fd5b820180356001600160401b03811180156141f557600080fd5b81360360208401131561420757600080fd5b6000905061421f826142198654613e33565b8661417a565b80601f8311600181146142545782841561423c5750848201602001355b600019600386901b1c1916600185901b1786556142b3565b600086815260209020601f19851690845b8281101561428757602085890181013583559485019460019092019101614265565b50858210156142a75760001960f88760031b161c19602085890101351681555b505060018460011b0186555b505050505060209190910135600190910155565b81356142d2816138fc565b815473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039190911617815560208201356001820155604082013560028201556060820135600382015560048101608083013561432a81613953565b815467ffffffffffffffff19166001600160401b0382161782555060a083013561435381613953565b81546fffffffffffffffff0000000000000000191660409190911b6fffffffffffffffff0000000000000000161781556143c761439260c0850161416d565b825467ffffffffffffffff60801b191660809190911b77ffffffffffffffff0000000000000000000000000000000016178255565b61441f6143d660e0850161416d565b825477ffffffffffffffffffffffffffffffffffffffffffffffff1660c09190911b7fffffffffffffffff00000000000000000000000000000000000000000000000016178255565b5061443a614431610100840184614107565b600583016141c8565b61446b61444a610120840161416d565b600783016001600160401b0382166001600160401b03198254161781555050565b6101409190910135600890910155565b83815282356020808301919091528301356040808301919091528301356060808301919091526101208201908401356144b381613953565b6001600160401b03811660808401525060808401356144d181613953565b6001600160401b03811660a08401525060a08401356144ef81613953565b6001600160401b03811660c08401525061450b60c08501613968565b6001600160401b0390811660e084015283166101008301526110c9565b634e487b7160e01b600052603260045260246000fd5b6001600160401b03828116828216039081111561105957611059613d45565b60008261456c5761456c613da4565b500690565b6001600160401b0381811683821602908116908181146137cb576137cb613d45565b60006001600160401b038316806145ac576145ac613da4565b806001600160401b0384160691505092915050565b8235815260208084013590820152600061012082016145f0604084016040870180358252602090810135910152565b61460a608084016080870180358252602090810135910152565b61462460c0840160c0870180358252602090810135910152565b610120610100840152835190819052602084019061014084019060005b8181101561465f578351835260209384019390920191600101614641565b50909695505050505050565b60006001600160401b0383168061468457614684613da4565b806001600160401b0384160491505092915050565b634e487b7160e01b600052603160045260246000fdfea26469706673582212206e940e8cb5c54ce6f6606e3b8f89e55d51c501d4017adbc3ac7b30357327730d64736f6c634300081c0033"; + public static string BYTECODE = "0x60c060405234801561001057600080fd5b50604051614f04380380614f0483398101604081905261002f9161053b565b602083015180516040850151516001805460ff191660ff90921691909117905582906001600160401b03811660000361007b5760405163015536c760e51b815260040160405180910390fd5b6001600160401b031660805261010043116100a9576040516338f5f66160e11b815260040160405180910390fd5b8151600280546020850151604086015160608701516001600160401b039586166001600160801b0319909416939093176801000000000000000095909216949094021761ffff60801b1916600160801b60ff9485160260ff60881b191617600160881b9390911692909202919091178155608083015183919060039061012f90826106d9565b5050600480546001600160a01b0319166001600160a01b0393841617905550831660a05250825151606460ff909116111561017d576040516302bd816360e41b815260040160405180910390fd5b606483600001516040015160ff1611156101aa576040516354e5e0ab60e11b815260040160405180910390fd5b825160408101516020909101516064916101c391610797565b60ff1611156101e5576040516317ff9d0f60e21b815260040160405180910390fd5b82518051600b805460208085015160408087015160609788015160ff90811663010000000263ff0000001992821662010000029290921663ffff0000199482166101000261ffff1990971698821698909817959095179290921695909517178355808801518051600c80549383015196830151978301518516600160881b0260ff60881b1998909516600160801b029790971661ffff60801b196001600160401b0397881668010000000000000000026001600160801b031990951697909216969096179290921791909116939093171783556080820151869391929190600d906102d090826106d9565b50505060408201515160038201805460ff191660ff909216919091179055606090910151600490910180546001600160401b0319166001600160401b03909216919091179055506107c8915050565b634e487b7160e01b600052604160045260246000fd5b60405160a081016001600160401b03811182821017156103575761035761031f565b60405290565b604051608081016001600160401b03811182821017156103575761035761031f565b604051601f8201601f191681016001600160401b03811182821017156103a7576103a761031f565b604052919050565b805160ff811681146103c057600080fd5b919050565b80516001600160401b03811681146103c057600080fd5b600060a082840312156103ee57600080fd5b6103f6610335565b9050610401826103c5565b815261040f602083016103c5565b6020820152610420604083016103af565b6040820152610431606083016103af565b606082015260808201516001600160401b0381111561044f57600080fd5b8201601f8101841361046057600080fd5b80516001600160401b038111156104795761047961031f565b61048c601f8201601f191660200161037f565b8181528560208385010111156104a157600080fd5b60005b828110156104c0576020818501810151838301820152016104a4565b5060006020838301015280608085015250505092915050565b6000602082840312156104eb57600080fd5b604051602081016001600160401b038111828210171561050d5761050d61031f565b60405290508061051c836103af565b905292915050565b80516001600160a01b03811681146103c057600080fd5b60008060006060848603121561055057600080fd5b83516001600160401b0381111561056657600080fd5b840180860360e081121561057957600080fd5b61058161035d565b608082121561058f57600080fd5b61059761035d565b91506105a2836103af565b82526105b0602084016103af565b60208301526105c1604084016103af565b60408301526105d2606084016103af565b60608301529081526080820151906001600160401b038211156105f457600080fd5b610600888385016103dc565b60208201526106128860a085016104d9565b604082015261062360c084016103c5565b6060820152945061063991505060208501610524565b915061064760408501610524565b90509250925092565b600181811c9082168061066457607f821691505b60208210810361068457634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156106d457806000526020600020601f840160051c810160208510156106b15750805b601f840160051c820191505b818110156106d157600081556001016106bd565b50505b505050565b81516001600160401b038111156106f2576106f261031f565b610706816107008454610650565b8461068a565b6020601f82116001811461073a57600083156107225750848201515b600019600385901b1c1916600184901b1784556106d1565b600084815260208120601f198516915b8281101561076a578785015182556020948501946001909201910161074a565b50848210156107885786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b60ff81811683821602908116908181146107c157634e487b7160e01b600052601160045260246000fd5b5092915050565b60805160a0516146df610825600039600081816104bf01528181610f7001528181612019015281816125cd0152818161267d0152818161280c015281816128bc0152612ce601526000818161355001526137e001526146df6000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80636e2b54ee116100f9578063c0cc4add11610097578063e8aa0a0711610071578063e8aa0a0714610461578063f752196b14610474578063fb1e61ca1461049d578063fc0c546a146104bd57600080fd5b8063c0cc4add14610428578063c5d433511461043b578063d02bbe331461044e57600080fd5b8063a29c29a4116100d3578063a29c29a4146103b2578063a3a0807e146103c5578063b396dc79146103e8578063be5cdc481461040857600080fd5b80636e2b54ee146103845780639777b72c1461039757806399b6da0c1461039f57600080fd5b8063329b5a0b1161016657806351a766421161014057806351a76642146103035780635da73835146103165780636b00c8cf1461032b5780636c70bee91461036f57600080fd5b8063329b5a0b14610298578063458d2bf1146102cb5780634641dce6146102de57600080fd5b806312827602116101a2578063128276021461022e5780631d873c1b14610241578063237d84821461025457806326d6f8341461026757600080fd5b806302fa8e65146101c957806305b90773146101f95780630aefaabe14610219575b600080fd5b6101dc6101d73660046138ad565b6104e3565b6040516001600160401b0390911681526020015b60405180910390f35b61020c6102073660046138ad565b6105c1565b6040516101f091906138dc565b61022c61022736600461390b565b6106e4565b005b61022c61023c366004613972565b610877565b61022c61024f3660046139b5565b610948565b61022c610262366004613972565b610dfa565b61028a6102753660046138ad565b60009081526012602052604090206003015490565b6040519081526020016101f0565b6101dc6102a63660046138ad565b600090815260116020526040902060020154600160c01b90046001600160401b031690565b61028a6102d93660046138ad565b611046565b6102f16102ec3660046138ad565b61105f565b60405160ff90911681526020016101f0565b61028a6103113660046138ad565b611072565b61031e6110d1565b6040516101f091906139f5565b6103576103393660046138ad565b6000908152601260205260409020600401546001600160a01b031690565b6040516001600160a01b0390911681526020016101f0565b6103776110f8565b6040516101f09190613ad3565b61022c6103923660046138ad565b61126f565b61031e61127c565b61022c6103ad366004613b5b565b61129b565b61022c6103c03660046138ad565b6117e1565b6103d86103d33660046138ad565b611833565b60405190151581526020016101f0565b6103fb6103f63660046138ad565b61186f565b6040516101f09190613c8a565b61041b6104163660046138ad565b611b51565b6040516101f09190613cc5565b6103d86104363660046138ad565b611c1f565b61022c610449366004613cd9565b611c32565b6103d861045c366004613972565b6120b3565b61022c61046f366004613cfe565b61211f565b6101dc6104823660046138ad565b6000908152600660205260409020546001600160401b031690565b6104b06104ab3660046138ad565b612298565b6040516101f09190613d2c565b7f0000000000000000000000000000000000000000000000000000000000000000610357565b6000806104ef836105c1565b90506000816004811115610505576105056138c6565b148061052257506001816004811115610520576105206138c6565b145b1561054e575050600090815260116020526040902060020154600160801b90046001600160401b031690565b6002816004811115610562576105626138c6565b0361058e575050600090815260116020526040902060020154600160c01b90046001600160401b031690565b6000838152601160205260409020600201546105ba90600160801b90046001600160401b0316426124ae565b9392505050565b60008181526010602052604081205482906001600160a01b03166105f857604051635eeb253d60e11b815260040160405180910390fd5b600083815260116020526040812090815460ff16600481111561061d5761061d6138c6565b14801561065c5750600084815260116020526040902060020154600160c01b90046001600160401b03166001600160401b0316426001600160401b0316115b1561066b5760029250506106de565b6001815460ff166004811115610683576106836138c6565b14806106a457506000815460ff1660048111156106a2576106a26138c6565b145b80156106c8575060028101546001600160401b03600160801b909104811642909116115b156106d75760039250506106de565b5460ff1691505b50919050565b826000808281526012602052604090205460ff166006811115610709576107096138c6565b0361072757604051638b41ec7f60e01b815260040160405180910390fd5b600084815260126020526040902060048101546001600160a01b0316331461077b576040517f57a6f4e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061078686611b51565b9050600481600681111561079c5761079c6138c6565b036107d3576040517fc2cbf77700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028160068111156107e7576107e76138c6565b03610801576107fc82600101548787876124be565b61086f565b6005816006811115610815576108156138c6565b0361082a576107fc8260010154878787612707565b600381600681111561083e5761083e6138c6565b0361084d576107fc3387612950565b6001816006811115610861576108616138c6565b0361086f5761086f86612972565b505050505050565b61088182826120b3565b6108b7576040517f424a04ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108c38383612bca565b60008181526020819052604090209091506108de9033612c0f565b50600154600082815260208190526040902060ff909116906108ff90612c24565b03610943576040516001600160401b038316815283907fc8e6c955744189a19222ec226b72ac1435d88d5745252dac56e6f679f64c037a9060200160405180910390a25b505050565b60008381526010602052604090205483906001600160a01b031661097f57604051635eeb253d60e11b815260040160405180910390fd5b600084815260106020526040902060048101546001600160401b03908116908516106109d7576040517f3b920b8800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006109e38686612bca565b60008181526020819052604090209091506109fe9033612c2e565b610a34576040517fd651ce1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152601260209081526040808320600181018a90556002810180546fffffffffffffffff00000000000000001916600160401b6001600160401b038c1602179055898452601190925282209091610a8d84611b51565b6006811115610a9e57610a9e6138c6565b14158015610ac657506006610ab284611b51565b6006811115610ac357610ac36138c6565b14155b15610afd576040517fff556acf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60048201805473ffffffffffffffffffffffffffffffffffffffff1916331790556002820180546001600160401b03421667ffffffffffffffff19909116179055610b6e83600090815260056020526040902080546001600160401b03421667ffffffffffffffff19909116179055565b610b78838761211f565b60028101805460019190600090610b999084906001600160401b0316613d55565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550610bde888360020160009054906101000a90046001600160401b0316612c50565b816001016000828254610bf19190613d74565b90915550506040805160e081018252600186015481526002860154602082015260038601549181019190915260048501546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c08201526000908190610c6a90612c7f565b90506006610c7786611b51565b6006811115610c8857610c886138c6565b03610cbb57600b54606490610ca09060ff1683613d87565b610caa9190613db4565b610cb49082613d74565b9150610cbf565b8091505b610cc93383612c9e565b8160136000016000828254610cde9190613dc8565b9091555050600384018190556004840154610d02906001600160a01b031686612d72565b835460ff191660011784556040516001600160401b038a1681528a907f8f301470a994578b52323d625dfbf827ca5208c81747d3459be7b8867baec3ec9060200160405180910390a2600486015460028401546001600160401b039081169116148015610d8457506000835460ff166004811115610d8257610d826138c6565b145b15610dee57825460ff191660011783556002830180546001600160401b034216600160401b026fffffffffffffffff0000000000000000199091161790556040518a907f85e1543bf2f84fe80c6badbce3648c8539ad1df4d2b3d822938ca0538be727e690600090a25b50505050505050505050565b6001610e0583611b51565b6006811115610e1657610e166138c6565b14610e4d576040517fae9dcffd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e578282612d94565b6000828152601260209081526040808320600180820154855260108452828520600b54845160e08101865292820154835260028201549583019590955260038101549382019390935260048301546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0820152909391926064916201000090910460ff1690610efa90612c7f565b610f049190613d87565b610f0e9190613db4565b600b54909150600090606490610f2e906301000000900460ff1684613d87565b610f389190613db4565b90508060136001016000828254610f4f9190613dc8565b909155505060405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015610fc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe59190613ddb565b610ff157610ff1613dfd565b818460030160008282546110059190613d74565b9091555050600b5460008781526006602052604090205461010090910460ff16906001600160401b03166001600160401b03161061086f5761086f86612972565b600061105982611054612fab565b612fb6565b92915050565b60006110598261106d612fab565b612fca565b60008181526012602090815260408083206001810154845260109092528220600c54610100906110ac90600160801b900460ff1682613e13565b60018301546110bf9161ffff1690613d87565b6110c99190613db4565b949350505050565b336000908152600a602052604090206060906110f3906110f09061305c565b90565b905090565b611100613805565b604080516101008082018352600b805460ff8082166080808701918252948304821660a080880191909152620100008404831660c08801526301000000909304821660e0870152855285519182018652600c80546001600160401b038082168552600160401b820416602085810191909152600160801b82048416988501989098527101000000000000000000000000000000000090049091166060830152600d80549596939593870194929391928401916111bb90613e2d565b80601f01602080910402602001604051908101604052809291908181526020018280546111e790613e2d565b80156112345780601f1061120957610100808354040283529160200191611234565b820191906000526020600020905b81548152906001019060200180831161121757829003601f168201915b5050509190925250505081526040805160208181018352600385015460ff1682528301526004909201546001600160401b0316910152919050565b6112798133611c32565b50565b3360009081526009602052604090206060906110f3906110f09061305c565b60006112ae6112a983613fbe565b613069565b9050336112be60208401846140c7565b6001600160a01b0316146112e5576040516334c69e3160e11b815260040160405180910390fd5b6000818152601060205260409020546001600160a01b031615611334576040517ffc7d069000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611346610140830161012084016140e4565b6001600160401b0316158061138d575061136660e0830160c084016140e4565b6001600160401b0316611381610140840161012085016140e4565b6001600160401b031610155b156113c4576040517fdf63f61a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113d460a08301608084016140e4565b6001600160401b0316600003611416576040517f535ed2be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61142660a08301608084016140e4565b6001600160401b0316611440610100840160e085016140e4565b6001600160401b03161115611481576040517fb9551ab100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61149160e0830160c084016140e4565b6001600160401b03166000036114d3576040517f090a5ecd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020820135600003611511576040517f6aba7aae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606082013560000361154f576040517ffb7df0c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604082013560000361158d576040517f47ba51c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61159b610100830183614101565b6115a59080614121565b90506000036115e0576040517f86f8cf9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f546001600160401b03166115fc60e0840160c085016140e4565b6001600160401b0316111561163d576040517f1267b3f200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152601060205260409020829061165782826142c1565b5061166a905060e0830160c084016140e4565b6116749042613d55565b600082815260116020526040902060020180546001600160401b0392909216600160801b0267ffffffffffffffff60801b199092169190911790556116c1610140830161012084016140e4565b6116cb9042613d55565b600082815260116020908152604090912060020180546001600160401b0393909316600160c01b0277ffffffffffffffffffffffffffffffffffffffffffffffff9093169290921790915561172c90611726908401846140c7565b82613099565b600061173f61173a84613fbe565b6130bb565b600083815260116020526040812060010182905560138054929350839290919061176a908490613dc8565b9091555061177a90503382612c9e565b6000828152601160209081526040918290206002015491517f1bf9c457accf8703dbf7cdf1b58c2f74ddf2e525f98155c70b3d318d74609bd8926117d492869290880191600160c01b90046001600160401b031690614475565b60405180910390a1505050565b806000808281526012602052604090205460ff166006811115611806576118066138c6565b0361182457604051638b41ec7f60e01b815260040160405180910390fd5b61182f8233336106e4565b5050565b600080600061184984611844612fab565b6130f7565b90925090508180156110c95750600254600160801b900460ff9081169116109392505050565b6118f2604051806040016040528061386e6040805160a080820183526000808352835160e081018552818152602080820183905281860183905260608083018490526080830184905293820183905260c0820183905280850191909152845180860186529283528201529091820190815260006020820181905260409091015290565b816000808281526012602052604090205460ff166006811115611917576119176138c6565b0361193557604051638b41ec7f60e01b815260040160405180910390fd5b60008381526012602052604090206119c6604051806040016040528061386e6040805160a080820183526000808352835160e081018552818152602080820183905281860183905260608083018490526080830184905293820183905260c0820183905280850191909152845180860186529283528201529091820190815260006020820181905260409091015290565b600180830154600090815260106020908152604091829020825160a0808201855282546001600160a01b03168252845160e08101865295830154865260028301548685015260038301548686015260048301546001600160401b038082166060890152600160401b820481166080890152600160801b8204811692880192909252600160c01b90041660c0860152918201939093528151808301835260058401805492949385019282908290611a7b90613e2d565b80601f0160208091040260200160405190810160405280929190818152602001828054611aa790613e2d565b8015611af45780601f10611ac957610100808354040283529160200191611af4565b820191906000526020600020905b815481529060010190602001808311611ad757829003601f168201915b50505091835250506001919091015460209182015290825260078301546001600160401b0390811683830152600890930154604090920191909152918352600290930154600160401b900490921691810191909152915050919050565b600081815260126020526040812060018101548203611b735750600092915050565b6000611b8282600101546105c1565b90506004825460ff166006811115611b9c57611b9c6138c6565b03611bab575060049392505050565b6002816004811115611bbf57611bbf6138c6565b03611bce575060059392505050565b6003816004811115611be257611be26138c6565b03611bf1575060029392505050565b6004816004811115611c0557611c056138c6565b03611c14575060039392505050565b505460ff1692915050565b600061105982611c2d612fab565b6131af565b60008281526010602052604090205482906001600160a01b0316611c6957604051635eeb253d60e11b815260040160405180910390fd5b6000838152601060209081526040808320601190925290912081546001600160a01b03163314611cac576040516334c69e3160e11b815260040160405180910390fd5b6000611cb7866105c1565b90506002816004811115611ccd57611ccd6138c6565b14158015611ced57506004816004811115611cea57611cea6138c6565b14155b8015611d0b57506003816004811115611d0857611d086138c6565b14155b15611d42576040517fc00b5b5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160010154600003611d80576040517fbd8bdd9400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002816004811115611d9457611d946138c6565b03611e3257815460ff1916600217825560405186907ff903f4774c7bd27355f9d7fcbc382b079b164a697a44ac5d95267a4c3cb3bb2290600090a2600086815260116020526040902060020154611dfc908790600160c01b90046001600160401b0316612c50565b6002830154611e1491906001600160401b0316613d87565b826001016000828254611e279190613dc8565b90915550611fbf9050565b6004816004811115611e4657611e466138c6565b03611fb3576040805160a0808201835285546001600160a01b03168252825160e08101845260018701548152600287015460208281019190915260038801548286015260048801546001600160401b038082166060850152600160401b820481166080850152600160801b8204811694840194909452600160c01b900490921660c08201529082015281518083018352600586018054611fa994889390850192909182908290611ef590613e2d565b80601f0160208091040260200160405190810160405280929190818152602001828054611f2190613e2d565b8015611f6e5780601f10611f4357610100808354040283529160200191611f6e565b820191906000526020600020905b815481529060010190602001808311611f5157829003601f168201915b50505091835250506001919091015460209182015290825260078301546001600160401b0316908201526008909101546040909101526130bb565b6001830155611fbf565b815460ff191660031782555b8254611fd4906001600160a01b0316876131e6565b600182015460148054829190600090611fee908490613dc8565b909155505060405163a9059cbb60e01b81526001600160a01b038781166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015612062573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120869190613ddb565b6120a357604051637c2ccffd60e11b815260040160405180910390fd5b5050600060019091015550505050565b600033816120c18585612bca565b90506120cc81613208565b80156120f55750600154600082815260208190526040902060ff909116906120f390612c24565b105b8015612116575060008181526020819052604090206121149083612c2e565b155b95945050505050565b6000828152601260209081526040808320600101548084526010909252909120546001600160a01b031661216657604051635eeb253d60e11b815260040160405180910390fd5b600083815260126020526040902060048101546001600160a01b031633146121ba576040517fce351b9400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600181015460009081526010602052604080822081516003808252608082019093529092918160200160208202803683370190505090506122026121fd87611046565b613235565b8160008151811061221557612215614522565b6020908102919091010152600682015461222e90613246565b8160018151811061224157612241614522565b6020026020010181815250508260020160089054906101000a90046001600160401b03166001600160401b03168160028151811061228157612281614522565b60200260200101818152505061086f868683613252565b61230d6040805160a080820183526000808352835160e081018552818152602080820183905281860183905260608083018490526080830184905293820183905260c0820183905280850191909152845180860186529283528201529091820190815260006020820181905260409091015290565b60008281526010602052604090205482906001600160a01b031661234457604051635eeb253d60e11b815260040160405180910390fd5b600083815260106020908152604091829020825160a0808201855282546001600160a01b03168252845160e0810186526001840154815260028401548186015260038401548187015260048401546001600160401b038082166060840152600160401b820481166080840152600160801b8204811693830193909352600160c01b900490911660c082015292810192909252825180840184526005820180549394929392850192829082906123f890613e2d565b80601f016020809104026020016040519081016040528092919081815260200182805461242490613e2d565b80156124715780601f1061244657610100808354040283529160200191612471565b820191906000526020600020905b81548152906001019060200180831161245457829003601f168201915b50505091835250506001919091015460209182015290825260078301546001600160401b0316908201526008909101546040909101529392505050565b60008282188284100282186105ba565b60008481526010602052604090205484906001600160a01b03166124f557604051635eeb253d60e11b815260040160405180910390fd5b600085815260116020908152604080832060108352818420815460ff19166003178255888552601290935292208154612537906001600160a01b0316896131e6565b600481015461254f906001600160a01b031688612950565b600281015460009061256b908a906001600160401b0316612c50565b600383015490915061257d8183613dc8565b6014805460009061258f908490613dc8565b90915550508254600490849060ff1916600183021790555060405163a9059cbb60e01b81526001600160a01b038981166004830152602482018490527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015612616573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061263a9190613ddb565b61265757604051637c2ccffd60e11b815260040160405180910390fd5b60405163a9059cbb60e01b81526001600160a01b038881166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af11580156126c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ea9190613ddb565b610dee57604051637c2ccffd60e11b815260040160405180910390fd5b60008481526010602052604090205484906001600160a01b031661273e57604051635eeb253d60e11b815260040160405180910390fd5b60008481526012602052604090206004810154612764906001600160a01b031686612950565b60028101546000906127aa9088906001600160401b03166127a5826000908152601160205260409020600201546001600160401b03600160c01b9091041690565b6133f0565b60038301549091506127bc8183613dc8565b601480546000906127ce908490613dc8565b90915550508254600490849060ff1916600183021790555060405163a9059cbb60e01b81526001600160a01b038781166004830152602482018490527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015612855573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128799190613ddb565b61289657604051637c2ccffd60e11b815260040160405180910390fd5b60405163a9059cbb60e01b81526001600160a01b038681166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015612905573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129299190613ddb565b61294657604051637c2ccffd60e11b815260040160405180910390fd5b5050505050505050565b6001600160a01b0382166000908152600a6020526040902061094390826134cf565b600081815260126020908152604080832060018101548085526011909352922060028301546129ab9083906001600160401b0316612c50565b8160010160008282546129be9190613dc8565b909155505060048301546129db906001600160a01b031685612950565b60008481526020819052604081209081816129f6828261387b565b5050845460ff1916600617855550506002808401805467ffffffffffffffff1916905560006003850181905560048501805473ffffffffffffffffffffffffffffffffffffffff19169055908201805460019290612a5e9084906001600160401b0316614538565b82546101009290920a6001600160401b038181021990931691831602179091556002850154604051600160401b90910490911681528391507f33ba8f7627565d89f7ada2a6b81ea532b7aa9b11e91a78312d6e1fca0bfcd1dc9060200160405180910390a26000848152600660205260409020805467ffffffffffffffff19169055600082815260106020526040812060028301546004820154919291612b11916001600160401b039081169116614538565b60048301546001600160401b039182169250600160c01b90041681118015612b4e57506001835460ff166004811115612b4c57612b4c6138c6565b145b1561086f57825460ff19166004178355612b69600142614538565b6002840180546001600160401b0392909216600160801b0267ffffffffffffffff60801b1990921691909117905560405184907f4769361a442504ecaf038f35e119bcccdd5e42096b24c09e3c17fd17c6684c0290600090a2505050505050565b60008282604051602001612bf19291909182526001600160401b0316602082015260400190565b60405160208183030381529060405280519060200120905092915050565b60006105ba836001600160a01b0384166134db565b6000611059825490565b6001600160a01b038116600090815260018301602052604081205415156105ba565b6000828152601160205260408120600201546105ba9084908490600160801b90046001600160401b03166133f0565b600081608001516001600160401b031682604001516110599190613d87565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152306024830181905260448301849052917f0000000000000000000000000000000000000000000000000000000000000000909116906323b872dd906064016020604051808303816000875af1158015612d31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d559190613ddb565b61094357604051637c2ccffd60e11b815260040160405180910390fd5b6001600160a01b0382166000908152600a60205260409020610943908261352a565b6000612d9f82613536565b6001600160401b03169050428110612de3576040517f6b4b1a4e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600254612e0090600160401b90046001600160401b031682613dc8565b4210612e38576040517fde55698e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526007602090815260408083206001600160401b038616845290915290205460ff1615612e94576040517efab7d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e9e83836131af565b612ed4576040517fd3ffa66b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526008602090815260408083206001600160401b038616845290915290205460ff1615612f31576040517f98e7e55100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526008602090815260408083206001600160401b038087168552908352818420805460ff1916600190811790915587855260069093529083208054929390929091612f8291859116613d55565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550505050565b60006110f342613549565b60006105ba612fc58484612fca565b613575565b600080612fd961010043614557565b600254909150600090610100906130089071010000000000000000000000000000000000900460ff168661456b565b613012919061458d565b6001600160401b03169050600061302b61010087614557565b905060006101008261303d8587613dc8565b6130479190613dc8565b6130519190614557565b979650505050505050565b606060006105ba836135cf565b60008160405160200161307c9190613d2c565b604051602081830303815290604052805190602001209050919050565b6001600160a01b0382166000908152600960205260409020610943908261352a565b60006130ca826020015161362b565b602083015160a08101516060909101516130e4919061456b565b6001600160401b03166110599190613d87565b600080600061310585611b51565b6000868152600560205260408120549192509061312a906001600160401b0316613549565b90506001826006811115613140576131406138c6565b1415806131545750613152858261364a565b155b15613167576000809350935050506131a8565b6131718686612fca565b9250600061317e84613575565b9050600061318b88611072565b90508015806131a1575061319f8183614557565b155b9550505050505b9250929050565b60008060006131be85856130f7565b90925090508180156121165750600254600160801b900460ff90811691161015949350505050565b6001600160a01b038216600090815260096020526040902061094390826134cf565b60008060008381526012602052604090205460ff16600681111561322e5761322e6138c6565b1492915050565b600060ff198216816110c982613660565b6000806105ba83613660565b600083815260076020526040812090613269612fab565b6001600160401b0316815260208101919091526040016000205460ff16156132bd576040517f3edef7db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600480546040517f94c8919d0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116916394c8919d916133079186918691016145bb565b602060405180830381865afa158015613324573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133489190613ddb565b61337e576040517ffcd03a4700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000838152600760205260408120600191613397612fab565b6001600160401b031681526020808201929092526040908101600020805460ff19169315159390931790925590518481527f3b989d183b84b02259d7c14b34a9c9eb0fccb4c355a920d25e581e25aef4993d91016117d4565b60008381526010602052604081206001600160401b0380841690851610613443576040517f56607cb000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160e081018252600183015481526002830154602082015260038301549181019190915260048201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c08201526134b29061362b565b6134bc8585614538565b6001600160401b03166121169190613d87565b60006105ba83836136d2565b600081815260018301602052604081205461352257508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611059565b506000611059565b60006105ba83836134db565b6000611059613544836137cc565b6137d9565b60006110597f000000000000000000000000000000000000000000000000000000000000000083614665565b60008060ff8316613587600143613d74565b6135919190613d74565b40905060008190036135a5576135a5613dfd565b60408051602081018390520160405160208183030381529060405280519060200120915050919050565b60608160000180548060200260200160405190810160405280929190818152602001828054801561361f57602002820191906000526020600020905b81548152602001906001019080831161360b575b50505050509050919050565b600081608001516001600160401b031682602001516110599190613d87565b60006001600160401b03808416908316106105ba565b7fff00000000000000000000000000000000000000000000000000000000000000811660015b60208110156106de57600891821c916136a0908290613d87565b83901b7fff00000000000000000000000000000000000000000000000000000000000000169190911790600101613686565b600081815260018301602052604081205480156137bb5760006136f6600183613d74565b855490915060009061370a90600190613d74565b905080821461376f57600086600001828154811061372a5761372a614522565b906000526020600020015490508087600001848154811061374d5761374d614522565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061378057613780614693565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611059565b6000915050611059565b5092915050565b6000611059826001613d55565b60006110597f00000000000000000000000000000000000000000000000000000000000000008361456b565b60408051610100810182526000608080830182815260a080850184905260c0850184905260e08501849052908452845190810185528281526020808201849052818601849052606080830185905292820192909252818401528351908101845290815290918201905b8152600060209091015290565b508054600082559060005260206000209081019061127991905b808211156138a95760008155600101613895565b5090565b6000602082840312156138bf57600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b60208101600583106138f0576138f06138c6565b91905290565b6001600160a01b038116811461127957600080fd5b60008060006060848603121561392057600080fd5b833592506020840135613932816138f6565b91506040840135613942816138f6565b809150509250925092565b6001600160401b038116811461127957600080fd5b803561396d8161394d565b919050565b6000806040838503121561398557600080fd5b8235915060208301356139978161394d565b809150509250929050565b600061010082840312156106de57600080fd5b600080600061014084860312156139cb57600080fd5b8335925060208401356139dd8161394d565b91506139ec85604086016139a2565b90509250925092565b602080825282518282018190526000918401906040840190835b81811015613a2d578351835260209384019390920191600101613a0f565b509095945050505050565b6000815180845260005b81811015613a5e57602081850181015186830182015201613a42565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160401b0381511682526001600160401b03602082015116602083015260ff604082015116604083015260ff60608201511660608301526000608082015160a060808501526110c960a0850182613a38565b602081526000825160ff815116602084015260ff602082015116604084015260ff604082015116606084015260ff606082015116608084015250602083015160e060a0840152613b27610100840182613a7e565b90506040840151613b3e60c08501825160ff169052565b5060608401516001600160401b03811660e0850152509392505050565b600060208284031215613b6d57600080fd5b81356001600160401b03811115613b8357600080fd5b820161016081850312156105ba57600080fd5b6000815160408452613bab6040850182613a38565b602093840151949093019390935250919050565b6001600160a01b038151168252600060208201518051602085015260208101516040850152604081015160608501526001600160401b0360608201511660808501526001600160401b0360808201511660a08501526001600160401b0360a08201511660c08501526001600160401b0360c08201511660e0850152506040820151610160610100850152613c57610160850182613b96565b90506060830151613c746101208601826001600160401b03169052565b5060808301516101408501528091505092915050565b602081526000825160406020840152613ca66060840182613bbf565b90506001600160401b0360208501511660408401528091505092915050565b60208101600783106138f0576138f06138c6565b60008060408385031215613cec57600080fd5b823591506020830135613997816138f6565b6000806101208385031215613d1257600080fd5b82359150613d2384602085016139a2565b90509250929050565b6020815260006105ba6020830184613bbf565b634e487b7160e01b600052601160045260246000fd5b6001600160401b03818116838216019081111561105957611059613d3f565b8181038181111561105957611059613d3f565b808202811582820484141761105957611059613d3f565b634e487b7160e01b600052601260045260246000fd5b600082613dc357613dc3613d9e565b500490565b8082018082111561105957611059613d3f565b600060208284031215613ded57600080fd5b815180151581146105ba57600080fd5b634e487b7160e01b600052600160045260246000fd5b61ffff828116828216039081111561105957611059613d3f565b600181811c90821680613e4157607f821691505b6020821081036106de57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715613e9957613e99613e61565b60405290565b60405160a081016001600160401b0381118282101715613e9957613e99613e61565b60405160e081016001600160401b0381118282101715613e9957613e99613e61565b604051601f8201601f191681016001600160401b0381118282101715613f0b57613f0b613e61565b604052919050565b600060408284031215613f2557600080fd5b613f2d613e77565b905081356001600160401b03811115613f4557600080fd5b8201601f81018413613f5657600080fd5b80356001600160401b03811115613f6f57613f6f613e61565b613f82601f8201601f1916602001613ee3565b818152856020838501011115613f9757600080fd5b81602084016020830137600060209282018301528352928301359282019290925292915050565b6000813603610160811215613fd257600080fd5b613fda613e9f565b8335613fe5816138f6565b815260e0601f1983011215613ff957600080fd5b614001613ec1565b6020858101358252604080870135918301919091526060860135908201529150608084013561402f8161394d565b606083015260a08401356140428161394d565b608083015260c08401356140558161394d565b60a083015260e08401356140688161394d565b60c08301526020810191909152610100830135906001600160401b0382111561409057600080fd5b61409c36838601613f13565b60408201526140ae6101208501613962565b6060820152610140939093013560808401525090919050565b6000602082840312156140d957600080fd5b81356105ba816138f6565b6000602082840312156140f657600080fd5b81356105ba8161394d565b60008235603e1983360301811261411757600080fd5b9190910192915050565b6000808335601e1984360301811261413857600080fd5b8301803591506001600160401b0382111561415257600080fd5b6020019150368190038213156131a857600080fd5b600081356110598161394d565b601f82111561094357806000526020600020601f840160051c8101602085101561419b5750805b601f840160051c820191505b818110156141bb57600081556001016141a7565b5050505050565b8135601e198336030181126141d657600080fd5b820180356001600160401b03811180156141ef57600080fd5b81360360208401131561420157600080fd5b60009050614219826142138654613e2d565b86614174565b80601f83116001811461424e578284156142365750848201602001355b600019600386901b1c1916600185901b1786556142ad565b600086815260209020601f19851690845b828110156142815760208589018101358355948501946001909201910161425f565b50858210156142a15760001960f88760031b161c19602085890101351681555b505060018460011b0186555b505050505060209190910135600190910155565b81356142cc816138f6565b815473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03919091161781556020820135600182015560408201356002820155606082013560038201556004810160808301356143248161394d565b815467ffffffffffffffff19166001600160401b0382161782555060a083013561434d8161394d565b81546fffffffffffffffff0000000000000000191660409190911b6fffffffffffffffff0000000000000000161781556143c161438c60c08501614167565b825467ffffffffffffffff60801b191660809190911b77ffffffffffffffff0000000000000000000000000000000016178255565b6144196143d060e08501614167565b825477ffffffffffffffffffffffffffffffffffffffffffffffff1660c09190911b7fffffffffffffffff00000000000000000000000000000000000000000000000016178255565b5061443461442b610100840184614101565b600583016141c2565b6144656144446101208401614167565b600783016001600160401b0382166001600160401b03198254161781555050565b6101409190910135600890910155565b83815282356020808301919091528301356040808301919091528301356060808301919091526101208201908401356144ad8161394d565b6001600160401b03811660808401525060808401356144cb8161394d565b6001600160401b03811660a08401525060a08401356144e98161394d565b6001600160401b03811660c08401525061450560c08501613962565b6001600160401b0390811660e084015283166101008301526110c9565b634e487b7160e01b600052603260045260246000fd5b6001600160401b03828116828216039081111561105957611059613d3f565b60008261456657614566613d9e565b500690565b6001600160401b0381811683821602908116908181146137c5576137c5613d3f565b60006001600160401b038316806145a6576145a6613d9e565b806001600160401b0384160691505092915050565b8235815260208084013590820152600061012082016145ea604084016040870180358252602090810135910152565b614604608084016080870180358252602090810135910152565b61461e60c0840160c0870180358252602090810135910152565b610120610100840152835190819052602084019061014084019060005b8181101561465957835183526020938401939092019160010161463b565b50909695505050505050565b60006001600160401b0383168061467e5761467e613d9e565b806001600160401b0384160491505092915050565b634e487b7160e01b600052603160045260246000fdfea26469706673582212206b0b03ebd7dbbc3b4661bc03194b4eeec33ef1f5a894e376e036a4d4e8a6908f64736f6c634300081c0033"; public MarketplaceDeploymentBase() : base(BYTECODE) { } public MarketplaceDeploymentBase(string byteCode) : base(byteCode) { } [Parameter("tuple", "config", 1)] From 577f9be76c58e34c311119e002b5e648e09acc4a Mon Sep 17 00:00:00 2001 From: Ben Date: Tue, 3 Jun 2025 11:34:34 +0200 Subject: [PATCH 07/15] updates host addresses --- Tools/TraceContract/Config.cs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Tools/TraceContract/Config.cs b/Tools/TraceContract/Config.cs index f9a955f3..3b49a77a 100644 --- a/Tools/TraceContract/Config.cs +++ b/Tools/TraceContract/Config.cs @@ -39,16 +39,16 @@ public Dictionary LogReplacements = new() { - { "0xa1f988fBa23EFd5fA36F4c1a2D1E3c83e25bee4e", "codex 01" }, - { "0xa26a91310F9f2987AA7e0b1ca70e5C474c88ed34", "codex 02" }, - { "0x0CDC9d2D375300C46E13a679cD9eA5299A4FAc74", "codex 03" }, - { "0x7AF1a49A4a52e4bCe3789Ce3d43ff8AD8c8F2118", "codex 04" }, - { "0xfbbEB320c6c775f6565c7bcC732b2813Dd6E0cd3", "codex 05" }, - { "0x4A904CA0998B643eb42d4ae190a5821A4ac51E68", "codex 06" }, - { "0x2b8Ea47d0966B26DEec485c0fCcF0D1A8b52A0e8", "codex 07" }, - { "0x78F90A61d9a2aA93B61A7503Cc2177fFEF379021", "codex 08" }, - { "0xE7EEb996B3c817cEd03d10cd64A1325DA33D92e7", "codex 09" }, - { "0xD25C7609e97F40b66E74c0FcEbeA06D09423CC7e", "codex 10" } + { "0x3620ec38d88e9f0cf7feceebf97864f27676aa3e", "codex-01" }, + { "0xd80dc50af2a826f2cddc13840d05aed4ee6536c3", "codex-02" }, + { "0x2d1cd0fa0c7e0d29e7b2482b9ff87d5e7b76b905", "codex-03" }, + { "0xd47063bb6e56c9a6edb7612d33ad7d49eeb55ee0", "codex-04" }, + { "0x069da63e29b12a3828984379fcbd7dd3ee3774aa", "codex-05" }, + { "0x43fcceb2a9ce4761ccaa4c9f8d390c7581c190aa", "codex-06" }, + { "0x1a30cef06dbbf8ec25062e4e8d22e8df292f5054", "codex-07" }, + { "0xe169b5dcbae9a7392072323aaf5a677a33d67ecd", "codex-08" }, + { "0x21f7428619ef9f53addc5dab6723c822a8a96b42", "codex-09" }, + { "0xf9bd20512de2d5ca0dcfd8d3cd08a2821917797a", "codex-10" } }; public string GetElasticSearchUsername() From 6ad001c74462412277447c77b29b403cda189b42 Mon Sep 17 00:00:00 2001 From: Ben Date: Tue, 3 Jun 2025 13:34:39 +0200 Subject: [PATCH 08/15] Applies logreplace to console output as well --- Tools/TraceContract/Output.cs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Tools/TraceContract/Output.cs b/Tools/TraceContract/Output.cs index 255bbf3e..be89d3f6 100644 --- a/Tools/TraceContract/Output.cs +++ b/Tools/TraceContract/Output.cs @@ -28,21 +28,22 @@ namespace TraceContract public Output(ILog log, Input input, Config config) { + this.input = input; + this.config = config; + folder = config.GetOuputFolder(); Directory.CreateDirectory(folder); var filename = Path.Combine(folder, $"contract_{input.PurchaseId}"); var fileLog = new FileLog(filename); + log.Log($"Logging to '{filename}'"); + + this.log = new LogSplitter(fileLog, log); foreach (var pair in config.LogReplacements) { - fileLog.AddStringReplace(pair.Key, pair.Value); - fileLog.AddStringReplace(pair.Key.ToLowerInvariant(), pair.Value); + this.log.AddStringReplace(pair.Key, pair.Value); + this.log.AddStringReplace(pair.Key.ToLowerInvariant(), pair.Value); } - - log.Log($"Logging to '{filename}'"); - this.log = new LogSplitter(fileLog, log); - this.input = input; - this.config = config; } public void LogRequestCreated(RequestEvent requestEvent) From 7e694a61277910639f4cfd7bdf1d0277246a38cf Mon Sep 17 00:00:00 2001 From: Ben Date: Wed, 4 Jun 2025 12:46:25 +0200 Subject: [PATCH 09/15] wip --- ProjectPlugins/CodexClient/CodexClient.csproj | 1 - .../CodexClient/StoragePurchaseContract.cs | 17 +++++++++++------ .../ChainMonitor/PeriodMonitor.cs | 7 +++++-- .../Marketplace/Customizations.cs | 6 ++++++ 4 files changed, 22 insertions(+), 9 deletions(-) diff --git a/ProjectPlugins/CodexClient/CodexClient.csproj b/ProjectPlugins/CodexClient/CodexClient.csproj index 17a76836..cc417a9e 100644 --- a/ProjectPlugins/CodexClient/CodexClient.csproj +++ b/ProjectPlugins/CodexClient/CodexClient.csproj @@ -30,7 +30,6 @@ - diff --git a/ProjectPlugins/CodexClient/StoragePurchaseContract.cs b/ProjectPlugins/CodexClient/StoragePurchaseContract.cs index cbac1bff..7b37899a 100644 --- a/ProjectPlugins/CodexClient/StoragePurchaseContract.cs +++ b/ProjectPlugins/CodexClient/StoragePurchaseContract.cs @@ -1,5 +1,4 @@ using CodexClient.Hooks; -using CodexContractsPlugin.Marketplace; using Logging; using Newtonsoft.Json; using Utils; @@ -15,7 +14,13 @@ namespace CodexClient void WaitForStorageContractSubmitted(); void WaitForStorageContractStarted(); void WaitForStorageContractFinished(); - void WaitForContractFailed(MarketplaceConfig config); + void WaitForContractFailed(IMarketplaceConfigInput config); + } + + public interface IMarketplaceConfigInput + { + int MaxNumberOfSlashes { get; } + TimeSpan PeriodDuration { get; } } public class StoragePurchaseContract : IStoragePurchaseContract @@ -100,7 +105,7 @@ namespace CodexClient AssertDuration(SubmittedToFinished, timeout, nameof(SubmittedToFinished)); } - public void WaitForContractFailed(MarketplaceConfig config) + public void WaitForContractFailed(IMarketplaceConfigInput config) { if (!contractStartedUtc.HasValue) { @@ -122,10 +127,10 @@ namespace CodexClient WaitForStorageContractState(timeout, StoragePurchaseState.Failed); } - private TimeSpan TimeNeededToFailEnoughProofsToFreeASlot(MarketplaceConfig config) + private TimeSpan TimeNeededToFailEnoughProofsToFreeASlot(IMarketplaceConfigInput config) { - var numMissedProofsRequiredForFree = config.Collateral.MaxNumberOfSlashes; - var timePerProof = TimeSpan.FromSeconds(config.Proofs.Period); + var numMissedProofsRequiredForFree = config.MaxNumberOfSlashes; + var timePerProof = config.PeriodDuration; var result = timePerProof * (numMissedProofsRequiredForFree + 1); // Times 2! diff --git a/ProjectPlugins/CodexContractsPlugin/ChainMonitor/PeriodMonitor.cs b/ProjectPlugins/CodexContractsPlugin/ChainMonitor/PeriodMonitor.cs index 603e1b4f..f140dd97 100644 --- a/ProjectPlugins/CodexContractsPlugin/ChainMonitor/PeriodMonitor.cs +++ b/ProjectPlugins/CodexContractsPlugin/ChainMonitor/PeriodMonitor.cs @@ -1,15 +1,18 @@ -using Utils; +using Logging; +using Utils; namespace CodexContractsPlugin.ChainMonitor { public class PeriodMonitor { + private readonly ILog log; private readonly ICodexContracts contracts; private readonly List reports = new List(); private ulong? currentPeriod = null; - public PeriodMonitor(ICodexContracts contracts) + public PeriodMonitor(ILog log, ICodexContracts contracts) { + this.log = log; this.contracts = contracts; } diff --git a/ProjectPlugins/CodexContractsPlugin/Marketplace/Customizations.cs b/ProjectPlugins/CodexContractsPlugin/Marketplace/Customizations.cs index c69dab8b..fea7ad87 100644 --- a/ProjectPlugins/CodexContractsPlugin/Marketplace/Customizations.cs +++ b/ProjectPlugins/CodexContractsPlugin/Marketplace/Customizations.cs @@ -2,6 +2,7 @@ using BlockchainUtils; using Nethereum.Hex.HexConvertors.Extensions; using Newtonsoft.Json; +using CodexClient; using Utils; namespace CodexContractsPlugin.Marketplace @@ -92,5 +93,10 @@ namespace CodexContractsPlugin.Marketplace [JsonIgnore] public BlockTimeEntry Block { get; set; } } + + public partial class MarketplaceConfig : IMarketplaceConfigInput + { + + } } #pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. From 3822d5e2ebba6640309c26d2a925ffa10a853091 Mon Sep 17 00:00:00 2001 From: Ben Date: Wed, 4 Jun 2025 12:49:10 +0200 Subject: [PATCH 10/15] wip --- .../Utils/MarketplaceAutoBootstrapDistTest.cs | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/Tests/CodexReleaseTests/Utils/MarketplaceAutoBootstrapDistTest.cs b/Tests/CodexReleaseTests/Utils/MarketplaceAutoBootstrapDistTest.cs index 72442098..26c47600 100644 --- a/Tests/CodexReleaseTests/Utils/MarketplaceAutoBootstrapDistTest.cs +++ b/Tests/CodexReleaseTests/Utils/MarketplaceAutoBootstrapDistTest.cs @@ -103,6 +103,30 @@ namespace CodexReleaseTests.Utils return host; } + public void AssertHostAvailabilitiesAreEmpty(IEnumerable hosts) + { + var retry = GetAvailabilitySpaceAssertRetry(); + retry.Run(() => + { + foreach (var host in hosts) + { + AssertHostAvailabilitiesAreEmpty(host); + } + }); + } + + private void AssertHostAvailabilitiesAreEmpty(ICodexNode host) + { + var availabilities = host.Marketplace.GetAvailabilities(); + foreach (var a in availabilities) + { + if (a.FreeSpace.SizeInBytes != a.TotalSpace.SizeInBytes) + { + throw new Exception(nameof(AssertHostAvailabilitiesAreEmpty) + $" free: {a.FreeSpace} total: {a.TotalSpace}"); + } + } + } + public void AssertTstBalance(ICodexNode node, TestToken expectedBalance, string message) { AssertTstBalance(node.EthAddress, expectedBalance, message); @@ -160,6 +184,15 @@ namespace CodexReleaseTests.Utils failFast: false); } + private Retry GetAvailabilitySpaceAssertRetry() + { + return new Retry("AssertAvailabilitySpace", + maxTimeout: HostBlockTTL * 3, + sleepAfterFail: TimeSpan.FromSeconds(10.0), + onFail: f => { }, + failFast: false); + } + private TestToken GetTstBalance(ICodexNode node) { return GetContracts().GetTestTokenBalance(node); From 64d271c809d294895d3e9c89d69e4dc344533264 Mon Sep 17 00:00:00 2001 From: Ben Date: Wed, 4 Jun 2025 12:56:26 +0200 Subject: [PATCH 11/15] merge finished --- .../CodexContractsPlugin/ChainMonitor/ChainState.cs | 2 +- .../Marketplace/Customizations.cs | 3 ++- .../Utils/MarketplaceAutoBootstrapDistTest.cs | 11 +++++++++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/ProjectPlugins/CodexContractsPlugin/ChainMonitor/ChainState.cs b/ProjectPlugins/CodexContractsPlugin/ChainMonitor/ChainState.cs index 5dfa0114..1f260c7d 100644 --- a/ProjectPlugins/CodexContractsPlugin/ChainMonitor/ChainState.cs +++ b/ProjectPlugins/CodexContractsPlugin/ChainMonitor/ChainState.cs @@ -47,7 +47,7 @@ namespace CodexContractsPlugin.ChainMonitor handler = changeHandler; this.doProofPeriodMonitoring = doProofPeriodMonitoring; TotalSpan = new TimeRange(startUtc, startUtc); - PeriodMonitor = new PeriodMonitor(contracts); + PeriodMonitor = new PeriodMonitor(log, contracts); } public TimeRange TotalSpan { get; private set; } diff --git a/ProjectPlugins/CodexContractsPlugin/Marketplace/Customizations.cs b/ProjectPlugins/CodexContractsPlugin/Marketplace/Customizations.cs index fea7ad87..1ac64325 100644 --- a/ProjectPlugins/CodexContractsPlugin/Marketplace/Customizations.cs +++ b/ProjectPlugins/CodexContractsPlugin/Marketplace/Customizations.cs @@ -96,7 +96,8 @@ namespace CodexContractsPlugin.Marketplace public partial class MarketplaceConfig : IMarketplaceConfigInput { - + public int MaxNumberOfSlashes => this.Collateral.MaxNumberOfSlashes; + public TimeSpan PeriodDuration => TimeSpan.FromSeconds(this.Proofs.Period); } } #pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. diff --git a/Tests/CodexReleaseTests/Utils/MarketplaceAutoBootstrapDistTest.cs b/Tests/CodexReleaseTests/Utils/MarketplaceAutoBootstrapDistTest.cs index 26c47600..5c429fee 100644 --- a/Tests/CodexReleaseTests/Utils/MarketplaceAutoBootstrapDistTest.cs +++ b/Tests/CodexReleaseTests/Utils/MarketplaceAutoBootstrapDistTest.cs @@ -53,11 +53,15 @@ namespace CodexReleaseTests.Utils protected abstract ByteSize HostAvailabilitySize { get; } protected abstract TimeSpan HostAvailabilityMaxDuration { get; } protected virtual bool MonitorChainState { get; } = true; + protected TimeSpan HostBlockTTL { get; } = TimeSpan.FromMinutes(1.0); public ICodexNodeGroup StartHosts() { var hosts = StartCodex(NumberOfHosts, s => s .WithName("host") + .WithBlockTTL(HostBlockTTL) + .WithBlockMaintenanceNumber(1000) + .WithBlockMaintenanceInterval(HostBlockTTL / 2) .EnableMarketplace(GetGeth(), GetContracts(), m => m .WithInitial(StartingBalanceEth.Eth(), StartingBalanceTST.Tst()) .AsStorageNode() @@ -70,7 +74,7 @@ namespace CodexReleaseTests.Utils AssertTstBalance(host, StartingBalanceTST.Tst(), nameof(StartHosts)); AssertEthBalance(host, StartingBalanceEth.Eth(), nameof(StartHosts)); - host.Marketplace.MakeStorageAvailable(new StorageAvailability( + host.Marketplace.MakeStorageAvailable(new CreateStorageAvailability( totalSpace: HostAvailabilitySize, maxDuration: HostAvailabilityMaxDuration, minPricePerBytePerSecond: 1.TstWei(), @@ -84,6 +88,9 @@ namespace CodexReleaseTests.Utils { var host = StartCodex(s => s .WithName("singlehost") + .WithBlockTTL(HostBlockTTL) + .WithBlockMaintenanceNumber(1000) + .WithBlockMaintenanceInterval(HostBlockTTL / 2) .EnableMarketplace(GetGeth(), GetContracts(), m => m .WithInitial(StartingBalanceEth.Eth(), StartingBalanceTST.Tst()) .AsStorageNode() @@ -94,7 +101,7 @@ namespace CodexReleaseTests.Utils AssertTstBalance(host, StartingBalanceTST.Tst(), nameof(StartOneHost)); AssertEthBalance(host, StartingBalanceEth.Eth(), nameof(StartOneHost)); - host.Marketplace.MakeStorageAvailable(new StorageAvailability( + host.Marketplace.MakeStorageAvailable(new CreateStorageAvailability( totalSpace: HostAvailabilitySize, maxDuration: HostAvailabilityMaxDuration, minPricePerBytePerSecond: 1.TstWei(), From 44d14e589a62a4a6ff13bfc6ade1961d726d4df4 Mon Sep 17 00:00:00 2001 From: Ben Date: Wed, 4 Jun 2025 15:51:01 +0200 Subject: [PATCH 12/15] This is working --- .../CodexContractsPlugin/CodexContractsAccess.cs | 1 - .../CodexContractsPlugin/Marketplace/Marketplace.cs | 13 ++++++++++++- ProjectPlugins/CodexPlugin/CodexDockerImage.cs | 2 +- Tests/CodexReleaseTests/MarketTests/FailTest.cs | 12 +++++++++--- 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/ProjectPlugins/CodexContractsPlugin/CodexContractsAccess.cs b/ProjectPlugins/CodexContractsPlugin/CodexContractsAccess.cs index 40ee264e..ef8d2003 100644 --- a/ProjectPlugins/CodexContractsPlugin/CodexContractsAccess.cs +++ b/ProjectPlugins/CodexContractsPlugin/CodexContractsAccess.cs @@ -146,7 +146,6 @@ namespace CodexContractsPlugin public void WaitUntilNextPeriod() { - log.Log("Waiting until next proof period..."); var now = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); var periodSeconds = (int)Deployment.Config.Proofs.Period; var secondsLeft = now % periodSeconds; diff --git a/ProjectPlugins/CodexContractsPlugin/Marketplace/Marketplace.cs b/ProjectPlugins/CodexContractsPlugin/Marketplace/Marketplace.cs index dba71566..2f2c8ede 100644 --- a/ProjectPlugins/CodexContractsPlugin/Marketplace/Marketplace.cs +++ b/ProjectPlugins/CodexContractsPlugin/Marketplace/Marketplace.cs @@ -15,7 +15,7 @@ namespace CodexContractsPlugin.Marketplace public class MarketplaceDeploymentBase : ContractDeploymentMessage { - public static string BYTECODE = "0x60c060405234801561001057600080fd5b50604051614f41380380614f4183398101604081905261002f9161053b565b602083015180516040850151516001805460ff191660ff90921691909117905582906001600160401b03811660000361007b5760405163015536c760e51b815260040160405180910390fd5b6001600160401b031660805261010043116100a9576040516338f5f66160e11b815260040160405180910390fd5b8151600280546020850151604086015160608701516001600160401b039586166001600160801b0319909416939093176801000000000000000095909216949094021761ffff60801b1916600160801b60ff9485160260ff60881b191617600160881b9390911692909202919091178155608083015183919060039061012f90826106d9565b5050600480546001600160a01b0319166001600160a01b0393841617905550831660a05250825151606460ff909116111561017d576040516302bd816360e41b815260040160405180910390fd5b606483600001516040015160ff1611156101aa576040516354e5e0ab60e11b815260040160405180910390fd5b825160408101516020909101516064916101c391610797565b60ff1611156101e5576040516317ff9d0f60e21b815260040160405180910390fd5b82518051600b805460208085015160408087015160609788015160ff90811663010000000263ff0000001992821662010000029290921663ffff0000199482166101000261ffff1990971698821698909817959095179290921695909517178355808801518051600c80549383015196830151978301518516600160881b0260ff60881b1998909516600160801b029790971661ffff60801b196001600160401b0397881668010000000000000000026001600160801b031990951697909216969096179290921791909116939093171783556080820151869391929190600d906102d090826106d9565b50505060408201515160038201805460ff191660ff909216919091179055606090910151600490910180546001600160401b0319166001600160401b03909216919091179055506107c8915050565b634e487b7160e01b600052604160045260246000fd5b60405160a081016001600160401b03811182821017156103575761035761031f565b60405290565b604051608081016001600160401b03811182821017156103575761035761031f565b604051601f8201601f191681016001600160401b03811182821017156103a7576103a761031f565b604052919050565b805160ff811681146103c057600080fd5b919050565b80516001600160401b03811681146103c057600080fd5b600060a082840312156103ee57600080fd5b6103f6610335565b9050610401826103c5565b815261040f602083016103c5565b6020820152610420604083016103af565b6040820152610431606083016103af565b606082015260808201516001600160401b0381111561044f57600080fd5b8201601f8101841361046057600080fd5b80516001600160401b038111156104795761047961031f565b61048c601f8201601f191660200161037f565b8181528560208385010111156104a157600080fd5b60005b828110156104c0576020818501810151838301820152016104a4565b5060006020838301015280608085015250505092915050565b6000602082840312156104eb57600080fd5b604051602081016001600160401b038111828210171561050d5761050d61031f565b60405290508061051c836103af565b905292915050565b80516001600160a01b03811681146103c057600080fd5b60008060006060848603121561055057600080fd5b83516001600160401b0381111561056657600080fd5b840180860360e081121561057957600080fd5b61058161035d565b608082121561058f57600080fd5b61059761035d565b91506105a2836103af565b82526105b0602084016103af565b60208301526105c1604084016103af565b60408301526105d2606084016103af565b60608301529081526080820151906001600160401b038211156105f457600080fd5b610600888385016103dc565b60208201526106128860a085016104d9565b604082015261062360c084016103c5565b6060820152945061063991505060208501610524565b915061064760408501610524565b90509250925092565b600181811c9082168061066457607f821691505b60208210810361068457634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156106d457806000526020600020601f840160051c810160208510156106b15750805b601f840160051c820191505b818110156106d157600081556001016106bd565b50505b505050565b81516001600160401b038111156106f2576106f261031f565b610706816107008454610650565b8461068a565b6020601f82116001811461073a57600083156107225750848201515b600019600385901b1c1916600184901b1784556106d1565b600084815260208120601f198516915b8281101561076a578785015182556020948501946001909201910161074a565b50848210156107885786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b60ff81811683821602908116908181146107c157634e487b7160e01b600052601160045260246000fd5b5092915050565b60805160a05161471c610825600039600081816104bf01528181610f700152818161201901528181612603015281816126b301528181612842015281816128f20152612d1401526000818161355d015261384f015261471c6000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80636e2b54ee116100f9578063c0cc4add11610097578063e8aa0a0711610071578063e8aa0a0714610461578063f752196b14610474578063fb1e61ca1461049d578063fc0c546a146104bd57600080fd5b8063c0cc4add14610428578063c5d433511461043b578063d02bbe331461044e57600080fd5b8063a29c29a4116100d3578063a29c29a4146103b2578063a3a0807e146103c5578063b396dc79146103e8578063be5cdc481461040857600080fd5b80636e2b54ee146103845780639777b72c1461039757806399b6da0c1461039f57600080fd5b8063329b5a0b1161016657806351a766421161014057806351a76642146103035780635da73835146103165780636b00c8cf1461032b5780636c70bee91461036f57600080fd5b8063329b5a0b14610298578063458d2bf1146102cb5780634641dce6146102de57600080fd5b806312827602116101a2578063128276021461022e5780631d873c1b14610241578063237d84821461025457806326d6f8341461026757600080fd5b806302fa8e65146101c957806305b90773146101f95780630aefaabe14610219575b600080fd5b6101dc6101d73660046138ea565b6104e3565b6040516001600160401b0390911681526020015b60405180910390f35b61020c6102073660046138ea565b6105c1565b6040516101f09190613919565b61022c610227366004613948565b6106e4565b005b61022c61023c3660046139af565b610877565b61022c61024f3660046139f2565b610948565b61022c6102623660046139af565b610dfa565b61028a6102753660046138ea565b60009081526012602052604090206003015490565b6040519081526020016101f0565b6101dc6102a63660046138ea565b600090815260116020526040902060020154600160c01b90046001600160401b031690565b61028a6102d93660046138ea565b611046565b6102f16102ec3660046138ea565b61105f565b60405160ff90911681526020016101f0565b61028a6103113660046138ea565b611072565b61031e6110d1565b6040516101f09190613a32565b6103576103393660046138ea565b6000908152601260205260409020600401546001600160a01b031690565b6040516001600160a01b0390911681526020016101f0565b6103776110f8565b6040516101f09190613b10565b61022c6103923660046138ea565b61126f565b61031e61127c565b61022c6103ad366004613b98565b61129b565b61022c6103c03660046138ea565b6117e1565b6103d86103d33660046138ea565b611833565b60405190151581526020016101f0565b6103fb6103f63660046138ea565b61186f565b6040516101f09190613cc7565b61041b6104163660046138ea565b611b51565b6040516101f09190613d02565b6103d86104363660046138ea565b611c1f565b61022c610449366004613d16565b611c32565b6103d861045c3660046139af565b6120b3565b61022c61046f366004613d3b565b612155565b6101dc6104823660046138ea565b6000908152600660205260409020546001600160401b031690565b6104b06104ab3660046138ea565b6122ce565b6040516101f09190613d69565b7f0000000000000000000000000000000000000000000000000000000000000000610357565b6000806104ef836105c1565b9050600081600481111561050557610505613903565b14806105225750600181600481111561052057610520613903565b145b1561054e575050600090815260116020526040902060020154600160801b90046001600160401b031690565b600281600481111561056257610562613903565b0361058e575050600090815260116020526040902060020154600160c01b90046001600160401b031690565b6000838152601160205260409020600201546105ba90600160801b90046001600160401b0316426124e4565b9392505050565b60008181526010602052604081205482906001600160a01b03166105f857604051635eeb253d60e11b815260040160405180910390fd5b600083815260116020526040812090815460ff16600481111561061d5761061d613903565b14801561065c5750600084815260116020526040902060020154600160c01b90046001600160401b03166001600160401b0316426001600160401b0316115b1561066b5760029250506106de565b6001815460ff16600481111561068357610683613903565b14806106a457506000815460ff1660048111156106a2576106a2613903565b145b80156106c8575060028101546001600160401b03600160801b909104811642909116115b156106d75760039250506106de565b5460ff1691505b50919050565b826000808281526012602052604090205460ff16600681111561070957610709613903565b0361072757604051638b41ec7f60e01b815260040160405180910390fd5b600084815260126020526040902060048101546001600160a01b0316331461077b576040517f57a6f4e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061078686611b51565b9050600481600681111561079c5761079c613903565b036107d3576040517fc2cbf77700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028160068111156107e7576107e7613903565b03610801576107fc82600101548787876124f4565b61086f565b600581600681111561081557610815613903565b0361082a576107fc826001015487878761273d565b600381600681111561083e5761083e613903565b0361084d576107fc3387612986565b600181600681111561086157610861613903565b0361086f5761086f866129a8565b505050505050565b61088182826120b3565b6108b7576040517f424a04ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108c38383612bf8565b60008181526020819052604090209091506108de9033612c3d565b50600154600082815260208190526040902060ff909116906108ff90612c52565b03610943576040516001600160401b038316815283907fc8e6c955744189a19222ec226b72ac1435d88d5745252dac56e6f679f64c037a9060200160405180910390a25b505050565b60008381526010602052604090205483906001600160a01b031661097f57604051635eeb253d60e11b815260040160405180910390fd5b600084815260106020526040902060048101546001600160401b03908116908516106109d7576040517f3b920b8800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006109e38686612bf8565b60008181526020819052604090209091506109fe9033612c5c565b610a34576040517fd651ce1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152601260209081526040808320600181018a90556002810180546fffffffffffffffff00000000000000001916600160401b6001600160401b038c1602179055898452601190925282209091610a8d84611b51565b6006811115610a9e57610a9e613903565b14158015610ac657506006610ab284611b51565b6006811115610ac357610ac3613903565b14155b15610afd576040517fff556acf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60048201805473ffffffffffffffffffffffffffffffffffffffff1916331790556002820180546001600160401b03421667ffffffffffffffff19909116179055610b6e83600090815260056020526040902080546001600160401b03421667ffffffffffffffff19909116179055565b610b788387612155565b60028101805460019190600090610b999084906001600160401b0316613d92565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550610bde888360020160009054906101000a90046001600160401b0316612c7e565b816001016000828254610bf19190613db1565b90915550506040805160e081018252600186015481526002860154602082015260038601549181019190915260048501546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c08201526000908190610c6a90612cad565b90506006610c7786611b51565b6006811115610c8857610c88613903565b03610cbb57600b54606490610ca09060ff1683613dc4565b610caa9190613df1565b610cb49082613db1565b9150610cbf565b8091505b610cc93383612ccc565b8160136000016000828254610cde9190613e05565b9091555050600384018190556004840154610d02906001600160a01b031686612da0565b835460ff191660011784556040516001600160401b038a1681528a907f8f301470a994578b52323d625dfbf827ca5208c81747d3459be7b8867baec3ec9060200160405180910390a2600486015460028401546001600160401b039081169116148015610d8457506000835460ff166004811115610d8257610d82613903565b145b15610dee57825460ff191660011783556002830180546001600160401b034216600160401b026fffffffffffffffff0000000000000000199091161790556040518a907f85e1543bf2f84fe80c6badbce3648c8539ad1df4d2b3d822938ca0538be727e690600090a25b50505050505050505050565b6001610e0583611b51565b6006811115610e1657610e16613903565b14610e4d576040517fae9dcffd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e578282612dc2565b6000828152601260209081526040808320600180820154855260108452828520600b54845160e08101865292820154835260028201549583019590955260038101549382019390935260048301546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0820152909391926064916201000090910460ff1690610efa90612cad565b610f049190613dc4565b610f0e9190613df1565b600b54909150600090606490610f2e906301000000900460ff1684613dc4565b610f389190613df1565b90508060136001016000828254610f4f9190613e05565b909155505060405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015610fc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe59190613e18565b610ff157610ff1613e3a565b818460030160008282546110059190613db1565b9091555050600b5460008781526006602052604090205461010090910460ff16906001600160401b03166001600160401b03161061086f5761086f866129a8565b600061105982611054612fd9565b612fe4565b92915050565b60006110598261106d612fd9565b612ff8565b60008181526012602090815260408083206001810154845260109092528220600c54610100906110ac90600160801b900460ff1682613e50565b60018301546110bf9161ffff1690613dc4565b6110c99190613df1565b949350505050565b336000908152600a602052604090206060906110f3906110f09061308a565b90565b905090565b611100613874565b604080516101008082018352600b805460ff8082166080808701918252948304821660a080880191909152620100008404831660c08801526301000000909304821660e0870152855285519182018652600c80546001600160401b038082168552600160401b820416602085810191909152600160801b82048416988501989098527101000000000000000000000000000000000090049091166060830152600d80549596939593870194929391928401916111bb90613e6a565b80601f01602080910402602001604051908101604052809291908181526020018280546111e790613e6a565b80156112345780601f1061120957610100808354040283529160200191611234565b820191906000526020600020905b81548152906001019060200180831161121757829003601f168201915b5050509190925250505081526040805160208181018352600385015460ff1682528301526004909201546001600160401b0316910152919050565b6112798133611c32565b50565b3360009081526009602052604090206060906110f3906110f09061308a565b60006112ae6112a983613ffb565b613097565b9050336112be6020840184614104565b6001600160a01b0316146112e5576040516334c69e3160e11b815260040160405180910390fd5b6000818152601060205260409020546001600160a01b031615611334576040517ffc7d069000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61134661014083016101208401614121565b6001600160401b0316158061138d575061136660e0830160c08401614121565b6001600160401b031661138161014084016101208501614121565b6001600160401b031610155b156113c4576040517fdf63f61a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113d460a0830160808401614121565b6001600160401b0316600003611416576040517f535ed2be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61142660a0830160808401614121565b6001600160401b0316611440610100840160e08501614121565b6001600160401b03161115611481576040517fb9551ab100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61149160e0830160c08401614121565b6001600160401b03166000036114d3576040517f090a5ecd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020820135600003611511576040517f6aba7aae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606082013560000361154f576040517ffb7df0c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604082013560000361158d576040517f47ba51c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61159b61010083018361413e565b6115a5908061415e565b90506000036115e0576040517f86f8cf9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f546001600160401b03166115fc60e0840160c08501614121565b6001600160401b0316111561163d576040517f1267b3f200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152601060205260409020829061165782826142fe565b5061166a905060e0830160c08401614121565b6116749042613d92565b600082815260116020526040902060020180546001600160401b0392909216600160801b0267ffffffffffffffff60801b199092169190911790556116c161014083016101208401614121565b6116cb9042613d92565b600082815260116020908152604090912060020180546001600160401b0393909316600160c01b0277ffffffffffffffffffffffffffffffffffffffffffffffff9093169290921790915561172c9061172690840184614104565b826130c7565b600061173f61173a84613ffb565b6130e9565b600083815260116020526040812060010182905560138054929350839290919061176a908490613e05565b9091555061177a90503382612ccc565b6000828152601160209081526040918290206002015491517f1bf9c457accf8703dbf7cdf1b58c2f74ddf2e525f98155c70b3d318d74609bd8926117d492869290880191600160c01b90046001600160401b0316906144b2565b60405180910390a1505050565b806000808281526012602052604090205460ff16600681111561180657611806613903565b0361182457604051638b41ec7f60e01b815260040160405180910390fd5b61182f8233336106e4565b5050565b600080600061184984611844612fd9565b613125565b90925090508180156110c95750600254600160801b900460ff9081169116109392505050565b6118f260405180604001604052806138dd6040805160a080820183526000808352835160e081018552818152602080820183905281860183905260608083018490526080830184905293820183905260c0820183905280850191909152845180860186529283528201529091820190815260006020820181905260409091015290565b816000808281526012602052604090205460ff16600681111561191757611917613903565b0361193557604051638b41ec7f60e01b815260040160405180910390fd5b60008381526012602052604090206119c660405180604001604052806138dd6040805160a080820183526000808352835160e081018552818152602080820183905281860183905260608083018490526080830184905293820183905260c0820183905280850191909152845180860186529283528201529091820190815260006020820181905260409091015290565b600180830154600090815260106020908152604091829020825160a0808201855282546001600160a01b03168252845160e08101865295830154865260028301548685015260038301548686015260048301546001600160401b038082166060890152600160401b820481166080890152600160801b8204811692880192909252600160c01b90041660c0860152918201939093528151808301835260058401805492949385019282908290611a7b90613e6a565b80601f0160208091040260200160405190810160405280929190818152602001828054611aa790613e6a565b8015611af45780601f10611ac957610100808354040283529160200191611af4565b820191906000526020600020905b815481529060010190602001808311611ad757829003601f168201915b50505091835250506001919091015460209182015290825260078301546001600160401b0390811683830152600890930154604090920191909152918352600290930154600160401b900490921691810191909152915050919050565b600081815260126020526040812060018101548203611b735750600092915050565b6000611b8282600101546105c1565b90506004825460ff166006811115611b9c57611b9c613903565b03611bab575060049392505050565b6002816004811115611bbf57611bbf613903565b03611bce575060059392505050565b6003816004811115611be257611be2613903565b03611bf1575060029392505050565b6004816004811115611c0557611c05613903565b03611c14575060039392505050565b505460ff1692915050565b600061105982611c2d612fd9565b6131dd565b60008281526010602052604090205482906001600160a01b0316611c6957604051635eeb253d60e11b815260040160405180910390fd5b6000838152601060209081526040808320601190925290912081546001600160a01b03163314611cac576040516334c69e3160e11b815260040160405180910390fd5b6000611cb7866105c1565b90506002816004811115611ccd57611ccd613903565b14158015611ced57506004816004811115611cea57611cea613903565b14155b8015611d0b57506003816004811115611d0857611d08613903565b14155b15611d42576040517fc00b5b5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160010154600003611d80576040517fbd8bdd9400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002816004811115611d9457611d94613903565b03611e3257815460ff1916600217825560405186907ff903f4774c7bd27355f9d7fcbc382b079b164a697a44ac5d95267a4c3cb3bb2290600090a2600086815260116020526040902060020154611dfc908790600160c01b90046001600160401b0316612c7e565b6002830154611e1491906001600160401b0316613dc4565b826001016000828254611e279190613e05565b90915550611fbf9050565b6004816004811115611e4657611e46613903565b03611fb3576040805160a0808201835285546001600160a01b03168252825160e08101845260018701548152600287015460208281019190915260038801548286015260048801546001600160401b038082166060850152600160401b820481166080850152600160801b8204811694840194909452600160c01b900490921660c08201529082015281518083018352600586018054611fa994889390850192909182908290611ef590613e6a565b80601f0160208091040260200160405190810160405280929190818152602001828054611f2190613e6a565b8015611f6e5780601f10611f4357610100808354040283529160200191611f6e565b820191906000526020600020905b815481529060010190602001808311611f5157829003601f168201915b50505091835250506001919091015460209182015290825260078301546001600160401b0316908201526008909101546040909101526130e9565b6001830155611fbf565b815460ff191660031782555b8254611fd4906001600160a01b031687613217565b600182015460148054829190600090611fee908490613e05565b909155505060405163a9059cbb60e01b81526001600160a01b038781166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015612062573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120869190613e18565b6120a357604051637c2ccffd60e11b815260040160405180910390fd5b5050600060019091015550505050565b600033816120c18585612bf8565b905060006120ce82611b51565b905060008160068111156120e4576120e4613903565b1480612101575060068160068111156120ff576120ff613903565b145b801561212a5750600154600083815260208190526040902060ff9091169061212890612c52565b105b801561214b575060008281526020819052604090206121499084612c5c565b155b9695505050505050565b6000828152601260209081526040808320600101548084526010909252909120546001600160a01b031661219c57604051635eeb253d60e11b815260040160405180910390fd5b600083815260126020526040902060048101546001600160a01b031633146121f0576040517fce351b9400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001810154600090815260106020526040808220815160038082526080820190935290929181602001602082028036833701905050905061223861223387611046565b613239565b8160008151811061224b5761224b61455f565b602090810291909101015260068201546122649061324a565b816001815181106122775761227761455f565b6020026020010181815250508260020160089054906101000a90046001600160401b03166001600160401b0316816002815181106122b7576122b761455f565b60200260200101818152505061086f868683613256565b6123436040805160a080820183526000808352835160e081018552818152602080820183905281860183905260608083018490526080830184905293820183905260c0820183905280850191909152845180860186529283528201529091820190815260006020820181905260409091015290565b60008281526010602052604090205482906001600160a01b031661237a57604051635eeb253d60e11b815260040160405180910390fd5b600083815260106020908152604091829020825160a0808201855282546001600160a01b03168252845160e0810186526001840154815260028401548186015260038401548187015260048401546001600160401b038082166060840152600160401b820481166080840152600160801b8204811693830193909352600160c01b900490911660c0820152928101929092528251808401845260058201805493949293928501928290829061242e90613e6a565b80601f016020809104026020016040519081016040528092919081815260200182805461245a90613e6a565b80156124a75780601f1061247c576101008083540402835291602001916124a7565b820191906000526020600020905b81548152906001019060200180831161248a57829003601f168201915b50505091835250506001919091015460209182015290825260078301546001600160401b0316908201526008909101546040909101529392505050565b60008282188284100282186105ba565b60008481526010602052604090205484906001600160a01b031661252b57604051635eeb253d60e11b815260040160405180910390fd5b600085815260116020908152604080832060108352818420815460ff1916600317825588855260129093529220815461256d906001600160a01b031689613217565b6004810154612585906001600160a01b031688612986565b60028101546000906125a1908a906001600160401b0316612c7e565b60038301549091506125b38183613e05565b601480546000906125c5908490613e05565b90915550508254600490849060ff1916600183021790555060405163a9059cbb60e01b81526001600160a01b038981166004830152602482018490527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af115801561264c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126709190613e18565b61268d57604051637c2ccffd60e11b815260040160405180910390fd5b60405163a9059cbb60e01b81526001600160a01b038881166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af11580156126fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127209190613e18565b610dee57604051637c2ccffd60e11b815260040160405180910390fd5b60008481526010602052604090205484906001600160a01b031661277457604051635eeb253d60e11b815260040160405180910390fd5b6000848152601260205260409020600481015461279a906001600160a01b031686612986565b60028101546000906127e09088906001600160401b03166127db826000908152601160205260409020600201546001600160401b03600160c01b9091041690565b6133f4565b60038301549091506127f28183613e05565b60148054600090612804908490613e05565b90915550508254600490849060ff1916600183021790555060405163a9059cbb60e01b81526001600160a01b038781166004830152602482018490527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af115801561288b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128af9190613e18565b6128cc57604051637c2ccffd60e11b815260040160405180910390fd5b60405163a9059cbb60e01b81526001600160a01b038681166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af115801561293b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061295f9190613e18565b61297c57604051637c2ccffd60e11b815260040160405180910390fd5b5050505050505050565b6001600160a01b0382166000908152600a6020526040902061094390826134d3565b600081815260126020908152604080832060018101548085526011909352922060028301546129e19083906001600160401b0316612c7e565b8160010160008282546129f49190613e05565b90915550506004830154612a11906001600160a01b031685612986565b6000848152602081905260409020612a28906134df565b825460ff191660061783556002808401805467ffffffffffffffff1916905560006003850181905560048501805473ffffffffffffffffffffffffffffffffffffffff19169055908201805460019290612a8c9084906001600160401b0316614575565b82546101009290920a6001600160401b038181021990931691831602179091556002850154604051600160401b90910490911681528391507f33ba8f7627565d89f7ada2a6b81ea532b7aa9b11e91a78312d6e1fca0bfcd1dc9060200160405180910390a26000848152600660205260409020805467ffffffffffffffff19169055600082815260106020526040812060028301546004820154919291612b3f916001600160401b039081169116614575565b60048301546001600160401b039182169250600160c01b90041681118015612b7c57506001835460ff166004811115612b7a57612b7a613903565b145b1561086f57825460ff19166004178355612b97600142614575565b6002840180546001600160401b0392909216600160801b0267ffffffffffffffff60801b1990921691909117905560405184907f4769361a442504ecaf038f35e119bcccdd5e42096b24c09e3c17fd17c6684c0290600090a2505050505050565b60008282604051602001612c1f9291909182526001600160401b0316602082015260400190565b60405160208183030381529060405280519060200120905092915050565b60006105ba836001600160a01b0384166134e8565b6000611059825490565b6001600160a01b038116600090815260018301602052604081205415156105ba565b6000828152601160205260408120600201546105ba9084908490600160801b90046001600160401b03166133f4565b600081608001516001600160401b031682604001516110599190613dc4565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152306024830181905260448301849052917f0000000000000000000000000000000000000000000000000000000000000000909116906323b872dd906064016020604051808303816000875af1158015612d5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d839190613e18565b61094357604051637c2ccffd60e11b815260040160405180910390fd5b6001600160a01b0382166000908152600a602052604090206109439082613537565b6000612dcd82613543565b6001600160401b03169050428110612e11576040517f6b4b1a4e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600254612e2e90600160401b90046001600160401b031682613e05565b4210612e66576040517fde55698e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526007602090815260408083206001600160401b038616845290915290205460ff1615612ec2576040517efab7d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ecc83836131dd565b612f02576040517fd3ffa66b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526008602090815260408083206001600160401b038616845290915290205460ff1615612f5f576040517f98e7e55100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526008602090815260408083206001600160401b038087168552908352818420805460ff1916600190811790915587855260069093529083208054929390929091612fb091859116613d92565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550505050565b60006110f342613556565b60006105ba612ff38484612ff8565b613582565b60008061300761010043614594565b600254909150600090610100906130369071010000000000000000000000000000000000900460ff16866145a8565b61304091906145ca565b6001600160401b03169050600061305961010087614594565b905060006101008261306b8587613e05565b6130759190613e05565b61307f9190614594565b979650505050505050565b606060006105ba836135dc565b6000816040516020016130aa9190613d69565b604051602081830303815290604052805190602001209050919050565b6001600160a01b03821660009081526009602052604090206109439082613537565b60006130f88260200151613638565b602083015160a081015160609091015161311291906145a8565b6001600160401b03166110599190613dc4565b600080600061313385611b51565b60008681526005602052604081205491925090613158906001600160401b0316613556565b9050600182600681111561316e5761316e613903565b14158061318257506131808582613657565b155b15613195576000809350935050506131d6565b61319f8686612ff8565b925060006131ac84613582565b905060006131b988611072565b90508015806131cf57506131cd8183614594565b155b9550505050505b9250929050565b60008060006131ec8585613125565b909250905081801561320e575060025460ff600160801b909104811690821610155b95945050505050565b6001600160a01b038216600090815260096020526040902061094390826134d3565b600060ff198216816110c98261366d565b6000806105ba8361366d565b60008381526007602052604081209061326d612fd9565b6001600160401b0316815260208101919091526040016000205460ff16156132c1576040517f3edef7db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600480546040517f94c8919d0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116916394c8919d9161330b9186918691016145f8565b602060405180830381865afa158015613328573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061334c9190613e18565b613382576040517ffcd03a4700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083815260076020526040812060019161339b612fd9565b6001600160401b031681526020808201929092526040908101600020805460ff19169315159390931790925590518481527f3b989d183b84b02259d7c14b34a9c9eb0fccb4c355a920d25e581e25aef4993d91016117d4565b60008381526010602052604081206001600160401b0380841690851610613447576040517f56607cb000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160e081018252600183015481526002830154602082015260038301549181019190915260048201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c08201526134b690613638565b6134c08585614575565b6001600160401b031661320e9190613dc4565b60006105ba83836136df565b611279816137d9565b600081815260018301602052604081205461352f57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611059565b506000611059565b60006105ba83836134e8565b60006110596135518361383b565b613848565b60006110597f0000000000000000000000000000000000000000000000000000000000000000836146a2565b60008060ff8316613594600143613db1565b61359e9190613db1565b40905060008190036135b2576135b2613e3a565b60408051602081018390520160405160208183030381529060405280519060200120915050919050565b60608160000180548060200260200160405190810160405280929190818152602001828054801561362c57602002820191906000526020600020905b815481526020019060010190808311613618575b50505050509050919050565b600081608001516001600160401b031682602001516110599190613dc4565b60006001600160401b03808416908316106105ba565b7fff00000000000000000000000000000000000000000000000000000000000000811660015b60208110156106de57600891821c916136ad908290613dc4565b83901b7fff00000000000000000000000000000000000000000000000000000000000000169190911790600101613693565b600081815260018301602052604081205480156137c8576000613703600183613db1565b855490915060009061371790600190613db1565b905080821461377c5760008660000182815481106137375761373761455f565b906000526020600020015490508087600001848154811061375a5761375a61455f565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061378d5761378d6146d0565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611059565b6000915050611059565b5092915050565b60006137e3825490565b905060005b818110156138335782600101600084600001838154811061380b5761380b61455f565b90600052602060002001548152602001908152602001600020600090558060010190506137e8565b505060009055565b6000611059826001613d92565b60006110597f0000000000000000000000000000000000000000000000000000000000000000836145a8565b60408051610100810182526000608080830182815260a080850184905260c0850184905260e08501849052908452845190810185528281526020808201849052818601849052606080830185905292820192909252818401528351908101845290815290918201905b8152600060209091015290565b6000602082840312156138fc57600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b602081016005831061392d5761392d613903565b91905290565b6001600160a01b038116811461127957600080fd5b60008060006060848603121561395d57600080fd5b83359250602084013561396f81613933565b9150604084013561397f81613933565b809150509250925092565b6001600160401b038116811461127957600080fd5b80356139aa8161398a565b919050565b600080604083850312156139c257600080fd5b8235915060208301356139d48161398a565b809150509250929050565b600061010082840312156106de57600080fd5b60008060006101408486031215613a0857600080fd5b833592506020840135613a1a8161398a565b9150613a2985604086016139df565b90509250925092565b602080825282518282018190526000918401906040840190835b81811015613a6a578351835260209384019390920191600101613a4c565b509095945050505050565b6000815180845260005b81811015613a9b57602081850181015186830182015201613a7f565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160401b0381511682526001600160401b03602082015116602083015260ff604082015116604083015260ff60608201511660608301526000608082015160a060808501526110c960a0850182613a75565b602081526000825160ff815116602084015260ff602082015116604084015260ff604082015116606084015260ff606082015116608084015250602083015160e060a0840152613b64610100840182613abb565b90506040840151613b7b60c08501825160ff169052565b5060608401516001600160401b03811660e0850152509392505050565b600060208284031215613baa57600080fd5b81356001600160401b03811115613bc057600080fd5b820161016081850312156105ba57600080fd5b6000815160408452613be86040850182613a75565b602093840151949093019390935250919050565b6001600160a01b038151168252600060208201518051602085015260208101516040850152604081015160608501526001600160401b0360608201511660808501526001600160401b0360808201511660a08501526001600160401b0360a08201511660c08501526001600160401b0360c08201511660e0850152506040820151610160610100850152613c94610160850182613bd3565b90506060830151613cb16101208601826001600160401b03169052565b5060808301516101408501528091505092915050565b602081526000825160406020840152613ce36060840182613bfc565b90506001600160401b0360208501511660408401528091505092915050565b602081016007831061392d5761392d613903565b60008060408385031215613d2957600080fd5b8235915060208301356139d481613933565b6000806101208385031215613d4f57600080fd5b82359150613d6084602085016139df565b90509250929050565b6020815260006105ba6020830184613bfc565b634e487b7160e01b600052601160045260246000fd5b6001600160401b03818116838216019081111561105957611059613d7c565b8181038181111561105957611059613d7c565b808202811582820484141761105957611059613d7c565b634e487b7160e01b600052601260045260246000fd5b600082613e0057613e00613ddb565b500490565b8082018082111561105957611059613d7c565b600060208284031215613e2a57600080fd5b815180151581146105ba57600080fd5b634e487b7160e01b600052600160045260246000fd5b61ffff828116828216039081111561105957611059613d7c565b600181811c90821680613e7e57607f821691505b6020821081036106de57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715613ed657613ed6613e9e565b60405290565b60405160a081016001600160401b0381118282101715613ed657613ed6613e9e565b60405160e081016001600160401b0381118282101715613ed657613ed6613e9e565b604051601f8201601f191681016001600160401b0381118282101715613f4857613f48613e9e565b604052919050565b600060408284031215613f6257600080fd5b613f6a613eb4565b905081356001600160401b03811115613f8257600080fd5b8201601f81018413613f9357600080fd5b80356001600160401b03811115613fac57613fac613e9e565b613fbf601f8201601f1916602001613f20565b818152856020838501011115613fd457600080fd5b81602084016020830137600060209282018301528352928301359282019290925292915050565b600081360361016081121561400f57600080fd5b614017613edc565b833561402281613933565b815260e0601f198301121561403657600080fd5b61403e613efe565b6020858101358252604080870135918301919091526060860135908201529150608084013561406c8161398a565b606083015260a084013561407f8161398a565b608083015260c08401356140928161398a565b60a083015260e08401356140a58161398a565b60c08301526020810191909152610100830135906001600160401b038211156140cd57600080fd5b6140d936838601613f50565b60408201526140eb610120850161399f565b6060820152610140939093013560808401525090919050565b60006020828403121561411657600080fd5b81356105ba81613933565b60006020828403121561413357600080fd5b81356105ba8161398a565b60008235603e1983360301811261415457600080fd5b9190910192915050565b6000808335601e1984360301811261417557600080fd5b8301803591506001600160401b0382111561418f57600080fd5b6020019150368190038213156131d657600080fd5b600081356110598161398a565b601f82111561094357806000526020600020601f840160051c810160208510156141d85750805b601f840160051c820191505b818110156141f857600081556001016141e4565b5050505050565b8135601e1983360301811261421357600080fd5b820180356001600160401b038111801561422c57600080fd5b81360360208401131561423e57600080fd5b60009050614256826142508654613e6a565b866141b1565b80601f83116001811461428b578284156142735750848201602001355b600019600386901b1c1916600185901b1786556142ea565b600086815260209020601f19851690845b828110156142be5760208589018101358355948501946001909201910161429c565b50858210156142de5760001960f88760031b161c19602085890101351681555b505060018460011b0186555b505050505060209190910135600190910155565b813561430981613933565b815473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03919091161781556020820135600182015560408201356002820155606082013560038201556004810160808301356143618161398a565b815467ffffffffffffffff19166001600160401b0382161782555060a083013561438a8161398a565b81546fffffffffffffffff0000000000000000191660409190911b6fffffffffffffffff0000000000000000161781556143fe6143c960c085016141a4565b825467ffffffffffffffff60801b191660809190911b77ffffffffffffffff0000000000000000000000000000000016178255565b61445661440d60e085016141a4565b825477ffffffffffffffffffffffffffffffffffffffffffffffff1660c09190911b7fffffffffffffffff00000000000000000000000000000000000000000000000016178255565b5061447161446861010084018461413e565b600583016141ff565b6144a261448161012084016141a4565b600783016001600160401b0382166001600160401b03198254161781555050565b6101409190910135600890910155565b83815282356020808301919091528301356040808301919091528301356060808301919091526101208201908401356144ea8161398a565b6001600160401b03811660808401525060808401356145088161398a565b6001600160401b03811660a08401525060a08401356145268161398a565b6001600160401b03811660c08401525061454260c0850161399f565b6001600160401b0390811660e084015283166101008301526110c9565b634e487b7160e01b600052603260045260246000fd5b6001600160401b03828116828216039081111561105957611059613d7c565b6000826145a3576145a3613ddb565b500690565b6001600160401b0381811683821602908116908181146137d2576137d2613d7c565b60006001600160401b038316806145e3576145e3613ddb565b806001600160401b0384160691505092915050565b823581526020808401359082015260006101208201614627604084016040870180358252602090810135910152565b614641608084016080870180358252602090810135910152565b61465b60c0840160c0870180358252602090810135910152565b610120610100840152835190819052602084019061014084019060005b81811015614696578351835260209384019390920191600101614678565b50909695505050505050565b60006001600160401b038316806146bb576146bb613ddb565b806001600160401b0384160491505092915050565b634e487b7160e01b600052603160045260246000fdfea26469706673582212203444a73360bb50dd0606abd72470bb042d6e86a23b0e86c86dd00cdc8a0275f564736f6c634300081c0033"; + public static string BYTECODE = "0x60c060405234801561001057600080fd5b50604051614faf380380614faf83398101604081905261002f9161053b565b602083015180516040850151516001805460ff191660ff90921691909117905582906001600160401b03811660000361007b5760405163015536c760e51b815260040160405180910390fd5b6001600160401b031660805261010043116100a9576040516338f5f66160e11b815260040160405180910390fd5b8151600280546020850151604086015160608701516001600160401b039586166001600160801b0319909416939093176801000000000000000095909216949094021761ffff60801b1916600160801b60ff9485160260ff60881b191617600160881b9390911692909202919091178155608083015183919060039061012f90826106d9565b5050600480546001600160a01b0319166001600160a01b0393841617905550831660a05250825151606460ff909116111561017d576040516302bd816360e41b815260040160405180910390fd5b606483600001516040015160ff1611156101aa576040516354e5e0ab60e11b815260040160405180910390fd5b825160408101516020909101516064916101c391610797565b60ff1611156101e5576040516317ff9d0f60e21b815260040160405180910390fd5b82518051600b805460208085015160408087015160609788015160ff90811663010000000263ff0000001992821662010000029290921663ffff0000199482166101000261ffff1990971698821698909817959095179290921695909517178355808801518051600c80549383015196830151978301518516600160881b0260ff60881b1998909516600160801b029790971661ffff60801b196001600160401b0397881668010000000000000000026001600160801b031990951697909216969096179290921791909116939093171783556080820151869391929190600d906102d090826106d9565b50505060408201515160038201805460ff191660ff909216919091179055606090910151600490910180546001600160401b0319166001600160401b03909216919091179055506107c8915050565b634e487b7160e01b600052604160045260246000fd5b60405160a081016001600160401b03811182821017156103575761035761031f565b60405290565b604051608081016001600160401b03811182821017156103575761035761031f565b604051601f8201601f191681016001600160401b03811182821017156103a7576103a761031f565b604052919050565b805160ff811681146103c057600080fd5b919050565b80516001600160401b03811681146103c057600080fd5b600060a082840312156103ee57600080fd5b6103f6610335565b9050610401826103c5565b815261040f602083016103c5565b6020820152610420604083016103af565b6040820152610431606083016103af565b606082015260808201516001600160401b0381111561044f57600080fd5b8201601f8101841361046057600080fd5b80516001600160401b038111156104795761047961031f565b61048c601f8201601f191660200161037f565b8181528560208385010111156104a157600080fd5b60005b828110156104c0576020818501810151838301820152016104a4565b5060006020838301015280608085015250505092915050565b6000602082840312156104eb57600080fd5b604051602081016001600160401b038111828210171561050d5761050d61031f565b60405290508061051c836103af565b905292915050565b80516001600160a01b03811681146103c057600080fd5b60008060006060848603121561055057600080fd5b83516001600160401b0381111561056657600080fd5b840180860360e081121561057957600080fd5b61058161035d565b608082121561058f57600080fd5b61059761035d565b91506105a2836103af565b82526105b0602084016103af565b60208301526105c1604084016103af565b60408301526105d2606084016103af565b60608301529081526080820151906001600160401b038211156105f457600080fd5b610600888385016103dc565b60208201526106128860a085016104d9565b604082015261062360c084016103c5565b6060820152945061063991505060208501610524565b915061064760408501610524565b90509250925092565b600181811c9082168061066457607f821691505b60208210810361068457634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156106d457806000526020600020601f840160051c810160208510156106b15750805b601f840160051c820191505b818110156106d157600081556001016106bd565b50505b505050565b81516001600160401b038111156106f2576106f261031f565b610706816107008454610650565b8461068a565b6020601f82116001811461073a57600083156107225750848201515b600019600385901b1c1916600184901b1784556106d1565b600084815260208120601f198516915b8281101561076a578785015182556020948501946001909201910161074a565b50848210156107885786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b60ff81811683821602908116908181146107c157634e487b7160e01b600052601160045260246000fd5b5092915050565b60805160a05161478a610825600039600081816104dd01528181610f76015281816120390152818161266801528181612718015281816128a7015281816129570152612d790152600081816135b801526138bd015261478a6000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c80636e2b54ee11610104578063c0cc4add116100a2578063e8aa0a0711610071578063e8aa0a071461047f578063f752196b14610492578063fb1e61ca146104bb578063fc0c546a146104db57600080fd5b8063c0cc4add14610433578063c5d4335114610446578063d02bbe3314610459578063d1bb36b61461046c57600080fd5b8063a29c29a4116100de578063a29c29a4146103bd578063a3a0807e146103d0578063b396dc79146103f3578063be5cdc481461041357600080fd5b80636e2b54ee1461038f5780639777b72c146103a257806399b6da0c146103aa57600080fd5b8063329b5a0b1161017157806351a766421161014b57806351a766421461030e5780635da73835146103215780636b00c8cf146103365780636c70bee91461037a57600080fd5b8063329b5a0b146102a3578063458d2bf1146102d65780634641dce6146102e957600080fd5b806312827602116101ad57806312827602146102395780631d873c1b1461024c578063237d84821461025f57806326d6f8341461027257600080fd5b806302fa8e65146101d457806305b90773146102045780630aefaabe14610224575b600080fd5b6101e76101e2366004613958565b610501565b6040516001600160401b0390911681526020015b60405180910390f35b610217610212366004613958565b6105df565b6040516101fb9190613987565b6102376102323660046139b6565b610702565b005b610237610247366004613a1d565b610895565b61023761025a366004613a60565b610966565b61023761026d366004613a1d565b610e18565b610295610280366004613958565b60009081526012602052604090206003015490565b6040519081526020016101fb565b6101e76102b1366004613958565b600090815260116020526040902060020154600160c01b90046001600160401b031690565b6102956102e4366004613958565b611066565b6102fc6102f7366004613958565b61107f565b60405160ff90911681526020016101fb565b61029561031c366004613958565b611092565b6103296110f1565b6040516101fb9190613aa0565b610362610344366004613958565b6000908152601260205260409020600401546001600160a01b031690565b6040516001600160a01b0390911681526020016101fb565b610382611118565b6040516101fb9190613b7e565b61023761039d366004613958565b61128f565b61032961129c565b6102376103b8366004613c06565b6112bb565b6102376103cb366004613958565b611801565b6103e36103de366004613958565b611853565b60405190151581526020016101fb565b610406610401366004613958565b61188f565b6040516101fb9190613d35565b610426610421366004613958565b611b71565b6040516101fb9190613d70565b6103e3610441366004613958565b611c3f565b610237610454366004613d84565b611c52565b6103e3610467366004613a1d565b6120d3565b61023761047a366004613a1d565b612175565b61023761048d366004613da9565b6121ba565b6101e76104a0366004613958565b6000908152600660205260409020546001600160401b031690565b6104ce6104c9366004613958565b612333565b6040516101fb9190613dd7565b7f0000000000000000000000000000000000000000000000000000000000000000610362565b60008061050d836105df565b9050600081600481111561052357610523613971565b14806105405750600181600481111561053e5761053e613971565b145b1561056c575050600090815260116020526040902060020154600160801b90046001600160401b031690565b600281600481111561058057610580613971565b036105ac575050600090815260116020526040902060020154600160c01b90046001600160401b031690565b6000838152601160205260409020600201546105d890600160801b90046001600160401b031642612549565b9392505050565b60008181526010602052604081205482906001600160a01b031661061657604051635eeb253d60e11b815260040160405180910390fd5b600083815260116020526040812090815460ff16600481111561063b5761063b613971565b14801561067a5750600084815260116020526040902060020154600160c01b90046001600160401b03166001600160401b0316426001600160401b0316115b156106895760029250506106fc565b6001815460ff1660048111156106a1576106a1613971565b14806106c257506000815460ff1660048111156106c0576106c0613971565b145b80156106e6575060028101546001600160401b03600160801b909104811642909116115b156106f55760039250506106fc565b5460ff1691505b50919050565b826000808281526012602052604090205460ff16600681111561072757610727613971565b0361074557604051638b41ec7f60e01b815260040160405180910390fd5b600084815260126020526040902060048101546001600160a01b03163314610799576040517f57a6f4e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006107a486611b71565b905060048160068111156107ba576107ba613971565b036107f1576040517fc2cbf77700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600281600681111561080557610805613971565b0361081f5761081a8260010154878787612559565b61088d565b600581600681111561083357610833613971565b036108485761081a82600101548787876127a2565b600381600681111561085c5761085c613971565b0361086b5761081a33876129eb565b600181600681111561087f5761087f613971565b0361088d5761088d86612a0d565b505050505050565b61089f82826120d3565b6108d5576040517f424a04ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108e18383612c5d565b60008181526020819052604090209091506108fc9033612ca2565b50600154600082815260208190526040902060ff9091169061091d90612cb7565b03610961576040516001600160401b038316815283907fc8e6c955744189a19222ec226b72ac1435d88d5745252dac56e6f679f64c037a9060200160405180910390a25b505050565b60008381526010602052604090205483906001600160a01b031661099d57604051635eeb253d60e11b815260040160405180910390fd5b600084815260106020526040902060048101546001600160401b03908116908516106109f5576040517f3b920b8800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610a018686612c5d565b6000818152602081905260409020909150610a1c9033612cc1565b610a52576040517fd651ce1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152601260209081526040808320600181018a90556002810180546fffffffffffffffff00000000000000001916600160401b6001600160401b038c1602179055898452601190925282209091610aab84611b71565b6006811115610abc57610abc613971565b14158015610ae457506006610ad084611b71565b6006811115610ae157610ae1613971565b14155b15610b1b576040517fff556acf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60048201805473ffffffffffffffffffffffffffffffffffffffff1916331790556002820180546001600160401b03421667ffffffffffffffff19909116179055610b8c83600090815260056020526040902080546001600160401b03421667ffffffffffffffff19909116179055565b610b9683876121ba565b60028101805460019190600090610bb79084906001600160401b0316613e00565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550610bfc888360020160009054906101000a90046001600160401b0316612ce3565b816001016000828254610c0f9190613e1f565b90915550506040805160e081018252600186015481526002860154602082015260038601549181019190915260048501546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c08201526000908190610c8890612d12565b90506006610c9586611b71565b6006811115610ca657610ca6613971565b03610cd957600b54606490610cbe9060ff1683613e32565b610cc89190613e5f565b610cd29082613e1f565b9150610cdd565b8091505b610ce73383612d31565b8160136000016000828254610cfc9190613e73565b9091555050600384018190556004840154610d20906001600160a01b031686612e05565b835460ff191660011784556040516001600160401b038a1681528a907f8f301470a994578b52323d625dfbf827ca5208c81747d3459be7b8867baec3ec9060200160405180910390a2600486015460028401546001600160401b039081169116148015610da257506000835460ff166004811115610da057610da0613971565b145b15610e0c57825460ff191660011783556002830180546001600160401b034216600160401b026fffffffffffffffff0000000000000000199091161790556040518a907f85e1543bf2f84fe80c6badbce3648c8539ad1df4d2b3d822938ca0538be727e690600090a25b50505050505050505050565b816001610e2482611b71565b6006811115610e3557610e35613971565b14610e535760405163ae9dcffd60e01b815260040160405180910390fd5b610e5d8383612e27565b6000838152601260209081526040808320600180820154855260108452828520600b54845160e08101865292820154835260028201549583019590955260038101549382019390935260048301546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0820152909391926064916201000090910460ff1690610f0090612d12565b610f0a9190613e32565b610f149190613e5f565b600b54909150600090606490610f34906301000000900460ff1684613e32565b610f3e9190613e5f565b90508060136001016000828254610f559190613e73565b909155505060405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015610fc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610feb9190613e86565b61100857604051637c2ccffd60e11b815260040160405180910390fd5b8184600301600082825461101c9190613e1f565b9091555050600b5460008881526006602052604090205461010090910460ff16906001600160401b03166001600160401b03161061105d5761105d87612a0d565b50505050505050565b600061107982611074612eaa565b612eb5565b92915050565b60006110798261108d612eaa565b612ec9565b60008181526012602090815260408083206001810154845260109092528220600c54610100906110cc90600160801b900460ff1682613ea8565b60018301546110df9161ffff1690613e32565b6110e99190613e5f565b949350505050565b336000908152600a602052604090206060906111139061111090612f5b565b90565b905090565b6111206138e2565b604080516101008082018352600b805460ff8082166080808701918252948304821660a080880191909152620100008404831660c08801526301000000909304821660e0870152855285519182018652600c80546001600160401b038082168552600160401b820416602085810191909152600160801b82048416988501989098527101000000000000000000000000000000000090049091166060830152600d80549596939593870194929391928401916111db90613ec2565b80601f016020809104026020016040519081016040528092919081815260200182805461120790613ec2565b80156112545780601f1061122957610100808354040283529160200191611254565b820191906000526020600020905b81548152906001019060200180831161123757829003601f168201915b5050509190925250505081526040805160208181018352600385015460ff1682528301526004909201546001600160401b0316910152919050565b6112998133611c52565b50565b3360009081526009602052604090206060906111139061111090612f5b565b60006112ce6112c983614053565b612f68565b9050336112de602084018461415c565b6001600160a01b031614611305576040516334c69e3160e11b815260040160405180910390fd5b6000818152601060205260409020546001600160a01b031615611354576040517ffc7d069000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61136661014083016101208401614179565b6001600160401b031615806113ad575061138660e0830160c08401614179565b6001600160401b03166113a161014084016101208501614179565b6001600160401b031610155b156113e4576040517fdf63f61a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113f460a0830160808401614179565b6001600160401b0316600003611436576040517f535ed2be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61144660a0830160808401614179565b6001600160401b0316611460610100840160e08501614179565b6001600160401b031611156114a1576040517fb9551ab100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114b160e0830160c08401614179565b6001600160401b03166000036114f3576040517f090a5ecd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020820135600003611531576040517f6aba7aae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606082013560000361156f576040517ffb7df0c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408201356000036115ad576040517f47ba51c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115bb610100830183614196565b6115c590806141b6565b9050600003611600576040517f86f8cf9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f546001600160401b031661161c60e0840160c08501614179565b6001600160401b0316111561165d576040517f1267b3f200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081815260106020526040902082906116778282614356565b5061168a905060e0830160c08401614179565b6116949042613e00565b600082815260116020526040902060020180546001600160401b0392909216600160801b0267ffffffffffffffff60801b199092169190911790556116e161014083016101208401614179565b6116eb9042613e00565b600082815260116020908152604090912060020180546001600160401b0393909316600160c01b0277ffffffffffffffffffffffffffffffffffffffffffffffff9093169290921790915561174c906117469084018461415c565b82612f98565b600061175f61175a84614053565b612fba565b600083815260116020526040812060010182905560138054929350839290919061178a908490613e73565b9091555061179a90503382612d31565b6000828152601160209081526040918290206002015491517f1bf9c457accf8703dbf7cdf1b58c2f74ddf2e525f98155c70b3d318d74609bd8926117f492869290880191600160c01b90046001600160401b03169061450a565b60405180910390a1505050565b806000808281526012602052604090205460ff16600681111561182657611826613971565b0361184457604051638b41ec7f60e01b815260040160405180910390fd5b61184f823333610702565b5050565b600080600061186984611864612eaa565b612ff6565b90925090508180156110e95750600254600160801b900460ff9081169116109392505050565b611912604051806040016040528061394b6040805160a080820183526000808352835160e081018552818152602080820183905281860183905260608083018490526080830184905293820183905260c0820183905280850191909152845180860186529283528201529091820190815260006020820181905260409091015290565b816000808281526012602052604090205460ff16600681111561193757611937613971565b0361195557604051638b41ec7f60e01b815260040160405180910390fd5b60008381526012602052604090206119e6604051806040016040528061394b6040805160a080820183526000808352835160e081018552818152602080820183905281860183905260608083018490526080830184905293820183905260c0820183905280850191909152845180860186529283528201529091820190815260006020820181905260409091015290565b600180830154600090815260106020908152604091829020825160a0808201855282546001600160a01b03168252845160e08101865295830154865260028301548685015260038301548686015260048301546001600160401b038082166060890152600160401b820481166080890152600160801b8204811692880192909252600160c01b90041660c0860152918201939093528151808301835260058401805492949385019282908290611a9b90613ec2565b80601f0160208091040260200160405190810160405280929190818152602001828054611ac790613ec2565b8015611b145780601f10611ae957610100808354040283529160200191611b14565b820191906000526020600020905b815481529060010190602001808311611af757829003601f168201915b50505091835250506001919091015460209182015290825260078301546001600160401b0390811683830152600890930154604090920191909152918352600290930154600160401b900490921691810191909152915050919050565b600081815260126020526040812060018101548203611b935750600092915050565b6000611ba282600101546105df565b90506004825460ff166006811115611bbc57611bbc613971565b03611bcb575060049392505050565b6002816004811115611bdf57611bdf613971565b03611bee575060059392505050565b6003816004811115611c0257611c02613971565b03611c11575060029392505050565b6004816004811115611c2557611c25613971565b03611c34575060039392505050565b505460ff1692915050565b600061107982611c4d612eaa565b6130ae565b60008281526010602052604090205482906001600160a01b0316611c8957604051635eeb253d60e11b815260040160405180910390fd5b6000838152601060209081526040808320601190925290912081546001600160a01b03163314611ccc576040516334c69e3160e11b815260040160405180910390fd5b6000611cd7866105df565b90506002816004811115611ced57611ced613971565b14158015611d0d57506004816004811115611d0a57611d0a613971565b14155b8015611d2b57506003816004811115611d2857611d28613971565b14155b15611d62576040517fc00b5b5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160010154600003611da0576040517fbd8bdd9400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002816004811115611db457611db4613971565b03611e5257815460ff1916600217825560405186907ff903f4774c7bd27355f9d7fcbc382b079b164a697a44ac5d95267a4c3cb3bb2290600090a2600086815260116020526040902060020154611e1c908790600160c01b90046001600160401b0316612ce3565b6002830154611e3491906001600160401b0316613e32565b826001016000828254611e479190613e73565b90915550611fdf9050565b6004816004811115611e6657611e66613971565b03611fd3576040805160a0808201835285546001600160a01b03168252825160e08101845260018701548152600287015460208281019190915260038801548286015260048801546001600160401b038082166060850152600160401b820481166080850152600160801b8204811694840194909452600160c01b900490921660c08201529082015281518083018352600586018054611fc994889390850192909182908290611f1590613ec2565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4190613ec2565b8015611f8e5780601f10611f6357610100808354040283529160200191611f8e565b820191906000526020600020905b815481529060010190602001808311611f7157829003601f168201915b50505091835250506001919091015460209182015290825260078301546001600160401b031690820152600890910154604090910152612fba565b6001830155611fdf565b815460ff191660031782555b8254611ff4906001600160a01b0316876130e8565b60018201546014805482919060009061200e908490613e73565b909155505060405163a9059cbb60e01b81526001600160a01b038781166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015612082573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a69190613e86565b6120c357604051637c2ccffd60e11b815260040160405180910390fd5b5050600060019091015550505050565b600033816120e18585612c5d565b905060006120ee82611b71565b9050600081600681111561210457612104613971565b14806121215750600681600681111561211f5761211f613971565b145b801561214a5750600154600083815260208190526040902060ff9091169061214890612cb7565b105b801561216b575060008281526020819052604090206121699084612cc1565b155b9695505050505050565b81600161218182611b71565b600681111561219257612192613971565b146121b05760405163ae9dcffd60e01b815260040160405180910390fd5b610961838361310a565b6000828152601260209081526040808320600101548084526010909252909120546001600160a01b031661220157604051635eeb253d60e11b815260040160405180910390fd5b600083815260126020526040902060048101546001600160a01b03163314612255576040517fce351b9400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001810154600090815260106020526040808220815160038082526080820190935290929181602001602082028036833701905050905061229d61229887611066565b6132a7565b816000815181106122b0576122b06145b7565b602090810291909101015260068201546122c9906132b8565b816001815181106122dc576122dc6145b7565b6020026020010181815250508260020160089054906101000a90046001600160401b03166001600160401b03168160028151811061231c5761231c6145b7565b60200260200101818152505061088d8686836132c4565b6123a86040805160a080820183526000808352835160e081018552818152602080820183905281860183905260608083018490526080830184905293820183905260c0820183905280850191909152845180860186529283528201529091820190815260006020820181905260409091015290565b60008281526010602052604090205482906001600160a01b03166123df57604051635eeb253d60e11b815260040160405180910390fd5b600083815260106020908152604091829020825160a0808201855282546001600160a01b03168252845160e0810186526001840154815260028401548186015260038401548187015260048401546001600160401b038082166060840152600160401b820481166080840152600160801b8204811693830193909352600160c01b900490911660c0820152928101929092528251808401845260058201805493949293928501928290829061249390613ec2565b80601f01602080910402602001604051908101604052809291908181526020018280546124bf90613ec2565b801561250c5780601f106124e15761010080835404028352916020019161250c565b820191906000526020600020905b8154815290600101906020018083116124ef57829003601f168201915b50505091835250506001919091015460209182015290825260078301546001600160401b0316908201526008909101546040909101529392505050565b60008282188284100282186105d8565b60008481526010602052604090205484906001600160a01b031661259057604051635eeb253d60e11b815260040160405180910390fd5b600085815260116020908152604080832060108352818420815460ff191660031782558885526012909352922081546125d2906001600160a01b0316896130e8565b60048101546125ea906001600160a01b0316886129eb565b6002810154600090612606908a906001600160401b0316612ce3565b60038301549091506126188183613e73565b6014805460009061262a908490613e73565b90915550508254600490849060ff1916600183021790555060405163a9059cbb60e01b81526001600160a01b038981166004830152602482018490527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af11580156126b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126d59190613e86565b6126f257604051637c2ccffd60e11b815260040160405180910390fd5b60405163a9059cbb60e01b81526001600160a01b038881166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015612761573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127859190613e86565b610e0c57604051637c2ccffd60e11b815260040160405180910390fd5b60008481526010602052604090205484906001600160a01b03166127d957604051635eeb253d60e11b815260040160405180910390fd5b600084815260126020526040902060048101546127ff906001600160a01b0316866129eb565b60028101546000906128459088906001600160401b0316612840826000908152601160205260409020600201546001600160401b03600160c01b9091041690565b613462565b60038301549091506128578183613e73565b60148054600090612869908490613e73565b90915550508254600490849060ff1916600183021790555060405163a9059cbb60e01b81526001600160a01b038781166004830152602482018490527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af11580156128f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129149190613e86565b61293157604051637c2ccffd60e11b815260040160405180910390fd5b60405163a9059cbb60e01b81526001600160a01b038681166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af11580156129a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129c49190613e86565b6129e157604051637c2ccffd60e11b815260040160405180910390fd5b5050505050505050565b6001600160a01b0382166000908152600a602052604090206109619082613541565b60008181526012602090815260408083206001810154808552601190935292206002830154612a469083906001600160401b0316612ce3565b816001016000828254612a599190613e73565b90915550506004830154612a76906001600160a01b0316856129eb565b6000848152602081905260409020612a8d9061354d565b825460ff191660061783556002808401805467ffffffffffffffff1916905560006003850181905560048501805473ffffffffffffffffffffffffffffffffffffffff19169055908201805460019290612af19084906001600160401b03166145cd565b82546101009290920a6001600160401b038181021990931691831602179091556002850154604051600160401b90910490911681528391507f33ba8f7627565d89f7ada2a6b81ea532b7aa9b11e91a78312d6e1fca0bfcd1dc9060200160405180910390a26000848152600660205260409020805467ffffffffffffffff19169055600082815260106020526040812060028301546004820154919291612ba4916001600160401b0390811691166145cd565b60048301546001600160401b039182169250600160c01b90041681118015612be157506001835460ff166004811115612bdf57612bdf613971565b145b1561088d57825460ff19166004178355612bfc6001426145cd565b6002840180546001600160401b0392909216600160801b0267ffffffffffffffff60801b1990921691909117905560405184907f4769361a442504ecaf038f35e119bcccdd5e42096b24c09e3c17fd17c6684c0290600090a2505050505050565b60008282604051602001612c849291909182526001600160401b0316602082015260400190565b60405160208183030381529060405280519060200120905092915050565b60006105d8836001600160a01b038416613556565b6000611079825490565b6001600160a01b038116600090815260018301602052604081205415156105d8565b6000828152601160205260408120600201546105d89084908490600160801b90046001600160401b0316613462565b600081608001516001600160401b031682604001516110799190613e32565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152306024830181905260448301849052917f0000000000000000000000000000000000000000000000000000000000000000909116906323b872dd906064016020604051808303816000875af1158015612dc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612de89190613e86565b61096157604051637c2ccffd60e11b815260040160405180910390fd5b6001600160a01b0382166000908152600a6020526040902061096190826135a5565b612e31828261310a565b60008281526008602090815260408083206001600160401b038086168552908352818420805460ff1916600190811790915586855260069093529083208054929390929091612e8291859116613e00565b92506101000a8154816001600160401b0302191690836001600160401b031602179055505050565b6000611113426135b1565b60006105d8612ec48484612ec9565b6135dd565b600080612ed8610100436145ec565b60025490915060009061010090612f079071010000000000000000000000000000000000900460ff1686614600565b612f119190614622565b6001600160401b031690506000612f2a610100876145ec565b9050600061010082612f3c8587613e73565b612f469190613e73565b612f5091906145ec565b979650505050505050565b606060006105d883613637565b600081604051602001612f7b9190613dd7565b604051602081830303815290604052805190602001209050919050565b6001600160a01b038216600090815260096020526040902061096190826135a5565b6000612fc98260200151613693565b602083015160a0810151606090910151612fe39190614600565b6001600160401b03166110799190613e32565b600080600061300485611b71565b60008681526005602052604081205491925090613029906001600160401b03166135b1565b9050600182600681111561303f5761303f613971565b141580613053575061305185826136b2565b155b15613066576000809350935050506130a7565b6130708686612ec9565b9250600061307d846135dd565b9050600061308a88611092565b90508015806130a0575061309e81836145ec565b155b9550505050505b9250929050565b60008060006130bd8585612ff6565b90925090508180156130df575060025460ff600160801b909104811690821610155b95945050505050565b6001600160a01b03821660009081526009602052604090206109619082613541565b6000613115826136c8565b6001600160401b03169050428110613159576040517f6b4b1a4e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025461317690600160401b90046001600160401b031682613e73565b42106131ae576040517fde55698e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526007602090815260408083206001600160401b038616845290915290205460ff161561320a576040517efab7d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61321483836130ae565b61324a576040517fd3ffa66b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526008602090815260408083206001600160401b038616845290915290205460ff1615610961576040517f98e7e55100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060ff198216816110e9826136db565b6000806105d8836136db565b6000838152600760205260408120906132db612eaa565b6001600160401b0316815260208101919091526040016000205460ff161561332f576040517f3edef7db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600480546040517f94c8919d0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116916394c8919d91613379918691869101614650565b602060405180830381865afa158015613396573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133ba9190613e86565b6133f0576040517ffcd03a4700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000838152600760205260408120600191613409612eaa565b6001600160401b031681526020808201929092526040908101600020805460ff19169315159390931790925590518481527f3b989d183b84b02259d7c14b34a9c9eb0fccb4c355a920d25e581e25aef4993d91016117f4565b60008381526010602052604081206001600160401b03808416908516106134b5576040517f56607cb000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160e081018252600183015481526002830154602082015260038301549181019190915260048201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c082015261352490613693565b61352e85856145cd565b6001600160401b03166130df9190613e32565b60006105d8838361374d565b61129981613847565b600081815260018301602052604081205461359d57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611079565b506000611079565b60006105d88383613556565b60006110797f0000000000000000000000000000000000000000000000000000000000000000836146fa565b60008060ff83166135ef600143613e1f565b6135f99190613e1f565b409050600081900361360d5761360d614728565b60408051602081018390520160405160208183030381529060405280519060200120915050919050565b60608160000180548060200260200160405190810160405280929190818152602001828054801561368757602002820191906000526020600020905b815481526020019060010190808311613673575b50505050509050919050565b600081608001516001600160401b031682602001516110799190613e32565b60006001600160401b03808416908316106105d8565b60006110796136d6836138a9565b6138b6565b7fff00000000000000000000000000000000000000000000000000000000000000811660015b60208110156106fc57600891821c9161371b908290613e32565b83901b7fff00000000000000000000000000000000000000000000000000000000000000169190911790600101613701565b60008181526001830160205260408120548015613836576000613771600183613e1f565b855490915060009061378590600190613e1f565b90508082146137ea5760008660000182815481106137a5576137a56145b7565b90600052602060002001549050808760000184815481106137c8576137c86145b7565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806137fb576137fb61473e565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611079565b6000915050611079565b5092915050565b6000613851825490565b905060005b818110156138a157826001016000846000018381548110613879576138796145b7565b9060005260206000200154815260200190815260200160002060009055806001019050613856565b505060009055565b6000611079826001613e00565b60006110797f000000000000000000000000000000000000000000000000000000000000000083614600565b60408051610100810182526000608080830182815260a080850184905260c0850184905260e08501849052908452845190810185528281526020808201849052818601849052606080830185905292820192909252818401528351908101845290815290918201905b8152600060209091015290565b60006020828403121561396a57600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b602081016005831061399b5761399b613971565b91905290565b6001600160a01b038116811461129957600080fd5b6000806000606084860312156139cb57600080fd5b8335925060208401356139dd816139a1565b915060408401356139ed816139a1565b809150509250925092565b6001600160401b038116811461129957600080fd5b8035613a18816139f8565b919050565b60008060408385031215613a3057600080fd5b823591506020830135613a42816139f8565b809150509250929050565b600061010082840312156106fc57600080fd5b60008060006101408486031215613a7657600080fd5b833592506020840135613a88816139f8565b9150613a978560408601613a4d565b90509250925092565b602080825282518282018190526000918401906040840190835b81811015613ad8578351835260209384019390920191600101613aba565b509095945050505050565b6000815180845260005b81811015613b0957602081850181015186830182015201613aed565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160401b0381511682526001600160401b03602082015116602083015260ff604082015116604083015260ff60608201511660608301526000608082015160a060808501526110e960a0850182613ae3565b602081526000825160ff815116602084015260ff602082015116604084015260ff604082015116606084015260ff606082015116608084015250602083015160e060a0840152613bd2610100840182613b29565b90506040840151613be960c08501825160ff169052565b5060608401516001600160401b03811660e0850152509392505050565b600060208284031215613c1857600080fd5b81356001600160401b03811115613c2e57600080fd5b820161016081850312156105d857600080fd5b6000815160408452613c566040850182613ae3565b602093840151949093019390935250919050565b6001600160a01b038151168252600060208201518051602085015260208101516040850152604081015160608501526001600160401b0360608201511660808501526001600160401b0360808201511660a08501526001600160401b0360a08201511660c08501526001600160401b0360c08201511660e0850152506040820151610160610100850152613d02610160850182613c41565b90506060830151613d1f6101208601826001600160401b03169052565b5060808301516101408501528091505092915050565b602081526000825160406020840152613d516060840182613c6a565b90506001600160401b0360208501511660408401528091505092915050565b602081016007831061399b5761399b613971565b60008060408385031215613d9757600080fd5b823591506020830135613a42816139a1565b6000806101208385031215613dbd57600080fd5b82359150613dce8460208501613a4d565b90509250929050565b6020815260006105d86020830184613c6a565b634e487b7160e01b600052601160045260246000fd5b6001600160401b03818116838216019081111561107957611079613dea565b8181038181111561107957611079613dea565b808202811582820484141761107957611079613dea565b634e487b7160e01b600052601260045260246000fd5b600082613e6e57613e6e613e49565b500490565b8082018082111561107957611079613dea565b600060208284031215613e9857600080fd5b815180151581146105d857600080fd5b61ffff828116828216039081111561107957611079613dea565b600181811c90821680613ed657607f821691505b6020821081036106fc57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715613f2e57613f2e613ef6565b60405290565b60405160a081016001600160401b0381118282101715613f2e57613f2e613ef6565b60405160e081016001600160401b0381118282101715613f2e57613f2e613ef6565b604051601f8201601f191681016001600160401b0381118282101715613fa057613fa0613ef6565b604052919050565b600060408284031215613fba57600080fd5b613fc2613f0c565b905081356001600160401b03811115613fda57600080fd5b8201601f81018413613feb57600080fd5b80356001600160401b0381111561400457614004613ef6565b614017601f8201601f1916602001613f78565b81815285602083850101111561402c57600080fd5b81602084016020830137600060209282018301528352928301359282019290925292915050565b600081360361016081121561406757600080fd5b61406f613f34565b833561407a816139a1565b815260e0601f198301121561408e57600080fd5b614096613f56565b602085810135825260408087013591830191909152606086013590820152915060808401356140c4816139f8565b606083015260a08401356140d7816139f8565b608083015260c08401356140ea816139f8565b60a083015260e08401356140fd816139f8565b60c08301526020810191909152610100830135906001600160401b0382111561412557600080fd5b61413136838601613fa8565b60408201526141436101208501613a0d565b6060820152610140939093013560808401525090919050565b60006020828403121561416e57600080fd5b81356105d8816139a1565b60006020828403121561418b57600080fd5b81356105d8816139f8565b60008235603e198336030181126141ac57600080fd5b9190910192915050565b6000808335601e198436030181126141cd57600080fd5b8301803591506001600160401b038211156141e757600080fd5b6020019150368190038213156130a757600080fd5b60008135611079816139f8565b601f82111561096157806000526020600020601f840160051c810160208510156142305750805b601f840160051c820191505b81811015614250576000815560010161423c565b5050505050565b8135601e1983360301811261426b57600080fd5b820180356001600160401b038111801561428457600080fd5b81360360208401131561429657600080fd5b600090506142ae826142a88654613ec2565b86614209565b80601f8311600181146142e3578284156142cb5750848201602001355b600019600386901b1c1916600185901b178655614342565b600086815260209020601f19851690845b82811015614316576020858901810135835594850194600190920191016142f4565b50858210156143365760001960f88760031b161c19602085890101351681555b505060018460011b0186555b505050505060209190910135600190910155565b8135614361816139a1565b815473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03919091161781556020820135600182015560408201356002820155606082013560038201556004810160808301356143b9816139f8565b815467ffffffffffffffff19166001600160401b0382161782555060a08301356143e2816139f8565b81546fffffffffffffffff0000000000000000191660409190911b6fffffffffffffffff00000000000000001617815561445661442160c085016141fc565b825467ffffffffffffffff60801b191660809190911b77ffffffffffffffff0000000000000000000000000000000016178255565b6144ae61446560e085016141fc565b825477ffffffffffffffffffffffffffffffffffffffffffffffff1660c09190911b7fffffffffffffffff00000000000000000000000000000000000000000000000016178255565b506144c96144c0610100840184614196565b60058301614257565b6144fa6144d961012084016141fc565b600783016001600160401b0382166001600160401b03198254161781555050565b6101409190910135600890910155565b8381528235602080830191909152830135604080830191909152830135606080830191909152610120820190840135614542816139f8565b6001600160401b0381166080840152506080840135614560816139f8565b6001600160401b03811660a08401525060a084013561457e816139f8565b6001600160401b03811660c08401525061459a60c08501613a0d565b6001600160401b0390811660e084015283166101008301526110e9565b634e487b7160e01b600052603260045260246000fd5b6001600160401b03828116828216039081111561107957611079613dea565b6000826145fb576145fb613e49565b500690565b6001600160401b03818116838216029081169081811461384057613840613dea565b60006001600160401b0383168061463b5761463b613e49565b806001600160401b0384160691505092915050565b82358152602080840135908201526000610120820161467f604084016040870180358252602090810135910152565b614699608084016080870180358252602090810135910152565b6146b360c0840160c0870180358252602090810135910152565b610120610100840152835190819052602084019061014084019060005b818110156146ee5783518352602093840193909201916001016146d0565b50909695505050505050565b60006001600160401b0383168061471357614713613e49565b806001600160401b0384160491505092915050565b634e487b7160e01b600052600160045260246000fd5b634e487b7160e01b600052603160045260246000fdfea26469706673582212208753932439ab3be782432684ba36d249b5e5029b7c1b55364b935c22d15237d664736f6c634300081c0033"; public MarketplaceDeploymentBase() : base(BYTECODE) { } public MarketplaceDeploymentBase(string byteCode) : base(byteCode) { } [Parameter("tuple", "config", 1)] @@ -284,6 +284,17 @@ namespace CodexContractsPlugin.Marketplace public class SlotreservationsReservationnotallowedErrorBase : IErrorDTO { } + + public partial class CanMarkProofAsMissingFunction : CanMarkProofAsMissingFunctionBase { } + + [Function("canMarkProofAsMissing")] + public class CanMarkProofAsMissingFunctionBase : FunctionMessage + { + [Parameter("bytes32", "slotId", 1)] + public virtual byte[] SlotId { get; set; } + [Parameter("uint64", "period", 2)] + public virtual ulong Period { get; set; } + } public partial class CanReserveSlotOutputDTO : CanReserveSlotOutputDTOBase { } [FunctionOutput] diff --git a/ProjectPlugins/CodexPlugin/CodexDockerImage.cs b/ProjectPlugins/CodexPlugin/CodexDockerImage.cs index 57619f0b..805b3af0 100644 --- a/ProjectPlugins/CodexPlugin/CodexDockerImage.cs +++ b/ProjectPlugins/CodexPlugin/CodexDockerImage.cs @@ -2,7 +2,7 @@ { public class CodexDockerImage { - private const string DefaultDockerImage = "codexstorage/nim-codex:0.2.3-dist-tests"; + private const string DefaultDockerImage = "codexstorage/nim-codex:sha-2e1306a-dist-tests"; public static string Override { get; set; } = string.Empty; diff --git a/Tests/CodexReleaseTests/MarketTests/FailTest.cs b/Tests/CodexReleaseTests/MarketTests/FailTest.cs index c5a0715c..cbd39600 100644 --- a/Tests/CodexReleaseTests/MarketTests/FailTest.cs +++ b/Tests/CodexReleaseTests/MarketTests/FailTest.cs @@ -8,11 +8,16 @@ namespace CodexReleaseTests.MarketTests public class FailTest : MarketplaceAutoBootstrapDistTest { protected override int NumberOfHosts => 4; + private readonly int SlotTolerance; protected override int NumberOfClients => 1; protected override ByteSize HostAvailabilitySize => 1.GB(); protected override TimeSpan HostAvailabilityMaxDuration => TimeSpan.FromDays(1.0); - [Ignore("Slots are never freed because proofs are never marked as missing. Issue: https://github.com/codex-storage/nim-codex/issues/1153")] + public FailTest() + { + SlotTolerance = NumberOfHosts / 2; + } + [Test] [Combinatorial] public void Fail( @@ -50,7 +55,8 @@ namespace CodexReleaseTests.MarketTests { var events = GetContracts().GetEvents(GetTestRunTimeRange()); var slotFreed = events.GetSlotFreedEvents(); - if (slotFreed.Length == NumberOfHosts) + Log($"SlotFreed events: {slotFreed.Length} - Expected: {SlotTolerance}"); + if (slotFreed.Length > SlotTolerance) { Log($"{nameof(WaitForSlotFreedEvents)} took {Time.FormatDuration(DateTime.UtcNow - start)}"); return; @@ -68,7 +74,7 @@ namespace CodexReleaseTests.MarketTests Duration = HostAvailabilityMaxDuration / 2, Expiry = TimeSpan.FromMinutes(5.0), MinRequiredNumberOfNodes = (uint)NumberOfHosts, - NodeFailureTolerance = (uint)(NumberOfHosts / 2), + NodeFailureTolerance = (uint)SlotTolerance, PricePerBytePerSecond = 100.TstWei(), ProofProbability = 1, // Require a proof every period CollateralPerByte = 1.TstWei() From 6c99c7a7cfa1b31e4f30edc43096a25c44e6bf04 Mon Sep 17 00:00:00 2001 From: Ben Date: Thu, 5 Jun 2025 12:56:45 +0200 Subject: [PATCH 13/15] update --- .../CodexPlugin/CodexDockerImage.cs | 2 +- .../CodexReleaseTests/DataTests/SwarmTest.cs | 25 +++++++++++-------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/ProjectPlugins/CodexPlugin/CodexDockerImage.cs b/ProjectPlugins/CodexPlugin/CodexDockerImage.cs index 805b3af0..4979f561 100644 --- a/ProjectPlugins/CodexPlugin/CodexDockerImage.cs +++ b/ProjectPlugins/CodexPlugin/CodexDockerImage.cs @@ -2,7 +2,7 @@ { public class CodexDockerImage { - private const string DefaultDockerImage = "codexstorage/nim-codex:sha-2e1306a-dist-tests"; + private const string DefaultDockerImage = "codexstorage/nim-codex:sha-3e17207-dist-tests"; public static string Override { get; set; } = string.Empty; diff --git a/Tests/CodexReleaseTests/DataTests/SwarmTest.cs b/Tests/CodexReleaseTests/DataTests/SwarmTest.cs index 427085a5..473653e4 100644 --- a/Tests/CodexReleaseTests/DataTests/SwarmTest.cs +++ b/Tests/CodexReleaseTests/DataTests/SwarmTest.cs @@ -7,15 +7,22 @@ using Utils; namespace CodexReleaseTests.DataTests { - [TestFixture] + [TestFixture(2, 10)] + [TestFixture(5, 20)] + [TestFixture(10, 50)] public class SwarmTests : AutoBootstrapDistTest { + private readonly int numberOfNodes; + private readonly int filesizeMb; + + public SwarmTests(int numberOfNodes, int filesizeMb) + { + this.numberOfNodes = numberOfNodes; + this.filesizeMb = filesizeMb; + } + [Test] - [Combinatorial] - public void SmallSwarm( - [Values(2)] int numberOfNodes, - [Values(10)] int filesizeMb - ) + public void Swarm() { var filesize = filesizeMb.MB(); var nodes = StartCodex(numberOfNodes); @@ -28,11 +35,7 @@ namespace CodexReleaseTests.DataTests } [Test] - [Combinatorial] - public void StreamlessSmallSwarm( - [Values(2)] int numberOfNodes, - [Values(10)] int filesizeMb - ) + public void StreamlessSwarm() { var filesize = filesizeMb.MB(); var nodes = StartCodex(numberOfNodes); From c98cf1ffc49109f41ee7b6a3b2d00c5bfef2f5b4 Mon Sep 17 00:00:00 2001 From: ThatBen Date: Thu, 5 Jun 2025 15:27:06 +0200 Subject: [PATCH 14/15] fixes naming for parameterised fixtures --- Framework/KubernetesWorkflow/K8sNameUtils.cs | 4 +++- Tests/DistTestCore/NameUtils.cs | 9 +++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/Framework/KubernetesWorkflow/K8sNameUtils.cs b/Framework/KubernetesWorkflow/K8sNameUtils.cs index 2c9b1e52..5be69f7f 100644 --- a/Framework/KubernetesWorkflow/K8sNameUtils.cs +++ b/Framework/KubernetesWorkflow/K8sNameUtils.cs @@ -22,7 +22,9 @@ .Replace("\\", "-") .Replace("[", "-") .Replace("]", "-") - .Replace(",", "-"); + .Replace(",", "-") + .Replace("(", "-") + .Replace(")", "-"); if (result.Length > maxLength) result = result.Substring(0, maxLength); result = result.Trim('-'); diff --git a/Tests/DistTestCore/NameUtils.cs b/Tests/DistTestCore/NameUtils.cs index 44919d51..c742ceec 100644 --- a/Tests/DistTestCore/NameUtils.cs +++ b/Tests/DistTestCore/NameUtils.cs @@ -28,10 +28,11 @@ namespace DistTestCore public static string GetRawFixtureName() { var test = TestContext.CurrentContext.Test; - if (test.ClassName!.Contains("AdhocContext")) return "none"; - var className = test.ClassName!.Substring(test.ClassName.LastIndexOf('.') + 1); - className += FormatArguments(test); - return className.Replace('.', '-'); + var fullName = test.FullName; + if (fullName.Contains("AdhocContext")) return "none"; + var name = fullName.Substring(0, fullName.LastIndexOf('.')); + name += FormatArguments(test); + return name.Replace('.', '-').Replace(',', '-'); } public static string GetCategoryName() From b7781a6eaee440e279fdc010fca180a3cd3e43b9 Mon Sep 17 00:00:00 2001 From: ThatBen Date: Thu, 5 Jun 2025 17:14:27 +0200 Subject: [PATCH 15/15] Makes WaitForFailed state look for "Errored" state response --- ProjectPlugins/CodexClient/StoragePurchaseContract.cs | 4 ++-- Tests/CodexReleaseTests/MarketTests/FinishTest.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ProjectPlugins/CodexClient/StoragePurchaseContract.cs b/ProjectPlugins/CodexClient/StoragePurchaseContract.cs index 7b37899a..29924830 100644 --- a/ProjectPlugins/CodexClient/StoragePurchaseContract.cs +++ b/ProjectPlugins/CodexClient/StoragePurchaseContract.cs @@ -124,7 +124,7 @@ namespace CodexClient ); } - WaitForStorageContractState(timeout, StoragePurchaseState.Failed); + WaitForStorageContractState(timeout, StoragePurchaseState.Errored); } private TimeSpan TimeNeededToFailEnoughProofsToFreeASlot(IMarketplaceConfigInput config) @@ -157,7 +157,7 @@ namespace CodexClient hooks.OnStorageContractUpdated(purchaseStatus); } - if (lastState == StoragePurchaseState.Errored) + if (desiredState != StoragePurchaseState.Errored && lastState == StoragePurchaseState.Errored) { FrameworkAssert.Fail("Contract errored: " + statusJson); } diff --git a/Tests/CodexReleaseTests/MarketTests/FinishTest.cs b/Tests/CodexReleaseTests/MarketTests/FinishTest.cs index 87df023c..6f97773b 100644 --- a/Tests/CodexReleaseTests/MarketTests/FinishTest.cs +++ b/Tests/CodexReleaseTests/MarketTests/FinishTest.cs @@ -6,7 +6,7 @@ using Utils; namespace CodexReleaseTests.MarketTests { [TestFixture(5, 3, 1)] - [TestFixture(10, 20, 10)] + [TestFixture(10, 8, 4)] public class FinishTest : MarketplaceAutoBootstrapDistTest { public FinishTest(int hosts, int slots, int tolerance)