├── .DS_Store ├── .gitattributes ├── .gitignore ├── .gitmodules ├── AzureIndexer ├── .travis.yml ├── AzureIndexer.sln ├── AzureIndexer.sln.DotSettings ├── Stratis.Features.AzureIndexer.Tests │ ├── AddressTokenTransactionEntryTests.cs │ ├── App.config │ ├── ChainBuilder.cs │ ├── Data │ │ ├── BigTransaction.txt │ │ ├── blocks │ │ │ ├── StoreLock │ │ │ └── blk00000.dat │ │ ├── blocks2 │ │ │ └── blk00000.dat │ │ └── openasset-known-tx.json │ ├── IndexerTester.cs │ ├── KnownNetworks.cs │ ├── LocalSettings.config │ ├── MiniNode.cs │ ├── Stratis.Features.AzureIndexer.Tests.csproj │ ├── TestClass.cs │ ├── TestUtils.cs │ └── xunit.runner.json ├── Stratis.Features.AzureIndexer │ ├── AnonymousEqualityComparer.cs │ ├── AzureIndexer.cs │ ├── AzureIndexerFeature.cs │ ├── AzureIndexerLoop.cs │ ├── AzureIndexerSettings.cs │ ├── BalanceId.cs │ ├── BalanceLocator.cs │ ├── BalanceQuery.cs │ ├── BalanceSheet.cs │ ├── BlockFetcher.cs │ ├── ChainBlockHeader.cs │ ├── Checkpoint.cs │ ├── CoinCollection.cs │ ├── Converters │ │ ├── ScriptJsonConverter.cs │ │ └── WalletRuleConverter.cs │ ├── Crc32.cs │ ├── CustomThreadPoolTaskScheduler.cs │ ├── Entities │ │ ├── AddressTokenTransactionEntry.cs │ │ ├── BroadcastedTransaction.cs │ │ ├── ChainPartEntry.cs │ │ ├── SmartContactDetailsEntry.cs │ │ ├── SmartContactEntry.cs │ │ ├── TransactionEntry.cs │ │ └── WalletRuleEntry.cs │ ├── Exceptions.resources │ ├── ExponentialBackoff.cs │ ├── FastEncoder.cs │ ├── Helpers │ │ ├── ChainChangeEntryExtensions.cs │ │ ├── CloudTableExtensions.cs │ │ ├── ConsensusChainIndexerExtensions.cs │ │ ├── Extensions.cs │ │ ├── Helper.cs │ │ └── IFullNodeBuilderExtensions.cs │ ├── IIndexed.cs │ ├── IndexTasks │ │ ├── BulkImport.cs │ │ ├── IIndexTask.cs │ │ ├── IndexBalanceTask.cs │ │ ├── IndexBlocksTask.cs │ │ ├── IndexTableEntitiesTask.cs │ │ ├── IndexTableEntitiesTaskBase.cs │ │ ├── IndexTask.cs │ │ ├── IndexTokensTask.cs │ │ └── IndexTransactionsTask.cs │ ├── IndexerClient.cs │ ├── IndexerConfiguration.cs │ ├── IndexerConfigurationErrorsException.cs │ ├── IndexerTrace.cs │ ├── LoadingTransactionTask.cs │ ├── MatchedRule.cs │ ├── MultiValueDictionary.cs │ ├── OrderedBalanceChange.cs │ ├── Properties.cs │ ├── PushNuget.ps1 │ ├── Repositories │ │ ├── CheckpointRepository.cs │ │ ├── IBlocksRepository.cs │ │ ├── IndexerColoredTransactionRepository.cs │ │ └── IndexerTransactionRepository.cs │ ├── ScriptRule.cs │ ├── Spendable.cs │ ├── Stratis.Features.AzureIndexer.csproj │ ├── TableOperationHttpWebRequestFactory.cs │ ├── Tokens │ │ ├── LogDeserializer.cs │ │ ├── TokenDetailProvider.cs │ │ └── TokenIdentifier.cs │ ├── WalletRule.cs │ ├── WalletRuleEntryCollection.cs │ ├── app.config │ └── styelcop.json ├── Stratis.IndexerD │ ├── Program.cs │ ├── Properties │ │ └── launchSettings.json │ └── Stratis.IndexerD.csproj ├── StratisLibs │ ├── NBitcoin.dll │ ├── Stratis.Bitcoin.Features.SmartContracts.dll │ ├── Stratis.Sidechains.Networks.dll │ ├── Stratis.SmartContracts.CLR.Validation.dll │ ├── Stratis.SmartContracts.CLR.dll │ ├── Stratis.SmartContracts.Core.dll │ ├── Stratis.SmartContracts.Networks.dll │ └── Stratis.SmartContracts.RuntimeObserver.dll ├── appveyor.yml └── build.sh ├── BlockExplorer-UI ├── .editorconfig ├── .gitignore ├── README.md ├── angular.json ├── e2e │ ├── protractor.conf.js │ ├── src │ │ ├── app.e2e-spec.ts │ │ └── app.po.ts │ └── tsconfig.e2e.json ├── package-lock.json ├── package.json ├── src │ ├── app │ │ ├── app-routing.module.ts │ │ ├── app.component.html │ │ ├── app.component.scss │ │ ├── app.component.spec.ts │ │ ├── app.component.ts │ │ ├── app.module.ts │ │ ├── components │ │ │ └── menu-bar │ │ │ │ ├── menu-bar.component.html │ │ │ │ ├── menu-bar.component.scss │ │ │ │ ├── menu-bar.component.spec.ts │ │ │ │ └── menu-bar.component.ts │ │ ├── services │ │ │ ├── api.service.spec.ts │ │ │ ├── api.service.ts │ │ │ ├── search-text.service.spec.ts │ │ │ └── search-text.service.ts │ │ └── sub-modules │ │ │ ├── contracts │ │ │ ├── components │ │ │ │ └── contracts │ │ │ │ │ ├── contracts.component.html │ │ │ │ │ ├── contracts.component.scss │ │ │ │ │ ├── contracts.component.spec.ts │ │ │ │ │ ├── contracts.component.ts │ │ │ │ │ └── contracts.page.ts │ │ │ └── contracts.module.ts │ │ │ └── transactions │ │ │ └── transactions.module.ts │ ├── assets │ │ ├── .gitkeep │ │ ├── fonts │ │ │ ├── MaterialIcons-Regular.eot │ │ │ ├── MaterialIcons-Regular.ijmap │ │ │ ├── MaterialIcons-Regular.svg │ │ │ ├── MaterialIcons-Regular.ttf │ │ │ ├── MaterialIcons-Regular.woff │ │ │ └── MaterialIcons-Regular.woff2 │ │ └── images │ │ │ └── logo.svg │ ├── browserslist │ ├── environments │ │ ├── environment.prod.ts │ │ └── environment.ts │ ├── favicon.ico │ ├── index.html │ ├── karma.conf.js │ ├── main.ts │ ├── polyfills.ts │ ├── styling │ │ ├── scss │ │ │ ├── _alert.scss │ │ │ ├── _badge.scss │ │ │ ├── _breadcrumb.scss │ │ │ ├── _button-group.scss │ │ │ ├── _buttons.scss │ │ │ ├── _card.scss │ │ │ ├── _carousel.scss │ │ │ ├── _close.scss │ │ │ ├── _code.scss │ │ │ ├── _custom-forms.scss │ │ │ ├── _custom.scss │ │ │ ├── _dropdown.scss │ │ │ ├── _fonts.scss │ │ │ ├── _forms.scss │ │ │ ├── _functions.scss │ │ │ ├── _grid.scss │ │ │ ├── _images.scss │ │ │ ├── _input-group.scss │ │ │ ├── _jumbotron.scss │ │ │ ├── _list-group.scss │ │ │ ├── _media.scss │ │ │ ├── _mixins.scss │ │ │ ├── _modal.scss │ │ │ ├── _nav.scss │ │ │ ├── _navbar.scss │ │ │ ├── _pagination.scss │ │ │ ├── _popover.scss │ │ │ ├── _print.scss │ │ │ ├── _progress.scss │ │ │ ├── _reboot.scss │ │ │ ├── _root.scss │ │ │ ├── _tables.scss │ │ │ ├── _tooltip.scss │ │ │ ├── _transitions.scss │ │ │ ├── _type.scss │ │ │ ├── _utilities.scss │ │ │ ├── _variables.scss │ │ │ ├── bootstrap-grid.scss │ │ │ ├── bootstrap-reboot.scss │ │ │ ├── bootstrap.scss │ │ │ ├── mixins │ │ │ │ ├── _alert.scss │ │ │ │ ├── _background-variant.scss │ │ │ │ ├── _badge.scss │ │ │ │ ├── _border-radius.scss │ │ │ │ ├── _box-shadow.scss │ │ │ │ ├── _breakpoints.scss │ │ │ │ ├── _buttons.scss │ │ │ │ ├── _caret.scss │ │ │ │ ├── _clearfix.scss │ │ │ │ ├── _float.scss │ │ │ │ ├── _forms.scss │ │ │ │ ├── _gradients.scss │ │ │ │ ├── _grid-framework.scss │ │ │ │ ├── _grid.scss │ │ │ │ ├── _hover.scss │ │ │ │ ├── _image.scss │ │ │ │ ├── _list-group.scss │ │ │ │ ├── _lists.scss │ │ │ │ ├── _nav-divider.scss │ │ │ │ ├── _pagination.scss │ │ │ │ ├── _reset-text.scss │ │ │ │ ├── _resize.scss │ │ │ │ ├── _screen-reader.scss │ │ │ │ ├── _size.scss │ │ │ │ ├── _table-row.scss │ │ │ │ ├── _text-emphasis.scss │ │ │ │ ├── _text-hide.scss │ │ │ │ ├── _text-truncate.scss │ │ │ │ ├── _transition.scss │ │ │ │ └── _visibility.scss │ │ │ └── utilities │ │ │ │ ├── _align.scss │ │ │ │ ├── _background.scss │ │ │ │ ├── _borders.scss │ │ │ │ ├── _clearfix.scss │ │ │ │ ├── _display.scss │ │ │ │ ├── _embed.scss │ │ │ │ ├── _flex.scss │ │ │ │ ├── _float.scss │ │ │ │ ├── _position.scss │ │ │ │ ├── _screenreaders.scss │ │ │ │ ├── _shadows.scss │ │ │ │ ├── _sizing.scss │ │ │ │ ├── _spacing.scss │ │ │ │ ├── _text.scss │ │ │ │ └── _visibility.scss │ │ ├── styles.css │ │ └── styles.css.map │ ├── test.ts │ ├── tsconfig.app.json │ ├── tsconfig.spec.json │ └── tslint.json ├── tsconfig.json └── tslint.json ├── BlockExplorer.sln ├── ExplorerDefinition.md ├── FaucetSite ├── FaucetSite.sln └── FaucetSite │ ├── Controllers │ ├── FaucetController.cs │ └── HomeController.cs │ ├── FaucetSite.csproj │ ├── Lib │ ├── ICaptchaClient.cs │ ├── IWalletUtils.cs │ ├── StratisFullNodeClient │ │ ├── IStratisWalletAPI.cs │ │ ├── request │ │ │ ├── BuildTransaction.cs │ │ │ ├── CreateWallet.cs │ │ │ └── SendTransaction.cs │ │ └── response │ │ │ ├── Balances.cs │ │ │ ├── Error.cs │ │ │ ├── Errors.cs │ │ │ └── Transaction.cs │ ├── TransactionQueue.cs │ └── WalletUtils.cs │ ├── Models │ ├── Balance.cs │ ├── ErrorViewModel.cs │ ├── Recipient.cs │ └── Transaction.cs │ ├── Program.cs │ ├── Properties │ └── launchSettings.json │ ├── Startup.cs │ ├── Views │ ├── Home │ │ └── Index.cshtml │ ├── Shared │ │ ├── Error.cshtml │ │ ├── _Layout.cshtml │ │ └── _ValidationScriptsPartial.cshtml │ ├── _ViewImports.cshtml │ └── _ViewStart.cshtml │ ├── appsettings.Development.json │ ├── appsettings.json │ ├── bundleconfig.json │ └── wwwroot │ ├── css │ ├── site.css │ └── site.min.css │ ├── favicon.png │ ├── images │ ├── background.jpg │ ├── banner1.svg │ ├── banner2.svg │ ├── banner3.svg │ └── banner4.svg │ ├── js │ ├── site.js │ └── site.min.js │ └── lib │ ├── bootstrap │ ├── .bower.json │ ├── LICENSE │ └── dist │ │ ├── css │ │ ├── bootstrap-theme.css │ │ ├── bootstrap-theme.css.map │ │ ├── bootstrap-theme.min.css │ │ ├── bootstrap-theme.min.css.map │ │ ├── bootstrap.css │ │ ├── bootstrap.css.map │ │ ├── bootstrap.min.css │ │ └── bootstrap.min.css.map │ │ ├── fonts │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.svg │ │ ├── glyphicons-halflings-regular.ttf │ │ ├── glyphicons-halflings-regular.woff │ │ └── glyphicons-halflings-regular.woff2 │ │ └── js │ │ ├── bootstrap.js │ │ ├── bootstrap.min.js │ │ └── npm.js │ ├── jquery-validation-unobtrusive │ ├── .bower.json │ ├── jquery.validate.unobtrusive.js │ └── jquery.validate.unobtrusive.min.js │ ├── jquery-validation │ ├── .bower.json │ ├── LICENSE.md │ └── dist │ │ ├── additional-methods.js │ │ ├── additional-methods.min.js │ │ ├── jquery.validate.js │ │ └── jquery.validate.min.js │ ├── jquery │ ├── .bower.json │ ├── LICENSE.txt │ └── dist │ │ ├── jquery.js │ │ ├── jquery.min.js │ │ └── jquery.min.map │ ├── knockout.punches │ └── knockout.punches.min.js │ └── knockout │ ├── .bower.json │ ├── Gruntfile.js │ ├── LICENSE │ ├── README.md │ ├── bower.json │ ├── dist │ ├── knockout.debug.js │ └── knockout.js │ ├── package.json │ └── src │ ├── binding │ ├── bindingAttributeSyntax.js │ ├── bindingProvider.js │ ├── defaultBindings │ │ ├── attr.js │ │ ├── checked.js │ │ ├── click.js │ │ ├── css.js │ │ ├── enableDisable.js │ │ ├── event.js │ │ ├── foreach.js │ │ ├── hasfocus.js │ │ ├── html.js │ │ ├── ifIfnotWith.js │ │ ├── options.js │ │ ├── selectedOptions.js │ │ ├── style.js │ │ ├── submit.js │ │ ├── text.js │ │ ├── textInput.js │ │ ├── uniqueName.js │ │ ├── value.js │ │ └── visible.js │ ├── editDetection │ │ ├── arrayToDomNodeChildren.js │ │ └── compareArrays.js │ ├── expressionRewriting.js │ └── selectExtensions.js │ ├── components │ ├── componentBinding.js │ ├── customElements.js │ ├── defaultLoader.js │ └── loaderRegistry.js │ ├── google-closure-compiler-utils.js │ ├── memoization.js │ ├── namespace.js │ ├── options.js │ ├── subscribables │ ├── dependencyDetection.js │ ├── dependentObservable.js │ ├── extenders.js │ ├── mappingHelpers.js │ ├── observable.js │ ├── observableArray.changeTracking.js │ ├── observableArray.js │ └── subscribable.js │ ├── tasks.js │ ├── templating │ ├── jquery.tmpl │ │ └── jqueryTmplTemplateEngine.js │ ├── native │ │ └── nativeTemplateEngine.js │ ├── templateEngine.js │ ├── templateRewriting.js │ ├── templateSources.js │ └── templating.js │ ├── utils.domData.js │ ├── utils.domManipulation.js │ ├── utils.domNodeDisposal.js │ ├── utils.js │ ├── version.js │ └── virtualElements.js ├── GitVersion.yml ├── IndexStore ├── .travis.yml ├── IndexStore.sln ├── Stratis.Bitcoin.Features.IndexStore.Tests │ ├── IndexRepositoryTest.cs │ ├── IndexStoreBehaviorTest.cs │ ├── IndexStoreCachePerformanceCounterTest.cs │ ├── IndexStoreCachePerformanceSnapshotTest.cs │ ├── IndexStoreCacheTest.cs │ ├── IndexStoreRPCControllerTest.cs │ ├── IndexStoreRepositoryPerformanceCounterTest.cs │ ├── IndexStoreRepositoryPerformanceSnapshotTest.cs │ ├── IndexerTests.cs │ ├── MemoryCacheStub.cs │ ├── Settings.StyleCop │ ├── Stratis.Bitcoin.Features.IndexStore.Tests.csproj │ ├── TestBase.cs │ └── xunit.runner.json ├── Stratis.Bitcoin.Features.IndexStore │ ├── Index.cs │ ├── IndexBlockPuller.cs │ ├── IndexRepository.cs │ ├── IndexSettings.cs │ ├── IndexStoreBehaviour.cs │ ├── IndexStoreCache.cs │ ├── IndexStoreCachePerformanceCounter.cs │ ├── IndexStoreException.cs │ ├── IndexStoreFeature.cs │ ├── IndexStoreLoop.cs │ ├── IndexStoreManager.cs │ ├── IndexStoreRPCController.cs │ ├── IndexStoreRepositoryPerformanceCounter.cs │ ├── IndexStoreSignaled.cs │ ├── Settings.StyleCop │ ├── Stratis.Bitcoin.Features.IndexStore.csproj │ └── readme.md ├── Stratis.IndexStoreD │ ├── Program.cs │ ├── Properties │ │ ├── AssemblyInfo.cs │ │ └── launchSettings.json │ └── Stratis.IndexStoreD.csproj ├── appveyor.yml └── build.sh ├── LICENSE ├── QBitNinja ├── ._QBitNinja.sln ├── .nuget │ ├── NuGet.Config │ ├── NuGet.exe │ └── NuGet.targets ├── AzureIndexer.Api │ ├── .config │ │ └── dotnet-tools.json │ ├── AzureIndexer.Api.csproj │ ├── Controllers │ │ ├── BalancesController.cs │ │ ├── BlocksController.cs │ │ ├── FinderController.cs │ │ ├── MainController.cs │ │ ├── SmartContractsController.cs │ │ ├── TokensController.cs │ │ └── TransactionsController.cs │ ├── Infrastructure │ │ ├── ActionDisposable.cs │ │ ├── BalanceSearchService.cs │ │ ├── BlockSearchService.cs │ │ ├── BuildChainCache.cs │ │ ├── CacheBlocksRepository.cs │ │ ├── ChainCacheProvider.cs │ │ ├── ChainIndexerExtensions.cs │ │ ├── Extensions.cs │ │ ├── GlobalExceptionFilter.cs │ │ ├── HttpResponseException.cs │ │ ├── IBalanceSearchService.cs │ │ ├── IBlockSearchService.cs │ │ ├── ISmartContractSearchService.cs │ │ ├── ITransactionSearchService.cs │ │ ├── ListenerTrace.cs │ │ ├── QBitNinjaConfiguration.cs │ │ ├── Scope.cs │ │ ├── SenderRetriever.cs │ │ ├── SmartContractSearchService.cs │ │ ├── StringExtensions.cs │ │ ├── TokenQueries.cs │ │ ├── TokenSearchService.cs │ │ ├── TransactionSearchService.cs │ │ ├── UpdateChainListener.cs │ │ ├── UpdateStatsListener.cs │ │ ├── WalletRepository.cs │ │ ├── WebApiExceptionActionFilter.cs │ │ └── WhatIsIt.cs │ ├── IoC │ │ └── AutomapperModule.cs │ ├── JsonConverters │ │ ├── BalanceLocatorJsonConverter.cs │ │ ├── EnumAliasJsonConverter.cs │ │ ├── EnumTypeJsonConverter.cs │ │ └── TransactionJsonConverter.cs │ ├── ModelBinders │ │ ├── BalanceIdModelBinder.cs │ │ ├── BalanceLocatorModelBinder.cs │ │ ├── Base58ModelBinder.cs │ │ ├── BitcoinSerializableModelBinder.cs │ │ ├── BlockFeatureModelBinder.cs │ │ └── UIntModelBinding.cs │ ├── Models │ │ ├── BalanceModel.cs │ │ ├── BalanceSelector.cs │ │ ├── BlockFeature.cs │ │ ├── BlockRange.cs │ │ ├── BlockResponse.cs │ │ ├── BroadcastResponse.cs │ │ ├── ChainStatus.cs │ │ ├── ChainTable.cs │ │ ├── CrudTable.cs │ │ ├── DataFormat.cs │ │ ├── ExtendedBlockInformation.cs │ │ ├── HelpModel.cs │ │ ├── KeySet.cs │ │ ├── NewBlockNotificationData.cs │ │ ├── NewBlockSubscription.cs │ │ ├── NewTransactionNotificationData.cs │ │ ├── NewTransactionSubscription.cs │ │ ├── NotificationData.cs │ │ ├── QBitNinjaException.cs │ │ ├── Response │ │ │ └── Responses.cs │ │ ├── Subscription.cs │ │ ├── Tokens │ │ │ ├── GetTokenTransactionsRequest.cs │ │ │ └── TokenDetail.cs │ │ ├── TransactionResponse.cs │ │ ├── VersionStatsResponse.cs │ │ ├── WalletModel.cs │ │ └── WhatIsItModels.cs │ ├── Notifications │ │ ├── IndexNotificationsTask.cs │ │ ├── IndexerBlocksRepository.cs │ │ ├── MessageControl.cs │ │ ├── Notification.cs │ │ ├── Notify.cs │ │ ├── QBitNinjaNodeListener.cs │ │ ├── QueueCreation.cs │ │ ├── SubscriptionChange.cs │ │ ├── SubscriptionCollection.cs │ │ ├── SubscriptionCreation.cs │ │ └── TopicCreation.cs │ ├── Program.cs │ ├── Properties │ │ ├── PublishProfiles │ │ │ ├── StratisIntTestINDX - FTP.pubxml │ │ │ ├── StratisIntTestINDX - ReadOnly - FTP.pubxml │ │ │ └── StratisIntTestINDX - Web Deploy.pubxml │ │ └── launchSettings.json │ ├── Startup.cs │ ├── appsettings.Development.json │ └── appsettings.json ├── Common │ ├── Class1.cs │ └── Common.csproj ├── LICENSE ├── Newtonsoft.Json(portable) │ ├── Bson │ │ ├── BsonBinaryType.cs │ │ ├── BsonBinaryWriter.cs │ │ ├── BsonObjectId.cs │ │ ├── BsonReader.cs │ │ ├── BsonToken.cs │ │ ├── BsonType.cs │ │ └── BsonWriter.cs │ ├── ConstructorHandling.cs │ ├── Converters │ │ ├── BinaryConverter.cs │ │ ├── BsonObjectIdConverter.cs │ │ ├── CustomCreationConverter.cs │ │ ├── DataSetConverter.cs │ │ ├── DataTableConverter.cs │ │ ├── DateTimeConverterBase.cs │ │ ├── DiscriminatedUnionConverter.cs │ │ ├── EntityKeyMemberConverter.cs │ │ ├── ExpandoObjectConverter.cs │ │ ├── IsoDateTimeConverter.cs │ │ ├── JavaScriptDateTimeConverter.cs │ │ ├── KeyValuePairConverter.cs │ │ ├── RegexConverter.cs │ │ ├── StringEnumConverter.cs │ │ ├── VersionConverter.cs │ │ └── XmlNodeConverter.cs │ ├── DateFormatHandling.cs │ ├── DateParseHandling.cs │ ├── DateTimeZoneHandling.cs │ ├── DefaultValueHandling.cs │ ├── FloatFormatHandling.cs │ ├── FloatParseHandling.cs │ ├── FormatterAssemblyStyle.cs │ ├── Formatting.cs │ ├── IJsonLineInfo.cs │ ├── JsonArrayAttribute.cs │ ├── JsonConstructorAttribute.cs │ ├── JsonContainerAttribute.cs │ ├── JsonConvert.cs │ ├── JsonConverter.cs │ ├── JsonConverterAttribute.cs │ ├── JsonConverterCollection.cs │ ├── JsonDictionaryAttribute.cs │ ├── JsonException.cs │ ├── JsonExtensionDataAttribute.cs │ ├── JsonIgnoreAttribute.cs │ ├── JsonObjectAttribute.cs │ ├── JsonPosition.cs │ ├── JsonPropertyAttribute.cs │ ├── JsonReader.cs │ ├── JsonReaderException.cs │ ├── JsonSerializationException.cs │ ├── JsonSerializer.cs │ ├── JsonSerializerSettings.cs │ ├── JsonTextReader.cs │ ├── JsonTextWriter.cs │ ├── JsonToken.cs │ ├── JsonValidatingReader.cs │ ├── JsonWriter.cs │ ├── JsonWriterException.cs │ ├── Linq │ │ ├── Extensions.cs │ │ ├── IJEnumerable.cs │ │ ├── JArray.cs │ │ ├── JConstructor.cs │ │ ├── JContainer.cs │ │ ├── JEnumerable.cs │ │ ├── JObject.cs │ │ ├── JProperty.cs │ │ ├── JPropertyDescriptor.cs │ │ ├── JPropertyKeyedCollection.cs │ │ ├── JRaw.cs │ │ ├── JToken.cs │ │ ├── JTokenEqualityComparer.cs │ │ ├── JTokenReader.cs │ │ ├── JTokenType.cs │ │ ├── JTokenWriter.cs │ │ ├── JValue.cs │ │ ├── JsonMergeSettings.cs │ │ ├── JsonPath │ │ │ ├── ArrayIndexFilter.cs │ │ │ ├── ArrayMultipleIndexFilter.cs │ │ │ ├── ArraySliceFilter.cs │ │ │ ├── FieldFilter.cs │ │ │ ├── FieldMultipleFilter.cs │ │ │ ├── JPath.cs │ │ │ ├── PathFilter.cs │ │ │ ├── QueryExpression.cs │ │ │ ├── QueryFilter.cs │ │ │ └── ScanFilter.cs │ │ └── MergeArrayHandling.cs │ ├── MemberSerialization.cs │ ├── MetadataPropertyHandling.cs │ ├── MissingMemberHandling.cs │ ├── Newtonsoft.Json.Portable.csproj │ ├── NullValueHandling.cs │ ├── ObjectCreationHandling.cs │ ├── PreserveReferencesHandling.cs │ ├── Properties │ │ └── AssemblyInfo.cs │ ├── ReferenceLoopHandling.cs │ ├── Required.cs │ ├── Schema │ │ ├── Extensions.cs │ │ ├── JsonSchema.cs │ │ ├── JsonSchemaBuilder.cs │ │ ├── JsonSchemaConstants.cs │ │ ├── JsonSchemaException.cs │ │ ├── JsonSchemaGenerator.cs │ │ ├── JsonSchemaModel.cs │ │ ├── JsonSchemaModelBuilder.cs │ │ ├── JsonSchemaNode.cs │ │ ├── JsonSchemaNodeCollection.cs │ │ ├── JsonSchemaResolver.cs │ │ ├── JsonSchemaType.cs │ │ ├── JsonSchemaWriter.cs │ │ ├── UndefinedSchemaIdHandling.cs │ │ ├── ValidationEventArgs.cs │ │ └── ValidationEventHandler.cs │ ├── Serialization │ │ ├── CachedAttributeGetter.cs │ │ ├── CamelCasePropertyNamesContractResolver.cs │ │ ├── DefaultContractResolver.cs │ │ ├── DefaultReferenceResolver.cs │ │ ├── DefaultSerializationBinder.cs │ │ ├── DiagnosticsTraceWriter.cs │ │ ├── DynamicValueProvider.cs │ │ ├── ErrorContext.cs │ │ ├── ErrorEventArgs.cs │ │ ├── ExpressionValueProvider.cs │ │ ├── IContractResolver.cs │ │ ├── IReferenceResolver.cs │ │ ├── ITraceWriter.cs │ │ ├── IValueProvider.cs │ │ ├── JsonArrayContract.cs │ │ ├── JsonContainerContract.cs │ │ ├── JsonContract.cs │ │ ├── JsonDictionaryContract.cs │ │ ├── JsonDynamicContract.cs │ │ ├── JsonFormatterConverter.cs │ │ ├── JsonISerializableContract.cs │ │ ├── JsonLinqContract.cs │ │ ├── JsonObjectContract.cs │ │ ├── JsonPrimitiveContract.cs │ │ ├── JsonProperty.cs │ │ ├── JsonPropertyCollection.cs │ │ ├── JsonSerializerInternalBase.cs │ │ ├── JsonSerializerInternalReader.cs │ │ ├── JsonSerializerInternalWriter.cs │ │ ├── JsonSerializerProxy.cs │ │ ├── JsonStringContract.cs │ │ ├── JsonTypeReflector.cs │ │ ├── MemoryTraceWriter.cs │ │ ├── ObjectConstructor.cs │ │ ├── OnErrorAttribute.cs │ │ ├── ReflectionValueProvider.cs │ │ ├── TraceJsonReader.cs │ │ └── TraceJsonWriter.cs │ ├── SerializationBinder.cs │ ├── StringEscapeHandling.cs │ ├── TraceLevel.cs │ ├── TypeNameHandling.cs │ ├── Utilities │ │ ├── Base64Encoder.cs │ │ ├── BidirectionalDictionary.cs │ │ ├── CollectionUtils.cs │ │ ├── CollectionWrapper.cs │ │ ├── ConvertUtils.cs │ │ ├── DateTimeParser.cs │ │ ├── DateTimeUtils.cs │ │ ├── DictionaryWrapper.cs │ │ ├── DynamicProxy.cs │ │ ├── DynamicProxyMetaObject.cs │ │ ├── DynamicReflectionDelegateFactory.cs │ │ ├── DynamicUtils.cs │ │ ├── EnumUtils.cs │ │ ├── EnumValue.cs │ │ ├── ExpressionReflectionDelegateFactory.cs │ │ ├── FSharpUtils.cs │ │ ├── ILGeneratorExtensions.cs │ │ ├── ImmutableCollectionsUtils.cs │ │ ├── JavaScriptUtils.cs │ │ ├── LateBoundReflectionDelegateFactory.cs │ │ ├── LinqBridge.cs │ │ ├── MathUtils.cs │ │ ├── MethodCall.cs │ │ ├── MiscellaneousUtils.cs │ │ ├── PropertyNameTable.cs │ │ ├── ReflectionDelegateFactory.cs │ │ ├── ReflectionObject.cs │ │ ├── ReflectionUtils.cs │ │ ├── StringBuffer.cs │ │ ├── StringReference.cs │ │ ├── StringUtils.cs │ │ ├── ThreadSafeStore.cs │ │ ├── TypeExtensions.cs │ │ └── ValidationUtils.cs │ └── WriteState.cs ├── QBitNinja.Client.NETCore │ ├── QBitNinja.Client.NETCore.csproj │ └── global.json ├── QBitNinja.Client.Tests │ ├── Class1.cs │ ├── Properties │ │ └── AssemblyInfo.cs │ ├── QBitNinja.Client.Tests.csproj │ ├── app.config │ └── packages.config ├── QBitNinja.Client │ ├── LICENSE │ ├── QBitNinja.Client.Tokenized.nuspec │ ├── QBitNinja.Client.csproj │ ├── QBitNinjaClient.cs │ ├── app.config │ └── packages.config ├── QBitNinja.Listener.Console │ ├── App.config │ ├── Program.cs │ ├── Properties │ │ └── AssemblyInfo.cs │ ├── QBitNinja.Listener.Console.csproj │ └── packages.config ├── QBitNinja.Tests │ ├── AssertEx.cs │ ├── CanDo.cs │ ├── ChainBuilder.cs │ ├── ListenerTester.cs │ ├── NotificationTester.cs │ ├── Properties │ │ └── AssemblyInfo.cs │ ├── QBitNinja.Tests.csproj │ ├── ServerTester.cs │ ├── app.config │ └── packages.config ├── QBitNinja.sln ├── QBitNinja │ ├── ActionDisposable.cs │ ├── App_Start │ │ ├── RouteConfig.cs │ │ └── WebApiConfig.cs │ ├── CacheBlocksRepository.cs │ ├── ChainTable.cs │ ├── CompressionHandler.cs │ ├── Compressors.cs │ ├── Controllers │ │ ├── HelpController.cs │ │ └── MainController.cs │ ├── CrudTable.cs │ ├── Extensions.cs │ ├── FodyWeavers.xml │ ├── Global.asax │ ├── Global.asax.cs │ ├── GlobalExceptionFilter.cs │ ├── InitialIndexer.cs │ ├── JsonConverters │ │ ├── BalanceLocatorJsonConverter.cs │ │ ├── EnumAliasJsonConverter.cs │ │ └── EnumTypeJsonConverter.cs │ ├── ListenerTrace.cs │ ├── ModelBinders │ │ ├── BalanceIdModelBinder.cs │ │ ├── BalanceLocatorModelBinder.cs │ │ ├── Base58ModelBinder.cs │ │ ├── BitcoinSerializableModelBinder.cs │ │ ├── BlockFeatureModelBinder.cs │ │ └── UIntModelBinding.cs │ ├── Models │ │ ├── BalanceModel.cs │ │ ├── BalanceSelector.cs │ │ ├── BlockFeature.cs │ │ ├── BroadcastResponse.cs │ │ ├── ChainStatus.cs │ │ ├── DataFormat.cs │ │ ├── ExtendedBlockInformation.cs │ │ ├── GetBlockResponse.cs │ │ ├── GetTransactionResponse.cs │ │ ├── HelpModel.cs │ │ ├── KeySet.cs │ │ ├── NewBlockNotificationData.cs │ │ ├── NewBlockSubscription.cs │ │ ├── NewTransactionNotificationData.cs │ │ ├── NewTransactionSubscription.cs │ │ ├── NotificationData.cs │ │ ├── QBitNinjaException.cs │ │ ├── Subscription.cs │ │ ├── VersionStatsResponse.cs │ │ ├── WalletModel.cs │ │ └── WhatIsItModels.cs │ ├── Notifications │ │ ├── BroadcastedTransaction.cs │ │ ├── IndexNotificationsTask.cs │ │ ├── IndexerBlocksRepository.cs │ │ ├── Notification.cs │ │ ├── Notify.cs │ │ ├── QBitNinjaNodeListener.cs │ │ ├── QBitNinjaQueue.cs │ │ ├── QBitNinjaQueueBase.cs │ │ ├── QBitNinjaTopic.cs │ │ ├── QueueCreation.cs │ │ ├── SubscriptionChange.cs │ │ ├── SubscriptionCollection.cs │ │ ├── SubscriptionCreation.cs │ │ └── TopicCreation.cs │ ├── Properties │ │ └── AssemblyInfo.cs │ ├── QBitNinja.Tokenized.nuspec │ ├── QBitNinja.csproj │ ├── QBitNinjaConfiguration.cs │ ├── QBitNinjaDependencyResolver.cs │ ├── ReaderWriterLock.cs │ ├── Scope.cs │ ├── Serializer.cs │ ├── UpdateChainListener.cs │ ├── Views │ │ ├── Help │ │ │ └── Index.cshtml │ │ ├── Shared │ │ │ ├── Error.cshtml │ │ │ └── _Layout.cshtml │ │ ├── Web.config │ │ └── _ViewStart.cshtml │ ├── WalletRepository.cs │ ├── Web.Debug.config │ ├── Web.Release.config │ ├── Web.config │ ├── WhatIsIt.cs │ └── packages.config └── README.md ├── appveyor.yml ├── block-explorer-ui ├── .editorconfig ├── .gitignore ├── .prettierignore ├── .prettierrc ├── .vscode │ └── extensions.json ├── README.md ├── angular.json ├── apps │ ├── .gitkeep │ ├── explorer-e2e │ │ ├── protractor.conf.js │ │ ├── src │ │ │ ├── app.e2e-spec.ts │ │ │ └── app.po.ts │ │ └── tsconfig.e2e.json │ └── explorer │ │ ├── browserslist │ │ ├── karma.conf.js │ │ ├── src │ │ ├── app │ │ │ ├── +state │ │ │ │ ├── app-config.service.ts │ │ │ │ ├── app.actions.ts │ │ │ │ ├── app.effects.ts │ │ │ │ ├── app.facade.ts │ │ │ │ ├── app.reducer.ts │ │ │ │ └── app.selectors.ts │ │ │ ├── app.component.html │ │ │ ├── app.component.scss │ │ │ ├── app.component.spec.ts │ │ │ ├── app.component.ts │ │ │ └── app.module.ts │ │ ├── assets │ │ │ ├── .gitkeep │ │ │ ├── config │ │ │ │ └── config.json │ │ │ ├── images │ │ │ │ └── logo.svg │ │ │ └── styles │ │ │ │ ├── bootstrap.css │ │ │ │ └── styles-variables.scss │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── main.ts │ │ ├── polyfills.ts │ │ ├── styles.scss │ │ └── test.ts │ │ ├── tsconfig.app.json │ │ ├── tsconfig.spec.json │ │ └── tslint.json ├── karma.conf.js ├── libs │ ├── .gitkeep │ ├── shared │ │ ├── models │ │ │ ├── karma.conf.js │ │ │ ├── src │ │ │ │ ├── index.ts │ │ │ │ ├── lib │ │ │ │ │ ├── generated │ │ │ │ │ │ └── api.models.ts │ │ │ │ │ ├── shared-models.module.spec.ts │ │ │ │ │ └── shared-models.module.ts │ │ │ │ └── test.ts │ │ │ ├── tsconfig.lib.json │ │ │ ├── tsconfig.spec.json │ │ │ └── tslint.json │ │ └── utils │ │ │ ├── karma.conf.js │ │ │ ├── src │ │ │ ├── index.ts │ │ │ ├── lib │ │ │ │ ├── logger.service.ts │ │ │ │ ├── shared-utils.module.spec.ts │ │ │ │ └── shared-utils.module.ts │ │ │ └── test.ts │ │ │ ├── tsconfig.lib.json │ │ │ ├── tsconfig.spec.json │ │ │ └── tslint.json │ ├── state │ │ ├── global-state │ │ │ ├── karma.conf.js │ │ │ ├── src │ │ │ │ ├── index.ts │ │ │ │ ├── lib │ │ │ │ │ ├── +state │ │ │ │ │ │ ├── global.actions.ts │ │ │ │ │ │ ├── global.effects.ts │ │ │ │ │ │ ├── global.facade.ts │ │ │ │ │ │ ├── global.reducer.ts │ │ │ │ │ │ └── global.selectors.ts │ │ │ │ │ ├── services │ │ │ │ │ │ └── finder.service.ts │ │ │ │ │ ├── state-global-state.module.spec.ts │ │ │ │ │ └── state-global-state.module.ts │ │ │ │ └── test.ts │ │ │ ├── tsconfig.lib.json │ │ │ ├── tsconfig.spec.json │ │ │ └── tslint.json │ │ ├── smart-contracts-state │ │ │ ├── karma.conf.js │ │ │ ├── src │ │ │ │ ├── index.ts │ │ │ │ ├── lib │ │ │ │ │ ├── +state │ │ │ │ │ │ ├── smart-contracts.actions.ts │ │ │ │ │ │ ├── smart-contracts.effects.spec.ts │ │ │ │ │ │ ├── smart-contracts.effects.ts │ │ │ │ │ │ ├── smart-contracts.facade.spec.ts │ │ │ │ │ │ ├── smart-contracts.facade.ts │ │ │ │ │ │ ├── smart-contracts.reducer.spec.ts │ │ │ │ │ │ ├── smart-contracts.reducer.ts │ │ │ │ │ │ ├── smart-contracts.selectors.spec.ts │ │ │ │ │ │ └── smart-contracts.selectors.ts │ │ │ │ │ ├── state-smart-contracts-state.module.spec.ts │ │ │ │ │ └── state-smart-contracts-state.module.ts │ │ │ │ └── test.ts │ │ │ ├── tsconfig.lib.json │ │ │ ├── tsconfig.spec.json │ │ │ └── tslint.json │ │ ├── tokens-state │ │ │ ├── karma.conf.js │ │ │ ├── src │ │ │ │ ├── index.ts │ │ │ │ ├── lib │ │ │ │ │ ├── +state │ │ │ │ │ │ ├── tokens.actions.ts │ │ │ │ │ │ ├── tokens.effects.spec.ts │ │ │ │ │ │ ├── tokens.effects.ts │ │ │ │ │ │ ├── tokens.facade.spec.ts │ │ │ │ │ │ ├── tokens.facade.ts │ │ │ │ │ │ ├── tokens.reducer.spec.ts │ │ │ │ │ │ ├── tokens.reducer.ts │ │ │ │ │ │ ├── tokens.selectors.spec.ts │ │ │ │ │ │ └── tokens.selectors.ts │ │ │ │ │ ├── services │ │ │ │ │ │ ├── api-configuration.ts │ │ │ │ │ │ ├── base-service.ts │ │ │ │ │ │ ├── strict-http-response.ts │ │ │ │ │ │ ├── token-detail.ts │ │ │ │ │ │ ├── token-transaction-response.ts │ │ │ │ │ │ ├── tokens.service.spec.ts │ │ │ │ │ │ └── tokens.service.ts │ │ │ │ │ ├── state-tokens-state.module.spec.ts │ │ │ │ │ └── state-tokens-state.module.ts │ │ │ │ └── test.ts │ │ │ ├── tsconfig.lib.json │ │ │ ├── tsconfig.spec.json │ │ │ └── tslint.json │ │ └── transactions-state │ │ │ ├── karma.conf.js │ │ │ ├── src │ │ │ ├── index.ts │ │ │ ├── lib │ │ │ │ ├── +state │ │ │ │ │ ├── transactions.actions.ts │ │ │ │ │ ├── transactions.effects.ts │ │ │ │ │ ├── transactions.facade.ts │ │ │ │ │ ├── transactions.reducer.ts │ │ │ │ │ └── transactions.selectors.ts │ │ │ │ ├── services │ │ │ │ │ ├── balances.service.ts │ │ │ │ │ ├── blocks.service.ts │ │ │ │ │ └── transactions.service.ts │ │ │ │ ├── state-transactions-state.module.spec.ts │ │ │ │ └── state-transactions-state.module.ts │ │ │ └── test.ts │ │ │ ├── tsconfig.lib.json │ │ │ ├── tsconfig.spec.json │ │ │ └── tslint.json │ └── ui │ │ ├── layout │ │ ├── karma.conf.js │ │ ├── src │ │ │ ├── index.ts │ │ │ ├── lib │ │ │ │ ├── components │ │ │ │ │ ├── balance │ │ │ │ │ │ ├── balance.component.css │ │ │ │ │ │ ├── balance.component.html │ │ │ │ │ │ ├── balance.component.spec.ts │ │ │ │ │ │ └── balance.component.ts │ │ │ │ │ ├── breadcrumb │ │ │ │ │ │ ├── breadcrumb.component.css │ │ │ │ │ │ ├── breadcrumb.component.html │ │ │ │ │ │ ├── breadcrumb.component.spec.ts │ │ │ │ │ │ └── breadcrumb.component.ts │ │ │ │ │ ├── busy-indicator │ │ │ │ │ │ ├── busy-indicator.component.css │ │ │ │ │ │ ├── busy-indicator.component.html │ │ │ │ │ │ ├── busy-indicator.component.spec.ts │ │ │ │ │ │ └── busy-indicator.component.ts │ │ │ │ │ ├── menu-bar │ │ │ │ │ │ ├── menu-bar.component.css │ │ │ │ │ │ ├── menu-bar.component.html │ │ │ │ │ │ ├── menu-bar.component.spec.ts │ │ │ │ │ │ └── menu-bar.component.ts │ │ │ │ │ └── pager │ │ │ │ │ │ ├── pager.component.css │ │ │ │ │ │ ├── pager.component.html │ │ │ │ │ │ ├── pager.component.spec.ts │ │ │ │ │ │ └── pager.component.ts │ │ │ │ ├── ui-layout.module.spec.ts │ │ │ │ └── ui-layout.module.ts │ │ │ └── test.ts │ │ ├── tsconfig.lib.json │ │ ├── tsconfig.spec.json │ │ └── tslint.json │ │ ├── smart-contracts │ │ ├── karma.conf.js │ │ ├── src │ │ │ ├── index.ts │ │ │ ├── lib │ │ │ │ ├── components │ │ │ │ │ └── smart-contract-summary │ │ │ │ │ │ ├── smart-contract-summary.component.css │ │ │ │ │ │ ├── smart-contract-summary.component.html │ │ │ │ │ │ ├── smart-contract-summary.component.spec.ts │ │ │ │ │ │ └── smart-contract-summary.component.ts │ │ │ │ ├── ui-smart-contracts.module.spec.ts │ │ │ │ └── ui-smart-contracts.module.ts │ │ │ └── test.ts │ │ ├── tsconfig.lib.json │ │ ├── tsconfig.spec.json │ │ └── tslint.json │ │ ├── tokens │ │ ├── karma.conf.js │ │ ├── src │ │ │ ├── index.ts │ │ │ ├── lib │ │ │ │ ├── components │ │ │ │ │ ├── token-summary │ │ │ │ │ │ ├── token-summary.component.css │ │ │ │ │ │ ├── token-summary.component.html │ │ │ │ │ │ ├── token-summary.component.spec.ts │ │ │ │ │ │ └── token-summary.component.ts │ │ │ │ │ └── token-transactions-table │ │ │ │ │ │ ├── token-transactions-table.component.css │ │ │ │ │ │ ├── token-transactions-table.component.html │ │ │ │ │ │ ├── token-transactions-table.component.spec.ts │ │ │ │ │ │ └── token-transactions-table.component.ts │ │ │ │ ├── containers │ │ │ │ │ └── token-summary-page │ │ │ │ │ │ ├── token-summary-page.component.css │ │ │ │ │ │ ├── token-summary-page.component.html │ │ │ │ │ │ └── token-summary-page.component.ts │ │ │ │ ├── ui-tokens.module.spec.ts │ │ │ │ └── ui-tokens.module.ts │ │ │ └── test.ts │ │ ├── tsconfig.lib.json │ │ ├── tsconfig.spec.json │ │ └── tslint.json │ │ └── transactions │ │ ├── karma.conf.js │ │ ├── src │ │ ├── index.ts │ │ ├── lib │ │ │ ├── components │ │ │ │ ├── address-summary │ │ │ │ │ ├── address-summary.component.css │ │ │ │ │ ├── address-summary.component.html │ │ │ │ │ ├── address-summary.component.spec.ts │ │ │ │ │ └── address-summary.component.ts │ │ │ │ ├── block-summary │ │ │ │ │ ├── block-summary.component.css │ │ │ │ │ ├── block-summary.component.html │ │ │ │ │ ├── block-summary.component.spec.ts │ │ │ │ │ └── block-summary.component.ts │ │ │ │ ├── last-blocks │ │ │ │ │ ├── last-blocks.component.css │ │ │ │ │ ├── last-blocks.component.html │ │ │ │ │ ├── last-blocks.component.spec.ts │ │ │ │ │ └── last-blocks.component.ts │ │ │ │ ├── last-smart-contracts │ │ │ │ │ ├── last-smart-contracts.component.css │ │ │ │ │ ├── last-smart-contracts.component.html │ │ │ │ │ └── last-smart-contracts.component.ts │ │ │ │ ├── stats │ │ │ │ │ ├── stats.component.css │ │ │ │ │ ├── stats.component.html │ │ │ │ │ └── stats.component.ts │ │ │ │ ├── transaction-list-item │ │ │ │ │ ├── transaction-list-item.component.css │ │ │ │ │ ├── transaction-list-item.component.html │ │ │ │ │ ├── transaction-list-item.component.spec.ts │ │ │ │ │ └── transaction-list-item.component.ts │ │ │ │ ├── transaction-summary │ │ │ │ │ ├── transaction-summary.component.css │ │ │ │ │ ├── transaction-summary.component.html │ │ │ │ │ ├── transaction-summary.component.spec.ts │ │ │ │ │ └── transaction-summary.component.ts │ │ │ │ ├── transactions-list │ │ │ │ │ ├── transactions-list.component.css │ │ │ │ │ ├── transactions-list.component.html │ │ │ │ │ ├── transactions-list.component.spec.ts │ │ │ │ │ └── transactions-list.component.ts │ │ │ │ └── transactions-table │ │ │ │ │ ├── transactions-table.component.css │ │ │ │ │ ├── transactions-table.component.html │ │ │ │ │ ├── transactions-table.component.spec.ts │ │ │ │ │ └── transactions-table.component.ts │ │ │ ├── containers │ │ │ │ ├── address-summary-page │ │ │ │ │ ├── address-summary-page.component.css │ │ │ │ │ ├── address-summary-page.component.html │ │ │ │ │ ├── address-summary-page.component.spec.ts │ │ │ │ │ ├── address-summary-page.component.ts │ │ │ │ │ └── transactions-page │ │ │ │ │ │ ├── transactions-page.component.css │ │ │ │ │ │ ├── transactions-page.component.html │ │ │ │ │ │ ├── transactions-page.component.spec.ts │ │ │ │ │ │ └── transactions-page.component.ts │ │ │ │ ├── block-summary-page │ │ │ │ │ ├── block-summary-page.component.css │ │ │ │ │ ├── block-summary-page.component.html │ │ │ │ │ ├── block-summary-page.component.spec.ts │ │ │ │ │ └── block-summary-page.component.ts │ │ │ │ ├── not-found-page │ │ │ │ │ ├── not-found-page.component.css │ │ │ │ │ ├── not-found-page.component.html │ │ │ │ │ ├── not-found-page.component.spec.ts │ │ │ │ │ └── not-found-page.component.ts │ │ │ │ ├── transaction-summary-page │ │ │ │ │ ├── transaction-summary-page.component.css │ │ │ │ │ ├── transaction-summary-page.component.html │ │ │ │ │ ├── transaction-summary-page.component.spec.ts │ │ │ │ │ └── transaction-summary-page.component.ts │ │ │ │ └── transactions-page │ │ │ │ │ ├── transactions-page.component.css │ │ │ │ │ ├── transactions-page.component.html │ │ │ │ │ ├── transactions-page.component.spec.ts │ │ │ │ │ └── transactions-page.component.ts │ │ │ ├── ui-transactions.module.spec.ts │ │ │ └── ui-transactions.module.ts │ │ └── test.ts │ │ ├── tsconfig.lib.json │ │ ├── tsconfig.spec.json │ │ └── tslint.json ├── nx.json ├── package-lock.json ├── package.json ├── tools │ ├── schematics │ │ └── .gitkeep │ └── tsconfig.tools.json ├── tsconfig.json ├── tslint.json └── web.config └── readme.md /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/.DS_Store -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "AzureIndexer/NStratis"] 2 | path = AzureIndexer/NStratis 3 | url = https://github.com/stratisproject/NStratis.git 4 | -------------------------------------------------------------------------------- /AzureIndexer/.travis.yml: -------------------------------------------------------------------------------- 1 | language: csharp 2 | mono: none 3 | dotnet: 2.0.0 4 | matrix: 5 | include: 6 | - os: linux # Ubuntu 14.04 7 | dist: trusty 8 | sudo: required 9 | - os: osx # OSX 10.12 10 | osx_image: xcode8.1 11 | 12 | # branches to build 13 | branches: 14 | only: 15 | - master 16 | 17 | # Work around NuGet issue #2163 18 | # https://github.com/NuGet/Home/issues/2163 19 | # https://github.com/travis-ci/travis-ci/issues/7728 20 | before_install: 21 | - if [ "$TRAVIS_OS_NAME" = "osx" ]; then ulimit -n 1024; fi 22 | 23 | script: 24 | - chmod +x build.sh 25 | - ./build.sh -------------------------------------------------------------------------------- /AzureIndexer/AzureIndexer.sln.DotSettings: -------------------------------------------------------------------------------- 1 | 2 | True 3 | True -------------------------------------------------------------------------------- /AzureIndexer/Stratis.Features.AzureIndexer.Tests/Data/blocks/StoreLock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/AzureIndexer/Stratis.Features.AzureIndexer.Tests/Data/blocks/StoreLock -------------------------------------------------------------------------------- /AzureIndexer/Stratis.Features.AzureIndexer.Tests/Data/blocks/blk00000.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/AzureIndexer/Stratis.Features.AzureIndexer.Tests/Data/blocks/blk00000.dat -------------------------------------------------------------------------------- /AzureIndexer/Stratis.Features.AzureIndexer.Tests/Data/blocks2/blk00000.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/AzureIndexer/Stratis.Features.AzureIndexer.Tests/Data/blocks2/blk00000.dat -------------------------------------------------------------------------------- /AzureIndexer/Stratis.Features.AzureIndexer.Tests/TestUtils.cs: -------------------------------------------------------------------------------- 1 | namespace Stratis.Features.AzureIndexer.Tests 2 | { 3 | using System.IO; 4 | 5 | internal class TestUtils 6 | { 7 | internal static void EnsureNew(string folderName) 8 | { 9 | if (Directory.Exists(folderName)) 10 | Directory.Delete(folderName, true); 11 | 12 | while (true) 13 | { 14 | try 15 | { 16 | Directory.CreateDirectory(folderName); 17 | break; 18 | } 19 | catch 20 | { 21 | } 22 | } 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /AzureIndexer/Stratis.Features.AzureIndexer.Tests/xunit.runner.json: -------------------------------------------------------------------------------- 1 | { 2 | "methodDisplay": "method", 3 | "parallelizeAssembly": false, 4 | "parallelizeTestCollections": false 5 | } -------------------------------------------------------------------------------- /AzureIndexer/Stratis.Features.AzureIndexer/AnonymousEqualityComparer.cs: -------------------------------------------------------------------------------- 1 | namespace Stratis.Features.AzureIndexer 2 | { 3 | using System; 4 | using System.Collections.Generic; 5 | 6 | class AnonymousEqualityComparer : IEqualityComparer 7 | { 8 | Func comparer; 9 | 10 | public AnonymousEqualityComparer(Func comparer) 11 | { 12 | this.comparer = comparer; 13 | } 14 | 15 | public bool Equals(T x, T y) 16 | { 17 | return this.comparer(x).Equals(this.comparer(y)); 18 | } 19 | 20 | public int GetHashCode(T obj) 21 | { 22 | return this.comparer(obj).GetHashCode(); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /AzureIndexer/Stratis.Features.AzureIndexer/ChainBlockHeader.cs: -------------------------------------------------------------------------------- 1 | namespace Stratis.Features.AzureIndexer 2 | { 3 | using NBitcoin; 4 | 5 | public class ChainBlockHeader 6 | { 7 | public uint256 BlockId { get; set; } 8 | 9 | public int Height { get; set; } 10 | 11 | public BlockHeader Header { get; set; } 12 | 13 | public override string ToString() 14 | { 15 | return Height + "-" + BlockId; 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /AzureIndexer/Stratis.Features.AzureIndexer/Entities/BroadcastedTransaction.cs: -------------------------------------------------------------------------------- 1 | using NBitcoin; 2 | 3 | namespace Stratis.Features.AzureIndexer.Entities 4 | { 5 | public class BroadcastedTransaction 6 | { 7 | public BroadcastedTransaction() 8 | { 9 | 10 | } 11 | public BroadcastedTransaction(Transaction tx) 12 | { 13 | Transaction = tx; 14 | } 15 | public int Tried 16 | { 17 | get; 18 | set; 19 | } 20 | public Transaction Transaction 21 | { 22 | get; 23 | set; 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /AzureIndexer/Stratis.Features.AzureIndexer/Exceptions.resources: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/AzureIndexer/Stratis.Features.AzureIndexer/Exceptions.resources -------------------------------------------------------------------------------- /AzureIndexer/Stratis.Features.AzureIndexer/IIndexed.cs: -------------------------------------------------------------------------------- 1 | namespace Stratis.Features.AzureIndexer 2 | { 3 | using Microsoft.WindowsAzure.Storage.Table; 4 | using NBitcoin; 5 | 6 | public interface IIndexed 7 | { 8 | ITableEntity CreateTableEntity(); 9 | 10 | DynamicTableEntity CreateTableEntity(Network network); 11 | 12 | ITableEntity GetChildTableEntity(); 13 | 14 | IIndexed GetChild(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /AzureIndexer/Stratis.Features.AzureIndexer/IndexTasks/IIndexTask.cs: -------------------------------------------------------------------------------- 1 | namespace Stratis.Features.AzureIndexer.IndexTasks 2 | { 3 | using System.Threading.Tasks; 4 | using NBitcoin; 5 | 6 | public interface IIndexTask 7 | { 8 | void Index(BlockFetcher blockFetcher, TaskScheduler scheduler, Network network); 9 | 10 | bool SaveProgression { get; set; } 11 | 12 | bool EnsureIsSetup { get; set; } 13 | } 14 | } -------------------------------------------------------------------------------- /AzureIndexer/Stratis.Features.AzureIndexer/IndexerConfigurationErrorsException.cs: -------------------------------------------------------------------------------- 1 | namespace Stratis.Features.AzureIndexer 2 | { 3 | using System; 4 | 5 | public class IndexerConfigurationErrorsException : Exception 6 | { 7 | public IndexerConfigurationErrorsException(string message) : base(message) 8 | { 9 | 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /AzureIndexer/Stratis.Features.AzureIndexer/LoadingTransactionTask.cs: -------------------------------------------------------------------------------- 1 | namespace Stratis.Features.AzureIndexer 2 | { 3 | using System.Threading.Tasks; 4 | 5 | public class LoadingTransactionTask 6 | { 7 | public Task Loaded { get; set; } 8 | 9 | public OrderedBalanceChange Change { get; set; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /AzureIndexer/Stratis.Features.AzureIndexer/MatchedRule.cs: -------------------------------------------------------------------------------- 1 | 2 | namespace Stratis.Features.AzureIndexer 3 | { 4 | public enum MatchLocation 5 | { 6 | Output, 7 | Input, 8 | } 9 | public class MatchedRule 10 | { 11 | public uint Index 12 | { 13 | get; 14 | set; 15 | } 16 | 17 | public WalletRule Rule 18 | { 19 | get; 20 | set; 21 | } 22 | 23 | public MatchLocation MatchType 24 | { 25 | get; 26 | set; 27 | } 28 | 29 | public override string ToString() 30 | { 31 | return this.Index + "-" + this.MatchType.ToString(); 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /AzureIndexer/Stratis.Features.AzureIndexer/Properties.cs: -------------------------------------------------------------------------------- 1 | [assembly: System.Runtime.CompilerServices.InternalsVisibleTo("Stratis.Features.AzureIndexer.Tests")] 2 | -------------------------------------------------------------------------------- /AzureIndexer/Stratis.Features.AzureIndexer/PushNuget.ps1: -------------------------------------------------------------------------------- 1 | rm "bin\release\" -Recurse -Force 2 | dotnet pack --configuration Release 3 | dotnet nuget push "bin\Release\" --source "https://api.nuget.org/v3/index.json" 4 | $ver = ((ls .\bin\release -File)[0].Name -replace '([^\.\d]*\.)+(\d+(\.\d+){1,3}).*', '$2') 5 | git tag -a "v$ver" -m "v$ver" 6 | git push --tags 7 | -------------------------------------------------------------------------------- /AzureIndexer/Stratis.Features.AzureIndexer/WalletRule.cs: -------------------------------------------------------------------------------- 1 | namespace Stratis.Features.AzureIndexer 2 | { 3 | using Newtonsoft.Json; 4 | using Stratis.Features.AzureIndexer.Helpers; 5 | 6 | public abstract class WalletRule 7 | { 8 | public WalletRule() 9 | { 10 | } 11 | 12 | [JsonIgnore] 13 | public abstract string Id 14 | { 15 | get; 16 | } 17 | 18 | [JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)] 19 | public string CustomData 20 | { 21 | get; 22 | set; 23 | } 24 | 25 | public override string ToString() 26 | { 27 | return Helper.Serialize(this); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /AzureIndexer/Stratis.Features.AzureIndexer/styelcop.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json", 3 | "settings": { 4 | "indentation": { 5 | "indentationSize": 4, 6 | "useTabs": false 7 | }, 8 | "orderingRules": { 9 | "usingDirectivesPlacement": "outsideNamespace", 10 | "systemUsingDirectivesFirst": true, 11 | "blankLinesBetweenUsingGroups": "omit" 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /AzureIndexer/Stratis.IndexerD/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "profiles": { 3 | "Stratis.IndexerD": { 4 | "commandName": "Project", 5 | "commandLineArgs": "-datadir=c:\\Stratis\\CirrusDelete -apiport=40001 -port=40002 -sidechain -iprangefiltering=false -azureacc=yourstorageaccountname -azemu=0 -azurekey=yourstorageaccountsecret -azuresb=yourservicebusconnectionstring" 6 | } 7 | } 8 | } -------------------------------------------------------------------------------- /AzureIndexer/StratisLibs/NBitcoin.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/AzureIndexer/StratisLibs/NBitcoin.dll -------------------------------------------------------------------------------- /AzureIndexer/StratisLibs/Stratis.Bitcoin.Features.SmartContracts.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/AzureIndexer/StratisLibs/Stratis.Bitcoin.Features.SmartContracts.dll -------------------------------------------------------------------------------- /AzureIndexer/StratisLibs/Stratis.Sidechains.Networks.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/AzureIndexer/StratisLibs/Stratis.Sidechains.Networks.dll -------------------------------------------------------------------------------- /AzureIndexer/StratisLibs/Stratis.SmartContracts.CLR.Validation.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/AzureIndexer/StratisLibs/Stratis.SmartContracts.CLR.Validation.dll -------------------------------------------------------------------------------- /AzureIndexer/StratisLibs/Stratis.SmartContracts.CLR.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/AzureIndexer/StratisLibs/Stratis.SmartContracts.CLR.dll -------------------------------------------------------------------------------- /AzureIndexer/StratisLibs/Stratis.SmartContracts.Core.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/AzureIndexer/StratisLibs/Stratis.SmartContracts.Core.dll -------------------------------------------------------------------------------- /AzureIndexer/StratisLibs/Stratis.SmartContracts.Networks.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/AzureIndexer/StratisLibs/Stratis.SmartContracts.Networks.dll -------------------------------------------------------------------------------- /AzureIndexer/StratisLibs/Stratis.SmartContracts.RuntimeObserver.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/AzureIndexer/StratisLibs/Stratis.SmartContracts.RuntimeObserver.dll -------------------------------------------------------------------------------- /AzureIndexer/build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | dotnet --info 3 | echo STARTED dotnet restore 4 | dotnet restore -v m 5 | echo STARTED dotnet build 6 | dotnet build -c Release ${path} -v m 7 | 8 | echo STARTED dotnet test 9 | 10 | ANYFAILURES=false 11 | for testProject in *.Tests; do 12 | 13 | # exclude integration tests 14 | if [[ "$testProject" == *"Integration.Tests"* ]] || [[ "$testProject" == *"IntegrationTests"* ]] ; then 15 | continue 16 | fi 17 | 18 | echo "Processing $testProject file.."; 19 | cd $testProject 20 | COMMAND="dotnet test --no-build -c Release -v m" 21 | $COMMAND 22 | EXITCODE=$? 23 | echo exit code for $testProject: $EXITCODE 24 | 25 | if [ $EXITCODE -ne 0 ] ; then 26 | ANYFAILURES=true 27 | fi 28 | 29 | cd .. 30 | done 31 | 32 | echo FINISHED dotnet test 33 | if [[ $ANYFAILURES == "true" ]] ; then 34 | exit 1 35 | fi 36 | -------------------------------------------------------------------------------- /BlockExplorer-UI/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | max_line_length = off 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /BlockExplorer-UI/.gitignore: -------------------------------------------------------------------------------- 1 | # See http://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # compiled output 4 | /dist 5 | /tmp 6 | /out-tsc 7 | 8 | # dependencies 9 | /node_modules 10 | 11 | # IDEs and editors 12 | /.idea 13 | .project 14 | .classpath 15 | .c9/ 16 | *.launch 17 | .settings/ 18 | *.sublime-workspace 19 | 20 | # IDE - VSCode 21 | .vscode/* 22 | !.vscode/settings.json 23 | !.vscode/tasks.json 24 | !.vscode/launch.json 25 | !.vscode/extensions.json 26 | 27 | # misc 28 | /.sass-cache 29 | /connect.lock 30 | /coverage 31 | /libpeerconnection.log 32 | npm-debug.log 33 | yarn-error.log 34 | testem.log 35 | /typings 36 | 37 | # System Files 38 | .DS_Store 39 | Thumbs.db 40 | -------------------------------------------------------------------------------- /BlockExplorer-UI/e2e/protractor.conf.js: -------------------------------------------------------------------------------- 1 | // Protractor configuration file, see link for more information 2 | // https://github.com/angular/protractor/blob/master/lib/config.ts 3 | 4 | const { SpecReporter } = require('jasmine-spec-reporter'); 5 | 6 | exports.config = { 7 | allScriptsTimeout: 11000, 8 | specs: [ 9 | './src/**/*.e2e-spec.ts' 10 | ], 11 | capabilities: { 12 | 'browserName': 'chrome' 13 | }, 14 | directConnect: true, 15 | baseUrl: 'http://localhost:4200/', 16 | framework: 'jasmine', 17 | jasmineNodeOpts: { 18 | showColors: true, 19 | defaultTimeoutInterval: 30000, 20 | print: function() {} 21 | }, 22 | onPrepare() { 23 | require('ts-node').register({ 24 | project: require('path').join(__dirname, './tsconfig.e2e.json') 25 | }); 26 | jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); 27 | } 28 | }; -------------------------------------------------------------------------------- /BlockExplorer-UI/e2e/src/app.e2e-spec.ts: -------------------------------------------------------------------------------- 1 | import { AppPage } from './app.po'; 2 | 3 | describe('workspace-project App', () => { 4 | let page: AppPage; 5 | 6 | beforeEach(() => { 7 | page = new AppPage(); 8 | }); 9 | 10 | it('should display welcome message', () => { 11 | page.navigateTo(); 12 | expect(page.getParagraphText()).toEqual('Welcome to BlockExplorer!'); 13 | }); 14 | }); 15 | -------------------------------------------------------------------------------- /BlockExplorer-UI/e2e/src/app.po.ts: -------------------------------------------------------------------------------- 1 | import { browser, by, element } from 'protractor'; 2 | 3 | export class AppPage { 4 | navigateTo() { 5 | return browser.get('/'); 6 | } 7 | 8 | getParagraphText() { 9 | return element(by.css('app-root h1')).getText(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /BlockExplorer-UI/e2e/tsconfig.e2e.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/app", 5 | "module": "commonjs", 6 | "target": "es5", 7 | "types": [ 8 | "jasmine", 9 | "jasminewd2", 10 | "node" 11 | ] 12 | } 13 | } -------------------------------------------------------------------------------- /BlockExplorer-UI/src/app/app-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { ContractsComponent } from './sub-modules/contracts/components/contracts/contracts.component'; 5 | 6 | const routes: Routes = [ 7 | { path: 'contracts', component: ContractsComponent } 8 | ]; 9 | 10 | @NgModule({ 11 | imports: [RouterModule.forRoot(routes)], 12 | exports: [RouterModule] 13 | }) 14 | export class AppRoutingModule { } 15 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/app/app.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/BlockExplorer-UI/src/app/app.component.scss -------------------------------------------------------------------------------- /BlockExplorer-UI/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-root', 5 | templateUrl: './app.component.html', 6 | styleUrls: ['./app.component.scss'] 7 | }) 8 | export class AppComponent { 9 | title = 'BlockExplorer'; 10 | } 11 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/app/app.module.ts: -------------------------------------------------------------------------------- 1 | import { BrowserModule } from '@angular/platform-browser'; 2 | import { NgModule } from '@angular/core'; 3 | import { FormsModule } from '@angular/forms'; 4 | 5 | import { AppRoutingModule } from './app-routing.module'; 6 | import { AppComponent } from './app.component'; 7 | import { MenuBarComponent } from './components/menu-bar/menu-bar.component'; 8 | import { ContractsModule } from './sub-modules/contracts/contracts.module'; 9 | import { ApiServiceBase, FakeApiService } from './services/api.service'; 10 | 11 | @NgModule({ 12 | declarations: [ 13 | AppComponent, 14 | MenuBarComponent 15 | ], 16 | imports: [ 17 | BrowserModule, 18 | AppRoutingModule, 19 | FormsModule, 20 | ContractsModule 21 | ], 22 | providers: [{ provide: ApiServiceBase, useClass: FakeApiService }], 23 | bootstrap: [AppComponent] 24 | }) 25 | export class AppModule { } 26 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/app/components/menu-bar/menu-bar.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/BlockExplorer-UI/src/app/components/menu-bar/menu-bar.component.scss -------------------------------------------------------------------------------- /BlockExplorer-UI/src/app/components/menu-bar/menu-bar.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input } from '@angular/core'; 2 | 3 | import { SearchTextService } from 'src/app/services/search-text.service'; 4 | 5 | @Component({ 6 | selector: 'app-menu-bar', 7 | templateUrl: './menu-bar.component.html', 8 | styleUrls: ['./menu-bar.component.scss'] 9 | }) 10 | export class MenuBarComponent { 11 | constructor(readonly searchTextService: SearchTextService) { } 12 | 13 | get searchText(): string { return this.searchTextService.searchText; } 14 | @Input() set searchText(value: string) { this.searchTextService.searchText = value; } 15 | } 16 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/app/services/api.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing'; 2 | 3 | import { ApiService } from './api.service'; 4 | 5 | describe('ApiService', () => { 6 | beforeEach(() => TestBed.configureTestingModule({})); 7 | 8 | // it('should be created', () => { 9 | // const service: ApiService = TestBed.get(ApiService); 10 | // expect(service).toBeTruthy(); 11 | // }); 12 | }); 13 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/app/sub-modules/contracts/components/contracts/contracts.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/BlockExplorer-UI/src/app/sub-modules/contracts/components/contracts/contracts.component.scss -------------------------------------------------------------------------------- /BlockExplorer-UI/src/app/sub-modules/contracts/contracts.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { ContractsComponent } from './components/contracts/contracts.component'; 4 | 5 | @NgModule({ 6 | declarations: [ContractsComponent], 7 | imports: [ 8 | CommonModule 9 | ] 10 | }) 11 | export class ContractsModule { } 12 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/app/sub-modules/transactions/transactions.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | 4 | @NgModule({ 5 | declarations: [], 6 | imports: [ 7 | CommonModule 8 | ] 9 | }) 10 | export class TransactionsModule { } 11 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/BlockExplorer-UI/src/assets/.gitkeep -------------------------------------------------------------------------------- /BlockExplorer-UI/src/assets/fonts/MaterialIcons-Regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/BlockExplorer-UI/src/assets/fonts/MaterialIcons-Regular.eot -------------------------------------------------------------------------------- /BlockExplorer-UI/src/assets/fonts/MaterialIcons-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/BlockExplorer-UI/src/assets/fonts/MaterialIcons-Regular.ttf -------------------------------------------------------------------------------- /BlockExplorer-UI/src/assets/fonts/MaterialIcons-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/BlockExplorer-UI/src/assets/fonts/MaterialIcons-Regular.woff -------------------------------------------------------------------------------- /BlockExplorer-UI/src/assets/fonts/MaterialIcons-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/BlockExplorer-UI/src/assets/fonts/MaterialIcons-Regular.woff2 -------------------------------------------------------------------------------- /BlockExplorer-UI/src/browserslist: -------------------------------------------------------------------------------- 1 | # This file is currently used by autoprefixer to adjust CSS to support the below specified browsers 2 | # For additional information regarding the format and rule options, please see: 3 | # https://github.com/browserslist/browserslist#queries 4 | # 5 | # For IE 9-11 support, please remove 'not' from the last line of the file and adjust as needed 6 | 7 | > 0.5% 8 | last 2 versions 9 | Firefox ESR 10 | not dead 11 | IE 9-11 -------------------------------------------------------------------------------- /BlockExplorer-UI/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/environments/environment.ts: -------------------------------------------------------------------------------- 1 | // This file can be replaced during build by using the `fileReplacements` array. 2 | // `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. 3 | // The list of file replacements can be found in `angular.json`. 4 | 5 | export const environment = { 6 | production: false 7 | }; 8 | 9 | /* 10 | * For easier debugging in development mode, you can import the following file 11 | * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. 12 | * 13 | * This import should be commented out in production mode because it will have a negative impact 14 | * on performance if an error is thrown. 15 | */ 16 | // import 'zone.js/dist/zone-error'; // Included with Angular CLI. 17 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/BlockExplorer-UI/src/favicon.ico -------------------------------------------------------------------------------- /BlockExplorer-UI/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BlockExplorer 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from '@angular/core'; 2 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 3 | 4 | import { AppModule } from './app/app.module'; 5 | import { environment } from './environments/environment'; 6 | 7 | if (environment.production) { 8 | enableProdMode(); 9 | } 10 | 11 | platformBrowserDynamic().bootstrapModule(AppModule) 12 | .catch(err => console.error(err)); 13 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/styling/scss/_jumbotron.scss: -------------------------------------------------------------------------------- 1 | .jumbotron { 2 | padding: $jumbotron-padding / 4; 3 | margin-bottom: $jumbotron-padding; 4 | background-color: $jumbotron-bg; 5 | color: $black; 6 | @include border-radius($border-radius-lg); 7 | .lead { 8 | margin-bottom: 0; 9 | font-weight: 500; 10 | white-space: pre-wrap; 11 | overflow-wrap: break-word; 12 | } 13 | } 14 | 15 | .jumbotron-fluid { 16 | padding-right: 0; 17 | padding-left: 0; 18 | @include border-radius(0); 19 | } 20 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/styling/scss/_media.scss: -------------------------------------------------------------------------------- 1 | .media { 2 | display: flex; 3 | align-items: flex-start; 4 | } 5 | 6 | .media-body { 7 | flex: 1; 8 | } 9 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/styling/scss/_root.scss: -------------------------------------------------------------------------------- 1 | :root { 2 | // Custom variable values only support SassScript inside `#{}`. 3 | @each $color, $value in $colors { 4 | --#{$color}: #{$value}; 5 | } 6 | 7 | @each $color, $value in $theme-colors { 8 | --#{$color}: #{$value}; 9 | } 10 | 11 | @each $bp, $value in $grid-breakpoints { 12 | --breakpoint-#{$bp}: #{$value}; 13 | } 14 | 15 | // Use `inspect` for lists so that quoted items keep the quotes. 16 | // See https://github.com/sass/sass/issues/2383#issuecomment-336349172 17 | --font-family-sans-serif: #{inspect($font-family-sans-serif)}; 18 | --font-family-monospace: #{inspect($font-family-monospace)}; 19 | } 20 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/styling/scss/_transitions.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable selector-no-qualifying-type 2 | 3 | .fade { 4 | @include transition($transition-fade); 5 | 6 | &:not(.show) { 7 | opacity: 0; 8 | } 9 | } 10 | 11 | .collapse { 12 | &:not(.show) { 13 | display: none; 14 | } 15 | } 16 | 17 | .collapsing { 18 | position: relative; 19 | height: 0; 20 | overflow: hidden; 21 | @include transition($transition-collapse); 22 | } 23 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/styling/scss/bootstrap-grid.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Grid v4.1.3 (https://getbootstrap.com/) 3 | * Copyright 2011-2018 The Bootstrap Authors 4 | * Copyright 2011-2018 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 6 | */ 7 | 8 | @at-root { 9 | @-ms-viewport { width: device-width; } // stylelint-disable-line at-rule-no-vendor-prefix 10 | } 11 | 12 | html { 13 | box-sizing: border-box; 14 | -ms-overflow-style: scrollbar; 15 | } 16 | 17 | *, 18 | *::before, 19 | *::after { 20 | box-sizing: inherit; 21 | } 22 | 23 | @import "functions"; 24 | @import "variables"; 25 | 26 | @import "mixins/breakpoints"; 27 | @import "mixins/grid-framework"; 28 | @import "mixins/grid"; 29 | 30 | @import "grid"; 31 | @import "utilities/display"; 32 | @import "utilities/flex"; 33 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/styling/scss/bootstrap-reboot.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Reboot v4.1.3 (https://getbootstrap.com/) 3 | * Copyright 2011-2018 The Bootstrap Authors 4 | * Copyright 2011-2018 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 6 | * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) 7 | */ 8 | 9 | @import "functions"; 10 | @import "variables"; 11 | @import "mixins"; 12 | @import "reboot"; 13 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/styling/scss/mixins/_alert.scss: -------------------------------------------------------------------------------- 1 | @mixin alert-variant($background, $border, $color) { 2 | color: $color; 3 | @include gradient-bg($background); 4 | border-color: $border; 5 | 6 | hr { 7 | border-top-color: darken($border, 5%); 8 | } 9 | 10 | .alert-link { 11 | color: darken($color, 10%); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/styling/scss/mixins/_background-variant.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | // Contextual backgrounds 4 | 5 | @mixin bg-variant($parent, $color) { 6 | #{$parent} { 7 | background-color: $color !important; 8 | } 9 | a#{$parent}, 10 | button#{$parent} { 11 | @include hover-focus { 12 | background-color: darken($color, 10%) !important; 13 | } 14 | } 15 | } 16 | 17 | @mixin bg-gradient-variant($parent, $color) { 18 | #{$parent} { 19 | background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x !important; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/styling/scss/mixins/_badge.scss: -------------------------------------------------------------------------------- 1 | @mixin badge-variant($bg) { 2 | color: color-yiq($bg); 3 | background-color: $bg; 4 | 5 | &[href] { 6 | @include hover-focus { 7 | color: color-yiq($bg); 8 | text-decoration: none; 9 | background-color: darken($bg, 10%); 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/styling/scss/mixins/_border-radius.scss: -------------------------------------------------------------------------------- 1 | // Single side border-radius 2 | 3 | @mixin border-radius($radius: $border-radius) { 4 | @if $enable-rounded { 5 | border-radius: $radius; 6 | } 7 | } 8 | 9 | @mixin border-top-radius($radius) { 10 | @if $enable-rounded { 11 | border-top-left-radius: $radius; 12 | border-top-right-radius: $radius; 13 | } 14 | } 15 | 16 | @mixin border-right-radius($radius) { 17 | @if $enable-rounded { 18 | border-top-right-radius: $radius; 19 | border-bottom-right-radius: $radius; 20 | } 21 | } 22 | 23 | @mixin border-bottom-radius($radius) { 24 | @if $enable-rounded { 25 | border-bottom-right-radius: $radius; 26 | border-bottom-left-radius: $radius; 27 | } 28 | } 29 | 30 | @mixin border-left-radius($radius) { 31 | @if $enable-rounded { 32 | border-top-left-radius: $radius; 33 | border-bottom-left-radius: $radius; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/styling/scss/mixins/_box-shadow.scss: -------------------------------------------------------------------------------- 1 | @mixin box-shadow($shadow...) { 2 | @if $enable-shadows { 3 | box-shadow: $shadow; 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/styling/scss/mixins/_clearfix.scss: -------------------------------------------------------------------------------- 1 | @mixin clearfix() { 2 | &::after { 3 | display: block; 4 | clear: both; 5 | content: ""; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/styling/scss/mixins/_float.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | @mixin float-left { 4 | float: left !important; 5 | } 6 | @mixin float-right { 7 | float: right !important; 8 | } 9 | @mixin float-none { 10 | float: none !important; 11 | } 12 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/styling/scss/mixins/_list-group.scss: -------------------------------------------------------------------------------- 1 | // List Groups 2 | 3 | @mixin list-group-item-variant($state, $background, $color) { 4 | .list-group-item-#{$state} { 5 | color: $color; 6 | background-color: $background; 7 | 8 | &.list-group-item-action { 9 | @include hover-focus { 10 | color: $color; 11 | background-color: darken($background, 5%); 12 | } 13 | 14 | &.active { 15 | color: $white; 16 | background-color: $color; 17 | border-color: $color; 18 | } 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/styling/scss/mixins/_lists.scss: -------------------------------------------------------------------------------- 1 | // Lists 2 | 3 | // Unstyled keeps list items block level, just removes default browser padding and list-style 4 | @mixin list-unstyled { 5 | padding-left: 0; 6 | list-style: none; 7 | } 8 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/styling/scss/mixins/_nav-divider.scss: -------------------------------------------------------------------------------- 1 | // Horizontal dividers 2 | // 3 | // Dividers (basically an hr) within dropdowns and nav lists 4 | 5 | @mixin nav-divider($color: $nav-divider-color, $margin-y: $nav-divider-margin-y) { 6 | height: 0; 7 | margin: $margin-y 0; 8 | overflow: hidden; 9 | border-top: 1px solid $color; 10 | } 11 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/styling/scss/mixins/_pagination.scss: -------------------------------------------------------------------------------- 1 | // Pagination 2 | 3 | @mixin pagination-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) { 4 | .page-link { 5 | padding: $padding-y $padding-x; 6 | font-size: $font-size; 7 | line-height: $line-height; 8 | } 9 | 10 | .page-item { 11 | &:first-child { 12 | .page-link { 13 | @include border-left-radius($border-radius); 14 | } 15 | } 16 | &:last-child { 17 | .page-link { 18 | @include border-right-radius($border-radius); 19 | } 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/styling/scss/mixins/_reset-text.scss: -------------------------------------------------------------------------------- 1 | @mixin reset-text { 2 | font-family: $font-family-base; 3 | // We deliberately do NOT reset font-size or word-wrap. 4 | font-style: normal; 5 | font-weight: $font-weight-normal; 6 | line-height: $line-height-base; 7 | text-align: left; // Fallback for where `start` is not supported 8 | text-align: start; // stylelint-disable-line declaration-block-no-duplicate-properties 9 | text-decoration: none; 10 | text-shadow: none; 11 | text-transform: none; 12 | letter-spacing: normal; 13 | word-break: normal; 14 | word-spacing: normal; 15 | white-space: normal; 16 | line-break: auto; 17 | } 18 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/styling/scss/mixins/_resize.scss: -------------------------------------------------------------------------------- 1 | // Resize anything 2 | 3 | @mixin resizable($direction) { 4 | overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible` 5 | resize: $direction; // Options: horizontal, vertical, both 6 | } 7 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/styling/scss/mixins/_size.scss: -------------------------------------------------------------------------------- 1 | // Sizing shortcuts 2 | 3 | @mixin size($width, $height: $width) { 4 | width: $width; 5 | height: $height; 6 | } 7 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/styling/scss/mixins/_table-row.scss: -------------------------------------------------------------------------------- 1 | // Tables 2 | 3 | @mixin table-row-variant($state, $background) { 4 | // Exact selectors below required to override `.table-striped` and prevent 5 | // inheritance to nested tables. 6 | .table-#{$state} { 7 | &, 8 | > th, 9 | > td { 10 | background-color: $background; 11 | } 12 | } 13 | 14 | // Hover states for `.table-hover` 15 | // Note: this is not available for cells or rows within `thead` or `tfoot`. 16 | .table-hover { 17 | $hover-background: darken($background, 5%); 18 | 19 | .table-#{$state} { 20 | @include hover { 21 | background-color: $hover-background; 22 | 23 | > td, 24 | > th { 25 | background-color: $hover-background; 26 | } 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/styling/scss/mixins/_text-emphasis.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | // Typography 4 | 5 | @mixin text-emphasis-variant($parent, $color) { 6 | #{$parent} { 7 | color: $color !important; 8 | } 9 | a#{$parent} { 10 | @include hover-focus { 11 | color: darken($color, 10%) !important; 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/styling/scss/mixins/_text-hide.scss: -------------------------------------------------------------------------------- 1 | // CSS image replacement 2 | @mixin text-hide($ignore-warning: false) { 3 | // stylelint-disable-next-line font-family-no-missing-generic-family-keyword 4 | font: 0/0 a; 5 | color: transparent; 6 | text-shadow: none; 7 | background-color: transparent; 8 | border: 0; 9 | 10 | @if ($ignore-warning != true) { 11 | @warn "The `text-hide()` mixin has been deprecated as of v4.1.0. It will be removed entirely in v5."; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/styling/scss/mixins/_text-truncate.scss: -------------------------------------------------------------------------------- 1 | // Text truncate 2 | // Requires inline-block or block for proper styling 3 | 4 | @mixin text-truncate() { 5 | overflow: hidden; 6 | text-overflow: ellipsis; 7 | white-space: nowrap; 8 | } 9 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/styling/scss/mixins/_transition.scss: -------------------------------------------------------------------------------- 1 | @mixin transition($transition...) { 2 | @if $enable-transitions { 3 | @if length($transition) == 0 { 4 | transition: $transition-base; 5 | } @else { 6 | transition: $transition; 7 | } 8 | } 9 | 10 | @media screen and (prefers-reduced-motion: reduce) { 11 | transition: none; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/styling/scss/mixins/_visibility.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | // Visibility 4 | 5 | @mixin invisible($visibility) { 6 | visibility: $visibility !important; 7 | } 8 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/styling/scss/utilities/_align.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | .align-baseline { vertical-align: baseline !important; } // Browser default 4 | .align-top { vertical-align: top !important; } 5 | .align-middle { vertical-align: middle !important; } 6 | .align-bottom { vertical-align: bottom !important; } 7 | .align-text-bottom { vertical-align: text-bottom !important; } 8 | .align-text-top { vertical-align: text-top !important; } 9 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/styling/scss/utilities/_background.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | @each $color, $value in $theme-colors { 4 | @include bg-variant(".bg-#{$color}", $value); 5 | } 6 | 7 | @if $enable-gradients { 8 | @each $color, $value in $theme-colors { 9 | @include bg-gradient-variant(".bg-gradient-#{$color}", $value); 10 | } 11 | } 12 | 13 | .bg-white { 14 | background-color: $white !important; 15 | } 16 | 17 | .bg-transparent { 18 | background-color: transparent !important; 19 | } 20 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/styling/scss/utilities/_clearfix.scss: -------------------------------------------------------------------------------- 1 | .clearfix { 2 | @include clearfix(); 3 | } 4 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/styling/scss/utilities/_float.scss: -------------------------------------------------------------------------------- 1 | @each $breakpoint in map-keys($grid-breakpoints) { 2 | @include media-breakpoint-up($breakpoint) { 3 | $infix: breakpoint-infix($breakpoint, $grid-breakpoints); 4 | 5 | .float#{$infix}-left { @include float-left; } 6 | .float#{$infix}-right { @include float-right; } 7 | .float#{$infix}-none { @include float-none; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/styling/scss/utilities/_position.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | // Common values 4 | 5 | // Sass list not in variables since it's not intended for customization. 6 | // stylelint-disable-next-line scss/dollar-variable-default 7 | $positions: static, relative, absolute, fixed, sticky; 8 | 9 | @each $position in $positions { 10 | .position-#{$position} { position: $position !important; } 11 | } 12 | 13 | // Shorthand 14 | 15 | .fixed-top { 16 | position: fixed; 17 | top: 0; 18 | right: 0; 19 | left: 0; 20 | z-index: $zindex-fixed; 21 | } 22 | 23 | .fixed-bottom { 24 | position: fixed; 25 | right: 0; 26 | bottom: 0; 27 | left: 0; 28 | z-index: $zindex-fixed; 29 | } 30 | 31 | .sticky-top { 32 | @supports (position: sticky) { 33 | position: sticky; 34 | top: 0; 35 | z-index: $zindex-sticky; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/styling/scss/utilities/_screenreaders.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Screenreaders 3 | // 4 | 5 | .sr-only { 6 | @include sr-only(); 7 | } 8 | 9 | .sr-only-focusable { 10 | @include sr-only-focusable(); 11 | } 12 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/styling/scss/utilities/_shadows.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | .shadow-sm { box-shadow: $box-shadow-sm !important; } 4 | .shadow { box-shadow: $box-shadow !important; } 5 | .shadow-lg { box-shadow: $box-shadow-lg !important; } 6 | .shadow-none { box-shadow: none !important; } 7 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/styling/scss/utilities/_sizing.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | // Width and height 4 | 5 | @each $prop, $abbrev in (width: w, height: h) { 6 | @each $size, $length in $sizes { 7 | .#{$abbrev}-#{$size} { #{$prop}: $length !important; } 8 | } 9 | } 10 | 11 | .mw-100 { max-width: 100% !important; } 12 | .mh-100 { max-height: 100% !important; } 13 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/styling/scss/utilities/_visibility.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Visibility utilities 3 | // 4 | 5 | .visible { 6 | @include invisible(visible); 7 | } 8 | 9 | .invisible { 10 | @include invisible(hidden); 11 | } 12 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/test.ts: -------------------------------------------------------------------------------- 1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 2 | 3 | import 'zone.js/dist/zone-testing'; 4 | import { getTestBed } from '@angular/core/testing'; 5 | import { 6 | BrowserDynamicTestingModule, 7 | platformBrowserDynamicTesting 8 | } from '@angular/platform-browser-dynamic/testing'; 9 | 10 | declare const require: any; 11 | 12 | // First, initialize the Angular testing environment. 13 | getTestBed().initTestEnvironment( 14 | BrowserDynamicTestingModule, 15 | platformBrowserDynamicTesting() 16 | ); 17 | // Then we find all the tests. 18 | const context = require.context('./', true, /\.spec\.ts$/); 19 | // And load the modules. 20 | context.keys().map(context); 21 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/app", 5 | "types": [] 6 | }, 7 | "exclude": [ 8 | "test.ts", 9 | "**/*.spec.ts" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/spec", 5 | "types": [ 6 | "jasmine", 7 | "node" 8 | ] 9 | }, 10 | "files": [ 11 | "test.ts", 12 | "polyfills.ts" 13 | ], 14 | "include": [ 15 | "**/*.spec.ts", 16 | "**/*.d.ts" 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /BlockExplorer-UI/src/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tslint.json", 3 | "rules": { 4 | "directive-selector": [ 5 | true, 6 | "attribute", 7 | "app", 8 | "camelCase" 9 | ], 10 | "component-selector": [ 11 | true, 12 | "element", 13 | "app", 14 | "kebab-case" 15 | ] 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /BlockExplorer-UI/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compileOnSave": false, 3 | "compilerOptions": { 4 | "baseUrl": "./", 5 | "outDir": "./dist/out-tsc", 6 | "sourceMap": true, 7 | "declaration": false, 8 | "module": "es2015", 9 | "moduleResolution": "node", 10 | "emitDecoratorMetadata": true, 11 | "experimentalDecorators": true, 12 | "target": "es5", 13 | "typeRoots": [ 14 | "node_modules/@types" 15 | ], 16 | "lib": [ 17 | "es2018", 18 | "dom" 19 | ] 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/Controllers/HomeController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Diagnostics; 4 | using System.Linq; 5 | using System.Threading.Tasks; 6 | using Microsoft.AspNetCore.Mvc; 7 | using FaucetSite.Models; 8 | 9 | namespace FaucetSite.Controllers 10 | { 11 | public class HomeController : Controller 12 | { 13 | public IActionResult Index() 14 | { 15 | return View(); 16 | } 17 | 18 | public IActionResult Error() 19 | { 20 | return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier }); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/FaucetSite.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | netcoreapp2.0 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/Lib/ICaptchaClient.cs: -------------------------------------------------------------------------------- 1 | using Refit; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Threading.Tasks; 6 | 7 | namespace FaucetSite.Lib 8 | { 9 | public interface ICaptchaClient 10 | { 11 | [Post("/recaptcha/api/siteverify")] 12 | Task VerifyAsync(string secret, string response, string remoteip); 13 | } 14 | 15 | public class VerifyResponse 16 | { 17 | public bool Success { get; set; } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/Lib/IWalletUtils.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | 3 | namespace FaucetSite.Lib 4 | { 5 | public interface IWalletUtils 6 | { 7 | Task SendCoin(string address); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/Lib/StratisFullNodeClient/IStratisWalletAPI.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading.Tasks; 3 | using Refit; 4 | using FaucetSite.request; 5 | 6 | namespace FaucetSite 7 | { 8 | 9 | public interface IStratisWalletAPI 10 | { 11 | [Post("/api/wallet/build-transaction")] 12 | Task BuildTransaction([Body] BuildTransaction createWallet); 13 | 14 | [Post("/api/wallet/send-transaction")] 15 | Task SendTransaction([Body] SendTransaction createWallet); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/Lib/StratisFullNodeClient/request/CreateWallet.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Net; 3 | using System.Collections.Generic; 4 | 5 | using Newtonsoft.Json; 6 | 7 | 8 | namespace FaucetSite 9 | { 10 | namespace request 11 | { 12 | 13 | public partial class CreateWallet 14 | { 15 | [JsonProperty("password")] 16 | public string Password { get; set; } 17 | 18 | [JsonProperty("network")] 19 | public string Network { get; set; } 20 | 21 | [JsonProperty("name")] 22 | public String Name { get; set; } 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/Lib/StratisFullNodeClient/request/SendTransaction.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Net; 3 | using System.Collections.Generic; 4 | 5 | using Newtonsoft.Json; 6 | 7 | 8 | namespace FaucetSite 9 | { 10 | namespace request 11 | { 12 | public partial class SendTransaction 13 | { 14 | 15 | [JsonProperty("hex")] 16 | public string Hex { get; set; } 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/Lib/StratisFullNodeClient/response/Balances.cs: -------------------------------------------------------------------------------- 1 | namespace FaucetSite 2 | { 3 | namespace response 4 | { 5 | using System; 6 | using System.Net; 7 | using System.Collections.Generic; 8 | 9 | using Newtonsoft.Json; 10 | 11 | public partial class Balances 12 | { 13 | [JsonProperty("balances")] 14 | public List BalancesList { get; set; } 15 | 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/Lib/StratisFullNodeClient/response/Error.cs: -------------------------------------------------------------------------------- 1 | namespace FaucetSite 2 | { 3 | namespace response 4 | { 5 | using System; 6 | using System.Net; 7 | using System.Collections.Generic; 8 | 9 | using Newtonsoft.Json; 10 | 11 | public partial class Error 12 | { 13 | [JsonProperty("status")] 14 | public int Status { get; set; } 15 | 16 | [JsonProperty("message")] 17 | public int Message { get; set; } 18 | 19 | [JsonProperty("description")] 20 | public int Description { get; set; } 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/Lib/StratisFullNodeClient/response/Errors.cs: -------------------------------------------------------------------------------- 1 | namespace FaucetSite 2 | { 3 | namespace response 4 | { 5 | using System; 6 | using System.Net; 7 | using System.Collections.Generic; 8 | 9 | using Newtonsoft.Json; 10 | 11 | public partial class Errors { 12 | 13 | [JsonProperty("errors")] 14 | public List ErrorList { get; set; } 15 | 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/Lib/StratisFullNodeClient/response/Transaction.cs: -------------------------------------------------------------------------------- 1 | namespace FaucetSite 2 | { 3 | namespace response 4 | { 5 | using System; 6 | using System.Net; 7 | using System.Collections.Generic; 8 | 9 | using Newtonsoft.Json; 10 | 11 | public partial class Transaction 12 | { 13 | [JsonProperty("fee")] 14 | public string Fee { get; set; } 15 | 16 | [JsonProperty("hex")] 17 | public string Hex { get; set; } 18 | 19 | 20 | [JsonProperty("transactionId")] 21 | public string TransactionId { get; set; } 22 | 23 | } 24 | } 25 | } 26 | 27 | -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/Models/Balance.cs: -------------------------------------------------------------------------------- 1 | public class Balance 2 | { 3 | public decimal balance { get; set; } 4 | public string returnAddress { get; set; } 5 | } 6 | -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/Models/ErrorViewModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace FaucetSite.Models 4 | { 5 | public class ErrorViewModel 6 | { 7 | public string RequestId { get; set; } 8 | 9 | public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); 10 | } 11 | } -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/Models/Recipient.cs: -------------------------------------------------------------------------------- 1 | public class RecipientViewModel 2 | { 3 | public string Address { get; set; } 4 | public string Captcha { get; set; } 5 | } 6 | -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/Models/Transaction.cs: -------------------------------------------------------------------------------- 1 | public class Transaction 2 | { 3 | public string TransactionId { get; set; } 4 | } 5 | -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Linq; 5 | using System.Threading.Tasks; 6 | using Microsoft.AspNetCore; 7 | using Microsoft.AspNetCore.Hosting; 8 | using Microsoft.Extensions.Configuration; 9 | using Microsoft.Extensions.Logging; 10 | 11 | namespace FaucetSite 12 | { 13 | public class Program 14 | { 15 | public static void Main(string[] args) 16 | { 17 | BuildWebHost(args).Run(); 18 | } 19 | 20 | public static IWebHost BuildWebHost(string[] args) => 21 | WebHost.CreateDefaultBuilder(args) 22 | .UseStartup() 23 | .Build(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "iisSettings": { 3 | "windowsAuthentication": false, 4 | "anonymousAuthentication": true, 5 | "iisExpress": { 6 | "applicationUrl": "http://localhost:50351/", 7 | "sslPort": 0 8 | } 9 | }, 10 | "profiles": { 11 | "IIS Express": { 12 | "commandName": "IISExpress", 13 | "launchBrowser": true, 14 | "environmentVariables": { 15 | "ASPNETCORE_ENVIRONMENT": "Development" 16 | } 17 | }, 18 | "FaucetSite": { 19 | "commandName": "Project", 20 | "launchBrowser": true, 21 | "environmentVariables": { 22 | "ASPNETCORE_ENVIRONMENT": "Development" 23 | }, 24 | "applicationUrl": "http://localhost:50352/" 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/Views/_ViewImports.cshtml: -------------------------------------------------------------------------------- 1 | @using FaucetSite 2 | @using FaucetSite.Models 3 | @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers 4 | -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/Views/_ViewStart.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | Layout = "_Layout"; 3 | } 4 | -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "IncludeScopes": false, 4 | "LogLevel": { 5 | "Default": "Debug", 6 | "System": "Information", 7 | "Microsoft": "Information" 8 | } 9 | }, 10 | "Faucet": { 11 | "FullNodeApiurl": "", 12 | "FullNodePassword": "", 13 | "FullNodeAccountName": "account 0", 14 | "FullNodeWalletName": "" 15 | }, 16 | "Captcha": { 17 | "SecretKey": "", 18 | "SiteKey": "" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "IncludeScopes": false, 4 | "LogLevel": { 5 | "Default": "Warning" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/bundleconfig.json: -------------------------------------------------------------------------------- 1 | // Configure bundling and minification for the project. 2 | // More info at https://go.microsoft.com/fwlink/?LinkId=808241 3 | [ 4 | { 5 | "outputFileName": "wwwroot/css/site.min.css", 6 | // An array of relative input file paths. Globbing patterns supported 7 | "inputFiles": [ 8 | "wwwroot/css/site.css" 9 | ] 10 | }, 11 | { 12 | "outputFileName": "wwwroot/js/site.min.js", 13 | "inputFiles": [ 14 | "wwwroot/js/site.js" 15 | ], 16 | // Optionally specify minification options 17 | "minify": { 18 | "enabled": true, 19 | "renameLocals": true 20 | }, 21 | // Optionally generate .map file 22 | "sourceMap": false 23 | } 24 | ] 25 | -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/wwwroot/css/site.css: -------------------------------------------------------------------------------- 1 | body { 2 | background: url(/images/background.jpg) no-repeat center center fixed; 3 | background-size: cover; 4 | } 5 | 6 | .body-content { 7 | margin-top: 160px; 8 | } 9 | 10 | form { 11 | margin-top:30px; 12 | width:420px; 13 | } 14 | p { 15 | color: #CCCCCC; 16 | } 17 | .main-title { 18 | color: #1487C8; 19 | font-weight: 600; 20 | font-size: 3em; 21 | } 22 | 23 | .btn-primary,.btn-primary:disabled { 24 | background-color: #1487C8 !important; 25 | margin-top:45px; 26 | } 27 | 28 | .btn-primary:active, .btn-primary:hover:not(:disabled), .btn-primary:focus { 29 | background-color: #19aab4 !important; 30 | } 31 | 32 | .alert{ 33 | margin-top:20px; 34 | } 35 | 36 | .g-recaptcha { 37 | transform: scale(1.39); 38 | transform-origin: 0 0; 39 | } -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/wwwroot/css/site.min.css: -------------------------------------------------------------------------------- 1 | body{background:url(/images/background.jpg) no-repeat center center fixed;background-size:cover}.body-content{margin-top:160px}form{margin-top:30px;width:420px}p{color:#ccc}.main-title{color:#1487c8;font-weight:600;font-size:3em}.btn-primary,.btn-primary:disabled{background-color:#1487c8 !important;margin-top:45px}.btn-primary:active,.btn-primary:hover:not(:disabled),.btn-primary:focus{background-color:#19aab4 !important}.alert{margin-top:20px}.g-recaptcha{transform:scale(1.39);transform-origin:0 0} -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/wwwroot/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/FaucetSite/FaucetSite/wwwroot/favicon.png -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/wwwroot/images/background.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/FaucetSite/FaucetSite/wwwroot/images/background.jpg -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/wwwroot/js/site.min.js: -------------------------------------------------------------------------------- 1 | function Model(){var n=this;n.loaded=ko.observable(!0);n.address=ko.observable();n.result=ko.observable();n.inProgress=ko.observable(!1);n.captcha=ko.observable();n.disableSubmit=ko.computed(function(){return n.inProgress()||$.trim(n.address()).length!=34||n.captcha()==null});n.onSendClick=function(){n.inProgress(!0);n.result(null);$.post("api/Faucet/SendCoin",{address:n.address(),captcha:grecaptcha.getResponse()}).done(function(t){n.result({success:!0,transactionId:t.transactionId});n.address("")}).fail(function(t){var i=t.responseJSON,r=i&&i.errorMessage?t.errorMessage:"Sorry, an error occured. Please try again later.";n.result({success:!1,errorMessage:r})}).always(function(){n.captcha(null);grecaptcha.reset();n.inProgress(!1)})}}function captcha(n){model.captcha(n)}ko.punches.enableAll();var model=new Model;ko.applyBindings(model); -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/FaucetSite/FaucetSite/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/FaucetSite/FaucetSite/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/FaucetSite/FaucetSite/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/FaucetSite/FaucetSite/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/wwwroot/lib/bootstrap/dist/js/npm.js: -------------------------------------------------------------------------------- 1 | // This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment. 2 | require('../../js/transition.js') 3 | require('../../js/alert.js') 4 | require('../../js/button.js') 5 | require('../../js/carousel.js') 6 | require('../../js/collapse.js') 7 | require('../../js/dropdown.js') 8 | require('../../js/modal.js') 9 | require('../../js/tooltip.js') 10 | require('../../js/popover.js') 11 | require('../../js/scrollspy.js') 12 | require('../../js/tab.js') 13 | require('../../js/affix.js') -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/wwwroot/lib/jquery/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jquery", 3 | "main": "dist/jquery.js", 4 | "license": "MIT", 5 | "ignore": [ 6 | "package.json" 7 | ], 8 | "keywords": [ 9 | "jquery", 10 | "javascript", 11 | "browser", 12 | "library" 13 | ], 14 | "homepage": "https://github.com/jquery/jquery-dist", 15 | "version": "2.2.0", 16 | "_release": "2.2.0", 17 | "_resolution": { 18 | "type": "version", 19 | "tag": "2.2.0", 20 | "commit": "6fc01e29bdad0964f62ef56d01297039cdcadbe5" 21 | }, 22 | "_source": "git://github.com/jquery/jquery-dist.git", 23 | "_target": "2.2.0", 24 | "_originalSource": "jquery" 25 | } -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/wwwroot/lib/knockout/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "knockout", 3 | "homepage": "http://knockoutjs.com/", 4 | "description": "Knockout makes it easier to create rich, responsive UIs with JavaScript", 5 | "main": "dist/knockout.js", 6 | "moduleType": [ 7 | "amd", 8 | "globals", 9 | "node" 10 | ], 11 | "keywords": [ 12 | "knockout", 13 | "mvvm", 14 | "mvc", 15 | "spa" 16 | ], 17 | "license": "MIT", 18 | "ignore": [ 19 | "**/.*", 20 | "node_modules", 21 | "bower_components", 22 | "spec", 23 | "build/output" 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/wwwroot/lib/knockout/src/binding/defaultBindings/click.js: -------------------------------------------------------------------------------- 1 | // 'click' is just a shorthand for the usual full-length event:{click:handler} 2 | makeEventHandlerShortcut('click'); 3 | -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/wwwroot/lib/knockout/src/binding/defaultBindings/enableDisable.js: -------------------------------------------------------------------------------- 1 | ko.bindingHandlers['enable'] = { 2 | 'update': function (element, valueAccessor) { 3 | var value = ko.utils.unwrapObservable(valueAccessor()); 4 | if (value && element.disabled) 5 | element.removeAttribute("disabled"); 6 | else if ((!value) && (!element.disabled)) 7 | element.disabled = true; 8 | } 9 | }; 10 | 11 | ko.bindingHandlers['disable'] = { 12 | 'update': function (element, valueAccessor) { 13 | ko.bindingHandlers['enable']['update'](element, function() { return !ko.utils.unwrapObservable(valueAccessor()) }); 14 | } 15 | }; 16 | -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/wwwroot/lib/knockout/src/binding/defaultBindings/html.js: -------------------------------------------------------------------------------- 1 | ko.bindingHandlers['html'] = { 2 | 'init': function() { 3 | // Prevent binding on the dynamically-injected HTML (as developers are unlikely to expect that, and it has security implications) 4 | return { 'controlsDescendantBindings': true }; 5 | }, 6 | 'update': function (element, valueAccessor) { 7 | // setHtml will unwrap the value if needed 8 | ko.utils.setHtml(element, valueAccessor()); 9 | } 10 | }; 11 | -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/wwwroot/lib/knockout/src/binding/defaultBindings/style.js: -------------------------------------------------------------------------------- 1 | ko.bindingHandlers['style'] = { 2 | 'update': function (element, valueAccessor) { 3 | var value = ko.utils.unwrapObservable(valueAccessor() || {}); 4 | ko.utils.objectForEach(value, function(styleName, styleValue) { 5 | styleValue = ko.utils.unwrapObservable(styleValue); 6 | 7 | if (styleValue === null || styleValue === undefined || styleValue === false) { 8 | // Empty string removes the value, whereas null/undefined have no effect 9 | styleValue = ""; 10 | } 11 | 12 | element.style[styleName] = styleValue; 13 | }); 14 | } 15 | }; 16 | -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/wwwroot/lib/knockout/src/binding/defaultBindings/text.js: -------------------------------------------------------------------------------- 1 | ko.bindingHandlers['text'] = { 2 | 'init': function() { 3 | // Prevent binding on the dynamically-injected text node (as developers are unlikely to expect that, and it has security implications). 4 | // It should also make things faster, as we no longer have to consider whether the text node might be bindable. 5 | return { 'controlsDescendantBindings': true }; 6 | }, 7 | 'update': function (element, valueAccessor) { 8 | ko.utils.setTextContent(element, valueAccessor()); 9 | } 10 | }; 11 | ko.virtualElements.allowedBindings['text'] = true; 12 | -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/wwwroot/lib/knockout/src/binding/defaultBindings/uniqueName.js: -------------------------------------------------------------------------------- 1 | ko.bindingHandlers['uniqueName'] = { 2 | 'init': function (element, valueAccessor) { 3 | if (valueAccessor()) { 4 | var name = "ko_unique_" + (++ko.bindingHandlers['uniqueName'].currentIndex); 5 | ko.utils.setElementName(element, name); 6 | } 7 | } 8 | }; 9 | ko.bindingHandlers['uniqueName'].currentIndex = 0; 10 | -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/wwwroot/lib/knockout/src/binding/defaultBindings/visible.js: -------------------------------------------------------------------------------- 1 | ko.bindingHandlers['visible'] = { 2 | 'update': function (element, valueAccessor) { 3 | var value = ko.utils.unwrapObservable(valueAccessor()); 4 | var isCurrentlyVisible = !(element.style.display == "none"); 5 | if (value && !isCurrentlyVisible) 6 | element.style.display = ""; 7 | else if ((!value) && isCurrentlyVisible) 8 | element.style.display = "none"; 9 | } 10 | }; 11 | -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/wwwroot/lib/knockout/src/google-closure-compiler-utils.js: -------------------------------------------------------------------------------- 1 | // Google Closure Compiler helpers (used only to make the minified file smaller) 2 | ko.exportSymbol = function(koPath, object) { 3 | var tokens = koPath.split("."); 4 | 5 | // In the future, "ko" may become distinct from "koExports" (so that non-exported objects are not reachable) 6 | // At that point, "target" would be set to: (typeof koExports !== "undefined" ? koExports : ko) 7 | var target = ko; 8 | 9 | for (var i = 0; i < tokens.length - 1; i++) 10 | target = target[tokens[i]]; 11 | target[tokens[tokens.length - 1]] = object; 12 | }; 13 | ko.exportProperty = function(owner, publicName, object) { 14 | owner[publicName] = object; 15 | }; 16 | -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/wwwroot/lib/knockout/src/namespace.js: -------------------------------------------------------------------------------- 1 | // Internally, all KO objects are attached to koExports (even the non-exported ones whose names will be minified by the closure compiler). 2 | // In the future, the following "ko" variable may be made distinct from "koExports" so that private objects are not externally reachable. 3 | var ko = typeof koExports !== 'undefined' ? koExports : {}; 4 | -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/wwwroot/lib/knockout/src/options.js: -------------------------------------------------------------------------------- 1 | // For any options that may affect various areas of Knockout and aren't directly associated with data binding. 2 | ko.options = { 3 | 'deferUpdates': false, 4 | 'useOnlyNativeEvents': false 5 | }; 6 | 7 | //ko.exportSymbol('options', ko.options); // 'options' isn't minified 8 | -------------------------------------------------------------------------------- /FaucetSite/FaucetSite/wwwroot/lib/knockout/src/version.js: -------------------------------------------------------------------------------- 1 | ko.version = "##VERSION##"; 2 | 3 | ko.exportSymbol('version', ko.version); 4 | -------------------------------------------------------------------------------- /GitVersion.yml: -------------------------------------------------------------------------------- 1 | mode: ContinuousDelivery 2 | branches: {} 3 | assembly-informational-format: '{MajorMinorPatch}+Branch.{BranchName}{PreReleaseTag}' 4 | major-version-bump-message: '\+semver:\s?(breaking|major)' 5 | minor-version-bump-message: '\+semver:\s?(feature|minor)' 6 | patch-version-bump-message: '\+semver:\s?(fix|patch)' 7 | commit-message-incrementing: Enabled 8 | ignore: 9 | sha: [] -------------------------------------------------------------------------------- /IndexStore/.travis.yml: -------------------------------------------------------------------------------- 1 | language: csharp 2 | mono: none 3 | dotnet: 2.0.0 4 | matrix: 5 | include: 6 | - os: linux # Ubuntu 14.04 7 | dist: trusty 8 | sudo: required 9 | - os: osx # OSX 10.12 10 | osx_image: xcode8.1 11 | 12 | # branches to build 13 | branches: 14 | only: 15 | - master 16 | 17 | # Work around NuGet issue #2163 18 | # https://github.com/NuGet/Home/issues/2163 19 | # https://github.com/travis-ci/travis-ci/issues/7728 20 | before_install: 21 | - if [ "$TRAVIS_OS_NAME" = "osx" ]; then ulimit -n 1024; fi 22 | 23 | script: 24 | - chmod +x build.sh 25 | - ./build.sh -------------------------------------------------------------------------------- /IndexStore/Stratis.Bitcoin.Features.IndexStore.Tests/xunit.runner.json: -------------------------------------------------------------------------------- 1 | { 2 | "methodDisplay": "method", 3 | "parallelizeAssembly": false, 4 | "parallelizeTestCollections": false 5 | } -------------------------------------------------------------------------------- /IndexStore/Stratis.Bitcoin.Features.IndexStore/IndexStoreBehaviour.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Extensions.Logging; 2 | using NBitcoin; 3 | using Stratis.Bitcoin.Features.BlockStore; 4 | 5 | namespace Stratis.Bitcoin.Features.IndexStore 6 | { 7 | public interface IIndexStoreBehavior : IBlockStoreBehavior 8 | { 9 | } 10 | 11 | public class IndexStoreBehavior : BlockStoreBehavior, IIndexStoreBehavior 12 | { 13 | public IndexStoreBehavior(ConcurrentChain chain, IIndexRepository indexRepository, IIndexStoreCache indexStoreCache, ILoggerFactory loggerFactory) : 14 | base(chain, indexRepository, indexStoreCache, loggerFactory) 15 | { 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /IndexStore/Stratis.Bitcoin.Features.IndexStore/IndexStoreException.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace Stratis.Bitcoin.Features.IndexStore 4 | { 5 | public class IndexStoreException : Exception 6 | { 7 | public IndexStoreException(string message) : base(message) 8 | { 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /IndexStore/Stratis.IndexStoreD/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "profiles": { 3 | "Stratis.StratisD": { 4 | "commandName": "Project" 5 | }, 6 | "Stratis.StratisD Test": { 7 | "commandName": "Project", 8 | "commandLineArgs": "-testnet -stake=1 -walletname=wallet1 -walletpassword=123456 -debug=1" 9 | } 10 | } 11 | } -------------------------------------------------------------------------------- /IndexStore/build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | dotnet --info 3 | echo STARTED dotnet restore 4 | dotnet restore -v m 5 | echo STARTED dotnet build 6 | dotnet build -c Release ${path} -v m 7 | 8 | echo STARTED dotnet test 9 | 10 | ANYFAILURES=false 11 | for testProject in *.Tests; do 12 | 13 | # exclude integration tests 14 | if [[ "$testProject" == *"Integration.Tests"* ]] || [[ "$testProject" == *"IntegrationTests"* ]] ; then 15 | continue 16 | fi 17 | 18 | echo "Processing $testProject file.."; 19 | cd $testProject 20 | COMMAND="dotnet test --no-build -c Release -v m" 21 | $COMMAND 22 | EXITCODE=$? 23 | echo exit code for $testProject: $EXITCODE 24 | 25 | if [ $EXITCODE -ne 0 ] ; then 26 | ANYFAILURES=true 27 | fi 28 | 29 | cd .. 30 | done 31 | 32 | echo FINISHED dotnet test 33 | if [[ $ANYFAILURES == "true" ]] ; then 34 | exit 1 35 | fi 36 | -------------------------------------------------------------------------------- /QBitNinja/._QBitNinja.sln: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/QBitNinja/._QBitNinja.sln -------------------------------------------------------------------------------- /QBitNinja/.nuget/NuGet.Config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /QBitNinja/.nuget/NuGet.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/QBitNinja/.nuget/NuGet.exe -------------------------------------------------------------------------------- /QBitNinja/AzureIndexer.Api/.config/dotnet-tools.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 1, 3 | "isRoot": true, 4 | "tools": { 5 | "dotnet-ef": { 6 | "version": "3.1.2", 7 | "commands": [ 8 | "dotnet-ef" 9 | ] 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /QBitNinja/AzureIndexer.Api/Infrastructure/ActionDisposable.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace AzureIndexer.Api.Infrastructure 4 | { 5 | public class ActionDisposable : IDisposable 6 | { 7 | Action _Act; 8 | public ActionDisposable(Action act) 9 | { 10 | _Act = act; 11 | } 12 | public ActionDisposable(Action start, Action act) 13 | { 14 | start(); 15 | _Act = act; 16 | } 17 | #region IDisposable Members 18 | 19 | public void Dispose() 20 | { 21 | _Act(); 22 | } 23 | 24 | #endregion 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /QBitNinja/AzureIndexer.Api/Infrastructure/HttpResponseException.cs: -------------------------------------------------------------------------------- 1 | using System.Net; 2 | using System.Net.Http; 3 | 4 | namespace AzureIndexer.Api.Infrastructure 5 | { 6 | using System; 7 | 8 | public class HttpResponseException : Exception 9 | { 10 | public HttpResponseException(string message, HttpStatusCode httpStatusCode) 11 | : base(message) 12 | { 13 | this.StatusCode = httpStatusCode; 14 | } 15 | 16 | public HttpResponseException(HttpResponseMessage message) 17 | : base(message.ReasonPhrase) 18 | { 19 | this.StatusCode = message.StatusCode; 20 | } 21 | 22 | public HttpStatusCode StatusCode { get; set; } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /QBitNinja/AzureIndexer.Api/Infrastructure/IBalanceSearchService.cs: -------------------------------------------------------------------------------- 1 | using AzureIndexer.Api.Models; 2 | using Stratis.Features.AzureIndexer; 3 | 4 | namespace AzureIndexer.Api.Infrastructure 5 | { 6 | public interface IBalanceSearchService 7 | { 8 | BalanceSummary GetBalanceSummary( 9 | BalanceId balanceId, 10 | BlockFeature at, 11 | bool debug, 12 | bool colored); 13 | 14 | BalanceModel GetBalanceDetails( 15 | BalanceId balanceId, 16 | BalanceLocator continuation, 17 | BlockFeature until, 18 | BlockFeature from, 19 | bool includeImmature, 20 | bool unspentOnly, 21 | bool colored); 22 | } 23 | } -------------------------------------------------------------------------------- /QBitNinja/AzureIndexer.Api/Infrastructure/IBlockSearchService.cs: -------------------------------------------------------------------------------- 1 | using AzureIndexer.Api.Models; 2 | using NBitcoin; 3 | 4 | namespace AzureIndexer.Api.Infrastructure 5 | { 6 | public interface IBlockSearchService 7 | { 8 | Block GetBlock(BlockFeature blockFeature, bool headerOnly); 9 | BlockResponse GetBlock(BlockFeature blockFeature, bool headerOnly, bool extended); 10 | } 11 | } -------------------------------------------------------------------------------- /QBitNinja/AzureIndexer.Api/Infrastructure/ISmartContractSearchService.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Threading.Tasks; 3 | using AzureIndexer.Api.Models.Response; 4 | using NBitcoin; 5 | 6 | namespace AzureIndexer.Api.Infrastructure 7 | { 8 | public interface ISmartContractSearchService 9 | { 10 | Task FindSmartContract(uint256 txId); 11 | 12 | Task> GetAllSmartContracts(int? take = 100, bool loadDetails = false); 13 | } 14 | } -------------------------------------------------------------------------------- /QBitNinja/AzureIndexer.Api/Infrastructure/ITransactionSearchService.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | using AzureIndexer.Api.Models.Response; 3 | using NBitcoin; 4 | 5 | namespace AzureIndexer.Api.Infrastructure 6 | { 7 | public interface ITransactionSearchService 8 | { 9 | Task FindTransaction(uint256 txId, bool colored); 10 | } 11 | } -------------------------------------------------------------------------------- /QBitNinja/AzureIndexer.Api/Infrastructure/ListenerTrace.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Diagnostics; 3 | using NBitcoin; 4 | 5 | namespace AzureIndexer.Api.Infrastructure 6 | { 7 | public static class ListenerTrace 8 | { 9 | static TraceSource _Source = new TraceSource("QBitNinja.Listener"); 10 | public static void Error(string info, Exception ex) 11 | { 12 | _Source.TraceEvent(TraceEventType.Error, 0, info + "\r\n" + Utils.ExceptionToString(ex)); 13 | } 14 | public static void Info(string info) 15 | { 16 | _Source.TraceInformation(info); 17 | } 18 | 19 | internal static void Verbose(string info) 20 | { 21 | _Source.TraceEvent(TraceEventType.Verbose, 0, info); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /QBitNinja/AzureIndexer.Api/ModelBinders/BalanceLocatorModelBinder.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | using Microsoft.AspNetCore.Mvc.ModelBinding; 3 | using Stratis.Features.AzureIndexer; 4 | 5 | namespace AzureIndexer.Api.ModelBinders 6 | { 7 | public class BalanceLocatorModelBinder : IModelBinder 8 | { 9 | public Task BindModelAsync(ModelBindingContext bindingContext) 10 | { 11 | if (!typeof(BalanceLocator).IsAssignableFrom(bindingContext.ModelType)) 12 | { 13 | return Task.CompletedTask; 14 | } 15 | 16 | ValueProviderResult val = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 17 | 18 | string key = val.FirstValue; 19 | bindingContext.Model = BalanceLocator.Parse(key); 20 | return Task.CompletedTask; 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /QBitNinja/AzureIndexer.Api/Models/BlockRange.cs: -------------------------------------------------------------------------------- 1 | namespace AzureIndexer.Api.Models 2 | { 3 | public class BlockRange 4 | { 5 | public string Target { get; set; } 6 | 7 | public int From { get; set; } 8 | 9 | public int Count { get; set; } 10 | 11 | public bool Processed { get; set; } 12 | 13 | public override string ToString() 14 | { 15 | return $"{Target}- {From}-{Count}"; 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /QBitNinja/AzureIndexer.Api/Models/BlockResponse.cs: -------------------------------------------------------------------------------- 1 | using NBitcoin; 2 | 3 | #if !CLIENT 4 | namespace AzureIndexer.Api.Models 5 | #else 6 | namespace QBitNinja.Client.Models 7 | #endif 8 | { 9 | public class BlockResponse 10 | { 11 | public BlockInformation AdditionalInformation 12 | { 13 | get; 14 | set; 15 | } 16 | public ExtendedBlockInformation ExtendedInformation 17 | { 18 | get; 19 | set; 20 | } 21 | public Block Block 22 | { 23 | get; 24 | set; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /QBitNinja/AzureIndexer.Api/Models/BroadcastResponse.cs: -------------------------------------------------------------------------------- 1 | using Stratis.Bitcoin.P2P.Protocol.Payloads; 2 | 3 | #if !CLIENT 4 | namespace AzureIndexer.Api.Models 5 | #else 6 | namespace QBitNinja.Client.Models 7 | #endif 8 | { 9 | public class BroadcastError 10 | { 11 | [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] 12 | public RejectCode ErrorCode 13 | { 14 | get; 15 | set; 16 | } 17 | 18 | public string Reason 19 | { 20 | get; 21 | set; 22 | } 23 | } 24 | public class BroadcastResponse 25 | { 26 | public bool Success 27 | { 28 | get; 29 | set; 30 | } 31 | 32 | public BroadcastError Error 33 | { 34 | get; 35 | set; 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /QBitNinja/AzureIndexer.Api/Models/ChainStatus.cs: -------------------------------------------------------------------------------- 1 | #if !CLIENT 2 | namespace AzureIndexer.Api.Models 3 | #else 4 | namespace QBitNinja.Client.Models 5 | #endif 6 | { 7 | public class ChainStatus 8 | { 9 | public ChainStatus() 10 | { 11 | 12 | } 13 | public BlockInformation LatestBlock 14 | { 15 | get; 16 | set; 17 | } 18 | 19 | } 20 | } -------------------------------------------------------------------------------- /QBitNinja/AzureIndexer.Api/Models/DataFormat.cs: -------------------------------------------------------------------------------- 1 | #if !CLIENT 2 | namespace AzureIndexer.Api.Models 3 | #else 4 | namespace QBitNinja.Client.Models 5 | #endif 6 | { 7 | public enum DataFormat 8 | { 9 | Json, 10 | Raw 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /QBitNinja/AzureIndexer.Api/Models/ExtendedBlockInformation.cs: -------------------------------------------------------------------------------- 1 | using NBitcoin; 2 | 3 | #if !CLIENT 4 | namespace AzureIndexer.Api.Models 5 | #else 6 | namespace QBitNinja.Client.Models 7 | #endif 8 | { 9 | public class ExtendedBlockInformation 10 | { 11 | public int Size 12 | { 13 | get; 14 | set; 15 | } 16 | public int StrippedSize 17 | { 18 | get; 19 | set; 20 | } 21 | public int TransactionCount 22 | { 23 | get; 24 | set; 25 | } 26 | public Money BlockSubsidy 27 | { 28 | get; 29 | set; 30 | } 31 | public Money BlockReward 32 | { 33 | get; 34 | set; 35 | } 36 | } 37 | } -------------------------------------------------------------------------------- /QBitNinja/AzureIndexer.Api/Models/NewBlockNotificationData.cs: -------------------------------------------------------------------------------- 1 | using NBitcoin; 2 | 3 | #if !CLIENT 4 | namespace AzureIndexer.Api.Models 5 | #else 6 | namespace QBitNinja.Client.Models 7 | #endif 8 | { 9 | public class NewBlockNotificationData : NotificationData 10 | { 11 | public NewBlockNotificationData() 12 | { 13 | Type = SubscriptionType.NewBlock; 14 | } 15 | public BlockHeader Header 16 | { 17 | get; 18 | set; 19 | } 20 | 21 | public uint256 BlockId 22 | { 23 | get; 24 | set; 25 | } 26 | 27 | public int Height 28 | { 29 | get; 30 | set; 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /QBitNinja/AzureIndexer.Api/Models/NewBlockSubscription.cs: -------------------------------------------------------------------------------- 1 | #if !CLIENT 2 | namespace AzureIndexer.Api.Models 3 | #else 4 | namespace QBitNinja.Client.Models 5 | #endif 6 | { 7 | public class NewBlockSubscription : Subscription 8 | { 9 | public NewBlockSubscription() 10 | { 11 | Type = SubscriptionType.NewBlock; 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /QBitNinja/AzureIndexer.Api/Models/NewTransactionNotificationData.cs: -------------------------------------------------------------------------------- 1 | using NBitcoin; 2 | 3 | #if !CLIENT 4 | namespace AzureIndexer.Api.Models 5 | #else 6 | namespace QBitNinja.Client.Models 7 | #endif 8 | { 9 | public class NewTransactionNotificationData : NotificationData 10 | { 11 | public NewTransactionNotificationData() 12 | { 13 | Type = SubscriptionType.NewTransaction; 14 | } 15 | public uint256 TransactionId 16 | { 17 | get; 18 | set; 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /QBitNinja/AzureIndexer.Api/Models/NewTransactionSubscription.cs: -------------------------------------------------------------------------------- 1 | #if !CLIENT 2 | namespace AzureIndexer.Api.Models 3 | #else 4 | namespace QBitNinja.Client.Models 5 | #endif 6 | { 7 | public class NewTransactionSubscription : Subscription 8 | { 9 | public NewTransactionSubscription() 10 | { 11 | Type = SubscriptionType.NewTransaction; 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /QBitNinja/AzureIndexer.Api/Models/NotificationData.cs: -------------------------------------------------------------------------------- 1 | using AzureIndexer.Api.JsonConverters; 2 | using Newtonsoft.Json; 3 | #if !CLIENT 4 | #else 5 | using QBitNinja.Client.JsonConverters; 6 | #endif 7 | 8 | #if !CLIENT 9 | namespace AzureIndexer.Api.Models 10 | #else 11 | namespace QBitNinja.Client.Models 12 | #endif 13 | { 14 | 15 | [JsonConverter(typeof(EnumTypeJsonConverter))] 16 | [EnumType(SubscriptionType.NewBlock, typeof(NewBlockNotificationData))] 17 | [EnumType(SubscriptionType.NewTransaction, typeof(NewTransactionNotificationData))] 18 | public class NotificationData 19 | { 20 | public SubscriptionType Type 21 | { 22 | get; 23 | set; 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /QBitNinja/AzureIndexer.Api/Models/Tokens/GetTokenTransactionsRequest.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | 6 | namespace AzureIndexer.Api.Models.Tokens 7 | { 8 | public class GetTokenTransactionsRequest 9 | { 10 | public string TokenAddress { get; set; } 11 | 12 | public int From { get; set; } 13 | 14 | public int Count { get; set; } 15 | } 16 | 17 | public class TokenTransactionResponse 18 | { 19 | public string TokenAddress { get; set; } 20 | 21 | public string FromAddress { get; set; } 22 | 23 | public string ToAddress { get; set; } 24 | 25 | public string TxId { get; set; } 26 | 27 | public string Amount { get; set; } 28 | 29 | public DateTimeOffset Time { get; set; } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /QBitNinja/AzureIndexer.Api/Models/Tokens/TokenDetail.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | 6 | namespace AzureIndexer.Api.Models.Tokens 7 | { 8 | public class TokenDetail 9 | { 10 | public string Address { get; set; } 11 | 12 | public string Name { get; set; } 13 | 14 | public string Symbol { get; set; } 15 | 16 | public ulong Supply { get; set; } 17 | 18 | public int Decimals { get; set; } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /QBitNinja/AzureIndexer.Api/Notifications/MessageControl.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace AzureIndexer.Api.Notifications 4 | { 5 | public class MessageControl 6 | { 7 | internal DateTime? _Scheduled; 8 | public MessageControl() 9 | { 10 | } 11 | public void RescheduleIn(TimeSpan delta) 12 | { 13 | RescheduleFor(DateTime.UtcNow + delta); 14 | } 15 | 16 | public void RescheduleFor(DateTime date) 17 | { 18 | date = date.ToUniversalTime(); 19 | _Scheduled = date; 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /QBitNinja/AzureIndexer.Api/Notifications/Notification.cs: -------------------------------------------------------------------------------- 1 | using AzureIndexer.Api.Models; 2 | using Stratis.Bitcoin.Utilities.JsonConverters; 3 | 4 | namespace AzureIndexer.Api.Notifications 5 | { 6 | public class Notification 7 | { 8 | public Subscription Subscription 9 | { 10 | get; 11 | set; 12 | } 13 | 14 | public NotificationData Data 15 | { 16 | get; 17 | set; 18 | } 19 | 20 | public override string ToString() 21 | { 22 | return Serializer.ToString(this); 23 | } 24 | 25 | public int Tried 26 | { 27 | get; 28 | set; 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /QBitNinja/AzureIndexer.Api/Notifications/Notify.cs: -------------------------------------------------------------------------------- 1 | namespace AzureIndexer.Api.Notifications 2 | { 3 | public class Notify 4 | { 5 | public Notify() 6 | { 7 | 8 | } 9 | public Notify(Notification notification) 10 | { 11 | Notification = notification; 12 | } 13 | public Notification Notification 14 | { 15 | get; 16 | set; 17 | } 18 | public bool SendAndForget 19 | { 20 | get; 21 | set; 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /QBitNinja/AzureIndexer.Api/Notifications/SubscriptionChange.cs: -------------------------------------------------------------------------------- 1 | using AzureIndexer.Api.Models; 2 | 3 | namespace AzureIndexer.Api.Notifications 4 | { 5 | public class SubscriptionChange 6 | { 7 | public SubscriptionChange() 8 | { 9 | 10 | } 11 | public SubscriptionChange(Subscription subscription, bool added) 12 | { 13 | Subscription = subscription; 14 | Added = added; 15 | } 16 | public Subscription Subscription 17 | { 18 | get; 19 | set; 20 | } 21 | public bool Added 22 | { 23 | get; 24 | set; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /QBitNinja/AzureIndexer.Api/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Debug", 5 | "System": "Information", 6 | "Microsoft": "Information" 7 | } 8 | }, 9 | "LocalChain": "C:\\Temp" 10 | } 11 | -------------------------------------------------------------------------------- /QBitNinja/AzureIndexer.Api/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Warning" 5 | } 6 | }, 7 | "AllowedHosts": "*", 8 | "Azure.AccountName": "", 9 | "Azure.Key": "", 10 | "StorageNamespace": "", 11 | "CheckpointSetName": "default", 12 | "Network": "CirrusMain", 13 | "Node": "localhost:16178", 14 | "Sidechain": true, 15 | "LocalChain": "C:\\Temp", 16 | "ServiceBus": "" 17 | } 18 | -------------------------------------------------------------------------------- /QBitNinja/Common/Class1.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace Common 8 | { 9 | public class Class1 10 | { 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /QBitNinja/Newtonsoft.Json(portable)/Linq/JsonPath/ArrayMultipleIndexFilter.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace Newtonsoft.Json.Linq.JsonPath 4 | { 5 | internal class ArrayMultipleIndexFilter : PathFilter 6 | { 7 | public List Indexes { get; set; } 8 | 9 | public override IEnumerable ExecuteFilter(IEnumerable current, bool errorWhenNoMatch) 10 | { 11 | foreach (JToken t in current) 12 | { 13 | foreach (int i in Indexes) 14 | { 15 | JToken v = GetTokenIndex(t, errorWhenNoMatch, i); 16 | 17 | if (v != null) 18 | yield return v; 19 | } 20 | } 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /QBitNinja/Newtonsoft.Json(portable)/Linq/JsonPath/QueryFilter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace Newtonsoft.Json.Linq.JsonPath 5 | { 6 | internal class QueryFilter : PathFilter 7 | { 8 | public QueryExpression Expression { get; set; } 9 | 10 | public override IEnumerable ExecuteFilter(IEnumerable current, bool errorWhenNoMatch) 11 | { 12 | foreach (JToken t in current) 13 | { 14 | foreach (JToken v in t) 15 | { 16 | if (Expression.IsMatch(v)) 17 | yield return v; 18 | } 19 | } 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /QBitNinja/Newtonsoft.Json(portable)/Linq/MergeArrayHandling.cs: -------------------------------------------------------------------------------- 1 | namespace Newtonsoft.Json.Linq 2 | { 3 | /// 4 | /// Specifies how JSON arrays are merged together. 5 | /// 6 | internal enum MergeArrayHandling 7 | { 8 | /// Concatenate arrays. 9 | Concat, 10 | 11 | /// Union arrays, skipping items that already exist. 12 | Union, 13 | 14 | /// Replace all array items. 15 | Replace, 16 | 17 | /// Merge array items together, matched by index. 18 | Merge 19 | } 20 | } -------------------------------------------------------------------------------- /QBitNinja/Newtonsoft.Json(portable)/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/QBitNinja/Newtonsoft.Json(portable)/Properties/AssemblyInfo.cs -------------------------------------------------------------------------------- /QBitNinja/Newtonsoft.Json(portable)/Utilities/CollectionUtils.cs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/QBitNinja/Newtonsoft.Json(portable)/Utilities/CollectionUtils.cs -------------------------------------------------------------------------------- /QBitNinja/QBitNinja.Client.NETCore/global.json: -------------------------------------------------------------------------------- 1 | { 2 | "sdk": { "version": "1.0.0-preview2-1-003177" } 3 | } -------------------------------------------------------------------------------- /QBitNinja/QBitNinja/ActionDisposable.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace Api 4 | { 5 | public class ActionDisposable : IDisposable 6 | { 7 | Action _Act; 8 | public ActionDisposable(Action act) 9 | { 10 | _Act = act; 11 | } 12 | public ActionDisposable(Action start, Action act) 13 | { 14 | start(); 15 | _Act = act; 16 | } 17 | #region IDisposable Members 18 | 19 | public void Dispose() 20 | { 21 | _Act(); 22 | } 23 | 24 | #endregion 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /QBitNinja/QBitNinja/App_Start/RouteConfig.cs: -------------------------------------------------------------------------------- 1 | using System.Web.Mvc; 2 | using System.Web.Routing; 3 | 4 | namespace QBitNinja 5 | { 6 | public class RouteConfig 7 | { 8 | public static void RegisterRoutes(RouteCollection routes) 9 | { 10 | routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 11 | routes.MapRoute( 12 | name: "Default", 13 | url: "", 14 | defaults: new { controller="Help", action = "Index" } 15 | ); 16 | } 17 | } 18 | } 19 | 20 | -------------------------------------------------------------------------------- /QBitNinja/QBitNinja/FodyWeavers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /QBitNinja/QBitNinja/Global.asax: -------------------------------------------------------------------------------- 1 | <%@ Application Codebehind="Global.asax.cs" Inherits="QBitNinja.WebApiApplication" Language="C#" %> 2 | -------------------------------------------------------------------------------- /QBitNinja/QBitNinja/Global.asax.cs: -------------------------------------------------------------------------------- 1 | using NBitcoin; 2 | using System; 3 | using System.Threading; 4 | using System.Web; 5 | using System.Web.Http; 6 | using System.Web.Routing; 7 | 8 | namespace QBitNinja 9 | { 10 | public class WebApiApplication : HttpApplication 11 | { 12 | UpdateChainListener _Listener; 13 | protected void Application_Start() 14 | { 15 | GlobalConfiguration.Configure(WebApiConfig.Register); 16 | RouteConfig.RegisterRoutes(RouteTable.Routes); 17 | _Listener = new UpdateChainListener(); 18 | _Listener.Listen(GlobalConfiguration.Configuration); 19 | } 20 | protected void Application_End() 21 | { 22 | if (_Listener != null) 23 | _Listener.Dispose(); 24 | } 25 | 26 | 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /QBitNinja/QBitNinja/ListenerTrace.cs: -------------------------------------------------------------------------------- 1 | using NBitcoin; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Diagnostics; 5 | using System.Linq; 6 | using System.Text; 7 | using System.Threading.Tasks; 8 | 9 | namespace QBitNinja 10 | { 11 | public static class ListenerTrace 12 | { 13 | static TraceSource _Source = new TraceSource("QBitNinja.Listener"); 14 | public static void Error(string info, Exception ex) 15 | { 16 | _Source.TraceEvent(TraceEventType.Error, 0, info + "\r\n" + Utils.ExceptionToString(ex)); 17 | } 18 | public static void Info(string info) 19 | { 20 | _Source.TraceInformation(info); 21 | } 22 | 23 | internal static void Verbose(string info) 24 | { 25 | _Source.TraceEvent(TraceEventType.Verbose, 0, info); 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /QBitNinja/QBitNinja/Models/BroadcastResponse.cs: -------------------------------------------------------------------------------- 1 | using NBitcoin.Protocol; 2 | using Stratis.Bitcoin.P2P.Protocol.Payloads; 3 | 4 | #if !CLIENT 5 | namespace QBitNinja.Models 6 | #else 7 | namespace QBitNinja.Client.Models 8 | #endif 9 | { 10 | public class BroadcastError 11 | { 12 | [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] 13 | public RejectCode ErrorCode 14 | { 15 | get; 16 | set; 17 | } 18 | 19 | public string Reason 20 | { 21 | get; 22 | set; 23 | } 24 | } 25 | public class BroadcastResponse 26 | { 27 | public bool Success 28 | { 29 | get; 30 | set; 31 | } 32 | 33 | public BroadcastError Error 34 | { 35 | get; 36 | set; 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /QBitNinja/QBitNinja/Models/ChainStatus.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Web; 5 | 6 | #if !CLIENT 7 | namespace QBitNinja.Models 8 | #else 9 | namespace QBitNinja.Client.Models 10 | #endif 11 | { 12 | public class ChainStatus 13 | { 14 | public ChainStatus() 15 | { 16 | 17 | } 18 | public BlockInformation LatestBlock 19 | { 20 | get; 21 | set; 22 | } 23 | 24 | } 25 | } -------------------------------------------------------------------------------- /QBitNinja/QBitNinja/Models/DataFormat.cs: -------------------------------------------------------------------------------- 1 | #if !CLIENT 2 | namespace QBitNinja.Models 3 | #else 4 | namespace QBitNinja.Client.Models 5 | #endif 6 | { 7 | public enum DataFormat 8 | { 9 | Json, 10 | Raw 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /QBitNinja/QBitNinja/Models/ExtendedBlockInformation.cs: -------------------------------------------------------------------------------- 1 | using NBitcoin; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Web; 6 | 7 | #if !CLIENT 8 | namespace QBitNinja.Models 9 | #else 10 | namespace QBitNinja.Client.Models 11 | #endif 12 | { 13 | public class ExtendedBlockInformation 14 | { 15 | public int Size 16 | { 17 | get; 18 | set; 19 | } 20 | public int StrippedSize 21 | { 22 | get; 23 | set; 24 | } 25 | public int TransactionCount 26 | { 27 | get; 28 | set; 29 | } 30 | public Money BlockSubsidy 31 | { 32 | get; 33 | set; 34 | } 35 | public Money BlockReward 36 | { 37 | get; 38 | set; 39 | } 40 | } 41 | } -------------------------------------------------------------------------------- /QBitNinja/QBitNinja/Models/GetBlockResponse.cs: -------------------------------------------------------------------------------- 1 | using NBitcoin; 2 | 3 | #if !CLIENT 4 | namespace QBitNinja.Models 5 | #else 6 | namespace QBitNinja.Client.Models 7 | #endif 8 | { 9 | public class GetBlockResponse 10 | { 11 | public BlockInformation AdditionalInformation 12 | { 13 | get; 14 | set; 15 | } 16 | public ExtendedBlockInformation ExtendedInformation 17 | { 18 | get; 19 | set; 20 | } 21 | public Block Block 22 | { 23 | get; 24 | set; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /QBitNinja/QBitNinja/Models/NewBlockNotificationData.cs: -------------------------------------------------------------------------------- 1 | using NBitcoin; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Text; 6 | using System.Threading.Tasks; 7 | 8 | #if !CLIENT 9 | namespace QBitNinja.Models 10 | #else 11 | namespace QBitNinja.Client.Models 12 | #endif 13 | { 14 | public class NewBlockNotificationData : NotificationData 15 | { 16 | public NewBlockNotificationData() 17 | { 18 | Type = SubscriptionType.NewBlock; 19 | } 20 | public BlockHeader Header 21 | { 22 | get; 23 | set; 24 | } 25 | 26 | public uint256 BlockId 27 | { 28 | get; 29 | set; 30 | } 31 | 32 | public int Height 33 | { 34 | get; 35 | set; 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /QBitNinja/QBitNinja/Models/NewBlockSubscription.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | #if !CLIENT 8 | namespace QBitNinja.Models 9 | #else 10 | namespace QBitNinja.Client.Models 11 | #endif 12 | { 13 | public class NewBlockSubscription : Subscription 14 | { 15 | public NewBlockSubscription() 16 | { 17 | Type = SubscriptionType.NewBlock; 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /QBitNinja/QBitNinja/Models/NewTransactionNotificationData.cs: -------------------------------------------------------------------------------- 1 | using NBitcoin; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Text; 6 | using System.Threading.Tasks; 7 | 8 | #if !CLIENT 9 | namespace QBitNinja.Models 10 | #else 11 | namespace QBitNinja.Client.Models 12 | #endif 13 | { 14 | public class NewTransactionNotificationData : NotificationData 15 | { 16 | public NewTransactionNotificationData() 17 | { 18 | Type = SubscriptionType.NewTransaction; 19 | } 20 | public uint256 TransactionId 21 | { 22 | get; 23 | set; 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /QBitNinja/QBitNinja/Models/NewTransactionSubscription.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | #if !CLIENT 8 | namespace QBitNinja.Models 9 | #else 10 | namespace QBitNinja.Client.Models 11 | #endif 12 | { 13 | public class NewTransactionSubscription : Subscription 14 | { 15 | public NewTransactionSubscription() 16 | { 17 | Type = SubscriptionType.NewTransaction; 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /QBitNinja/QBitNinja/Models/NotificationData.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | #if !CLIENT 3 | using QBitNinja.JsonConverters; 4 | #else 5 | using QBitNinja.Client.JsonConverters; 6 | #endif 7 | using System; 8 | using System.Collections.Generic; 9 | using System.Linq; 10 | using System.Text; 11 | using System.Threading.Tasks; 12 | 13 | #if !CLIENT 14 | namespace QBitNinja.Models 15 | #else 16 | namespace QBitNinja.Client.Models 17 | #endif 18 | { 19 | 20 | [JsonConverter(typeof(EnumTypeJsonConverter))] 21 | [EnumType(SubscriptionType.NewBlock, typeof(NewBlockNotificationData))] 22 | [EnumType(SubscriptionType.NewTransaction, typeof(NewTransactionNotificationData))] 23 | public class NotificationData 24 | { 25 | public SubscriptionType Type 26 | { 27 | get; 28 | set; 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /QBitNinja/QBitNinja/Notifications/BroadcastedTransaction.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.WindowsAzure.Storage.Table; 2 | using NBitcoin; 3 | using NBitcoin.DataEncoders; 4 | using System; 5 | using System.Collections.Generic; 6 | using System.Linq; 7 | using System.Text; 8 | using System.Threading.Tasks; 9 | 10 | namespace QBitNinja.Notifications 11 | { 12 | public class BroadcastedTransaction 13 | { 14 | public BroadcastedTransaction() 15 | { 16 | 17 | } 18 | public BroadcastedTransaction(Transaction tx) 19 | { 20 | Transaction = tx; 21 | } 22 | public int Tried 23 | { 24 | get; 25 | set; 26 | } 27 | public Transaction Transaction 28 | { 29 | get; 30 | set; 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /QBitNinja/QBitNinja/Notifications/Notification.cs: -------------------------------------------------------------------------------- 1 | using QBitNinja.Models; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Text; 6 | using System.Threading.Tasks; 7 | 8 | namespace QBitNinja.Notifications 9 | { 10 | public class Notification 11 | { 12 | public Subscription Subscription 13 | { 14 | get; 15 | set; 16 | } 17 | 18 | public NotificationData Data 19 | { 20 | get; 21 | set; 22 | } 23 | 24 | public override string ToString() 25 | { 26 | return Serializer.ToString(this); 27 | } 28 | 29 | public int Tried 30 | { 31 | get; 32 | set; 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /QBitNinja/QBitNinja/Notifications/Notify.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace QBitNinja.Notifications 8 | { 9 | public class Notify 10 | { 11 | public Notify() 12 | { 13 | 14 | } 15 | public Notify(Notification notification) 16 | { 17 | Notification = notification; 18 | } 19 | public Notification Notification 20 | { 21 | get; 22 | set; 23 | } 24 | public bool SendAndForget 25 | { 26 | get; 27 | set; 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /QBitNinja/QBitNinja/Notifications/SubscriptionChange.cs: -------------------------------------------------------------------------------- 1 | using QBitNinja.Models; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Text; 6 | using System.Threading.Tasks; 7 | 8 | namespace QBitNinja.Notifications 9 | { 10 | public class SubscriptionChange 11 | { 12 | public SubscriptionChange() 13 | { 14 | 15 | } 16 | public SubscriptionChange(Subscription subscription, bool added) 17 | { 18 | Subscription = subscription; 19 | Added = added; 20 | } 21 | public Subscription Subscription 22 | { 23 | get; 24 | set; 25 | } 26 | public bool Added 27 | { 28 | get; 29 | set; 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /QBitNinja/QBitNinja/QBitNinja.Tokenized.nuspec: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | QBitNinja.Server 5 | $version$ 6 | QBitNinja Server 7 | QBitNinja 8 | QBitNinja 9 | https://aois.blob.core.windows.net/public/Bitcoin.png 10 | false 11 | http://opensource.org/licenses/MIT 12 | Server library for QBitNinja 13 | 14 | 15 | https://github.com/QBitNinja/QBitNinja 16 | Copyright 2015 17 | bitcoin 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /QBitNinja/QBitNinja/Views/Help/Index.cshtml: -------------------------------------------------------------------------------- 1 | @model QBitNinja.Models.HelpModel 2 | @{ 3 | ViewBag.Title = "Help"; 4 | } 5 | 6 | More documentation on http://docs.qbitninja.apiary.io/. 7 | Methods 8 | 9 | @foreach (var route in Model.Routes) 10 | { 11 | 12 | @route.Template 13 | 14 | @foreach (var sample in route.Samples) 15 | { 16 | 17 | @if (@sample.Comment != null) 18 | { 19 | @sample.Comment 20 | } 21 | @sample.Url 22 | 23 | } 24 | 25 | 26 | } 27 | 28 | -------------------------------------------------------------------------------- /QBitNinja/QBitNinja/Views/Shared/Error.cshtml: -------------------------------------------------------------------------------- 1 | @model System.Web.Mvc.HandleErrorInfo 2 | @{ 3 | Layout = null; 4 | } 5 | 6 | 7 | 8 | 9 | 10 | Error 11 | 12 | 13 | 14 | Error. 15 | An error occurred while processing your request. 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /QBitNinja/QBitNinja/Views/_ViewStart.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | //Layout = "~/Views/Shared/_Layout.cshtml"; 3 | } -------------------------------------------------------------------------------- /block-explorer-ui/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | max_line_length = off 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /block-explorer-ui/.gitignore: -------------------------------------------------------------------------------- 1 | # See http://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # compiled output 4 | /dist 5 | /tmp 6 | /out-tsc 7 | /gen 8 | /swagger.json 9 | 10 | # dependencies 11 | /node_modules 12 | 13 | # IDEs and editors 14 | /.idea 15 | .project 16 | .classpath 17 | .c9/ 18 | *.launch 19 | .settings/ 20 | *.sublime-workspace 21 | 22 | # IDE - VSCode 23 | .vscode/* 24 | !.vscode/settings.json 25 | !.vscode/tasks.json 26 | !.vscode/launch.json 27 | !.vscode/extensions.json 28 | 29 | # misc 30 | /.sass-cache 31 | /connect.lock 32 | /coverage 33 | /libpeerconnection.log 34 | npm-debug.log 35 | yarn-error.log 36 | testem.log 37 | /typings 38 | 39 | # System Files 40 | .DS_Store 41 | Thumbs.db 42 | -------------------------------------------------------------------------------- /block-explorer-ui/.prettierignore: -------------------------------------------------------------------------------- 1 | # Add files here to ignore them from prettier formatting 2 | -------------------------------------------------------------------------------- /block-explorer-ui/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true 3 | } -------------------------------------------------------------------------------- /block-explorer-ui/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "nrwl.angular-console", 4 | "angular.ng-template", 5 | "esbenp.prettier-vscode" 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /block-explorer-ui/apps/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /block-explorer-ui/apps/explorer-e2e/protractor.conf.js: -------------------------------------------------------------------------------- 1 | // Protractor configuration file, see link for more information 2 | // https://github.com/angular/protractor/blob/master/lib/config.ts 3 | 4 | const { SpecReporter } = require('jasmine-spec-reporter'); 5 | 6 | exports.config = { 7 | allScriptsTimeout: 11000, 8 | specs: ['./src/**/*.e2e-spec.ts'], 9 | capabilities: { 10 | browserName: 'chrome' 11 | }, 12 | directConnect: true, 13 | baseUrl: 'http://localhost:4200/', 14 | framework: 'jasmine', 15 | jasmineNodeOpts: { 16 | showColors: true, 17 | defaultTimeoutInterval: 30000, 18 | print: function() {} 19 | }, 20 | onPrepare() { 21 | require('ts-node').register({ 22 | project: require('path').join(__dirname, './tsconfig.e2e.json') 23 | }); 24 | jasmine 25 | .getEnv() 26 | .addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /block-explorer-ui/apps/explorer-e2e/src/app.e2e-spec.ts: -------------------------------------------------------------------------------- 1 | import { AppPage } from './app.po'; 2 | 3 | describe('workspace-project App', () => { 4 | let page: AppPage; 5 | 6 | beforeEach(() => { 7 | page = new AppPage(); 8 | }); 9 | 10 | it('should display welcome message', () => { 11 | page.navigateTo(); 12 | expect(page.getParagraphText()).toEqual('Welcome to explorer!'); 13 | }); 14 | }); 15 | -------------------------------------------------------------------------------- /block-explorer-ui/apps/explorer-e2e/src/app.po.ts: -------------------------------------------------------------------------------- 1 | import { browser, by, element } from 'protractor'; 2 | 3 | export class AppPage { 4 | navigateTo() { 5 | return browser.get('/'); 6 | } 7 | 8 | getParagraphText() { 9 | return element(by.css('blockexplorer-root h1')).getText(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /block-explorer-ui/apps/explorer-e2e/tsconfig.e2e.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc/apps/explorer-e2e", 5 | "module": "commonjs", 6 | "target": "es5", 7 | "types": ["jasmine", "jasminewd2", "node"] 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /block-explorer-ui/apps/explorer/browserslist: -------------------------------------------------------------------------------- 1 | # This file is currently used by autoprefixer to adjust CSS to support the below specified browsers 2 | # For additional information regarding the format and rule options, please see: 3 | # https://github.com/browserslist/browserslist#queries 4 | # 5 | # For IE 9-11 support, please remove 'not' from the last line of the file and adjust as needed 6 | 7 | > 0.5% 8 | last 2 versions 9 | Firefox ESR 10 | not dead 11 | not IE 9-11 -------------------------------------------------------------------------------- /block-explorer-ui/apps/explorer/karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration file, see link for more information 2 | // https://karma-runner.github.io/1.0/config/configuration-file.html 3 | 4 | const { join } = require('path'); 5 | const getBaseKarmaConfig = require('../../karma.conf'); 6 | 7 | module.exports = function(config) { 8 | const baseConfig = getBaseKarmaConfig(); 9 | config.set({ 10 | ...baseConfig, 11 | coverageIstanbulReporter: { 12 | ...baseConfig.coverageIstanbulReporter, 13 | dir: join(__dirname, '../../coverage/apps/explorer') 14 | } 15 | }); 16 | }; 17 | -------------------------------------------------------------------------------- /block-explorer-ui/apps/explorer/src/app/+state/app.actions.ts: -------------------------------------------------------------------------------- 1 | import { Action } from '@ngrx/store'; 2 | import { Entity } from './app.reducer'; 3 | 4 | export enum AppActionTypes { 5 | LoadApp = '[App] Load App', 6 | AppLoaded = '[App] App Loaded', 7 | AppLoadError = '[App] App Load Error' 8 | } 9 | 10 | export class LoadApp implements Action { 11 | readonly type = AppActionTypes.LoadApp; 12 | } 13 | 14 | export class AppLoadError implements Action { 15 | readonly type = AppActionTypes.AppLoadError; 16 | constructor(public payload: any) {} 17 | } 18 | 19 | export class AppLoaded implements Action { 20 | readonly type = AppActionTypes.AppLoaded; 21 | constructor(public payload: Entity[]) {} 22 | } 23 | 24 | export type AppAction = LoadApp | AppLoaded | AppLoadError; 25 | 26 | export const fromAppActions = { 27 | LoadApp, 28 | AppLoaded, 29 | AppLoadError 30 | }; 31 | -------------------------------------------------------------------------------- /block-explorer-ui/apps/explorer/src/app/+state/app.facade.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | 3 | import { select, Store } from '@ngrx/store'; 4 | 5 | import { AppPartialState } from './app.reducer'; 6 | import { appQuery } from './app.selectors'; 7 | import { LoadApp } from './app.actions'; 8 | 9 | @Injectable() 10 | export class AppFacade { 11 | loaded$ = this.store.pipe(select(appQuery.getLoaded)); 12 | allApp$ = this.store.pipe(select(appQuery.getAllApp)); 13 | selectedApp$ = this.store.pipe(select(appQuery.getSelectedApp)); 14 | 15 | constructor(private store: Store) {} 16 | 17 | loadAll() { 18 | this.store.dispatch(new LoadApp()); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /block-explorer-ui/apps/explorer/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /block-explorer-ui/apps/explorer/src/app/app.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/block-explorer-ui/apps/explorer/src/app/app.component.scss -------------------------------------------------------------------------------- /block-explorer-ui/apps/explorer/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/block-explorer-ui/apps/explorer/src/assets/.gitkeep -------------------------------------------------------------------------------- /block-explorer-ui/apps/explorer/src/assets/config/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "apiBaseUrl": "https://cirrusmainindexer1.azurewebsites.net", 3 | "symbol": "CRS", 4 | "chain": "Cirrus Mainnet", 5 | "sidechainColor": "#3bafba", 6 | "stratColor": "#158bcf", 7 | "stratMainUrl": "https://stratisinttestbe-mainnet.azurewebsites.net/", 8 | "stratTestUrl": "https://stratisinttestbe-testnet.azurewebsites.net/", 9 | "sidechainMainUrl": "https://cirrusmainexplorer1.azurewebsites.net/", 10 | "sidechainTestUrl": "https://cirrusmainexplorer1.azurewebsites.net/" 11 | } 12 | -------------------------------------------------------------------------------- /block-explorer-ui/apps/explorer/src/assets/styles/styles-variables.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/block-explorer-ui/apps/explorer/src/assets/styles/styles-variables.scss -------------------------------------------------------------------------------- /block-explorer-ui/apps/explorer/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true, 3 | apiBaseUrl: 'https://stratisinttestindx.azurewebsites.net' 4 | }; 5 | -------------------------------------------------------------------------------- /block-explorer-ui/apps/explorer/src/environments/environment.ts: -------------------------------------------------------------------------------- 1 | // This file can be replaced during build by using the `fileReplacements` array. 2 | // `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. 3 | // The list of file replacements can be found in `angular.json`. 4 | 5 | export const environment = { 6 | production: false, 7 | apiBaseUrl: 'http://localhost:5000' 8 | }; 9 | 10 | /* 11 | * For easier debugging in development mode, you can import the following file 12 | * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. 13 | * 14 | * This import should be commented out in production mode because it will have a negative impact 15 | * on performance if an error is thrown. 16 | */ 17 | // import 'zone.js/dist/zone-error'; // Included with Angular CLI. 18 | -------------------------------------------------------------------------------- /block-explorer-ui/apps/explorer/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/block-explorer-ui/apps/explorer/src/favicon.ico -------------------------------------------------------------------------------- /block-explorer-ui/apps/explorer/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Block and Smart Contracts Explorer 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /block-explorer-ui/apps/explorer/src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from '@angular/core'; 2 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 3 | 4 | import { AppModule } from './app/app.module'; 5 | import { environment } from './environments/environment'; 6 | 7 | if (environment.production) { 8 | enableProdMode(); 9 | } 10 | 11 | platformBrowserDynamic() 12 | .bootstrapModule(AppModule) 13 | .catch(err => console.error(err)); 14 | -------------------------------------------------------------------------------- /block-explorer-ui/apps/explorer/src/styles.scss: -------------------------------------------------------------------------------- 1 | // @import "assets/styles-variables"; 2 | 3 | // @import '~bootstrap/scss/bootstrap-reboot'; 4 | // @import '~bootstrap/scss/bootstrap-grid'; 5 | // @import '~bootstrap/scss/bootstrap'; 6 | @import '~prismjs/themes/prism-coy.css'; 7 | 8 | @import 'assets/styles/bootstrap.css'; 9 | 10 | .single .nav-pills { 11 | display: none !important; 12 | } 13 | 14 | .m20top { 15 | margin-top: 20px; 16 | } 17 | 18 | .stat-header { 19 | margin-bottom: 0; 20 | } 21 | -------------------------------------------------------------------------------- /block-explorer-ui/apps/explorer/src/test.ts: -------------------------------------------------------------------------------- 1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 2 | 3 | import 'zone.js/dist/zone-testing'; 4 | import { getTestBed } from '@angular/core/testing'; 5 | import { 6 | BrowserDynamicTestingModule, 7 | platformBrowserDynamicTesting 8 | } from '@angular/platform-browser-dynamic/testing'; 9 | 10 | declare const require: any; 11 | 12 | // First, initialize the Angular testing environment. 13 | getTestBed().initTestEnvironment( 14 | BrowserDynamicTestingModule, 15 | platformBrowserDynamicTesting() 16 | ); 17 | // Then we find all the tests. 18 | const context = require.context('./', true, /\.spec\.ts$/); 19 | // And load the modules. 20 | context.keys().map(context); 21 | -------------------------------------------------------------------------------- /block-explorer-ui/apps/explorer/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc/apps/explorer", 5 | "types": [] 6 | }, 7 | "exclude": ["test.ts", "**/*.spec.ts"], 8 | "include": ["**/*.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /block-explorer-ui/apps/explorer/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc/apps/explorer", 5 | "types": ["jasmine", "node"] 6 | }, 7 | "files": ["src/test.ts", "src/polyfills.ts"], 8 | "include": ["**/*.spec.ts", "**/*.d.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /block-explorer-ui/apps/explorer/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tslint.json", 3 | "rules": { 4 | "directive-selector": [true, "attribute", "blockexplorer", "camelCase"], 5 | "component-selector": [true, "element", "blockexplorer", "kebab-case"] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/block-explorer-ui/libs/.gitkeep -------------------------------------------------------------------------------- /block-explorer-ui/libs/shared/models/karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration file, see link for more information 2 | // https://karma-runner.github.io/1.0/config/configuration-file.html 3 | 4 | const { join } = require('path'); 5 | const getBaseKarmaConfig = require('../../../karma.conf'); 6 | 7 | module.exports = function(config) { 8 | const baseConfig = getBaseKarmaConfig(); 9 | config.set({ 10 | ...baseConfig, 11 | coverageIstanbulReporter: { 12 | ...baseConfig.coverageIstanbulReporter, 13 | dir: join(__dirname, '../../../coverage/libs/shared/models') 14 | } 15 | }); 16 | }; 17 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/shared/models/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/shared-models.module'; 2 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/shared/models/src/lib/shared-models.module.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, TestBed } from '@angular/core/testing'; 2 | import { SharedModelsModule } from './shared-models.module'; 3 | 4 | describe('SharedModelsModule', () => { 5 | beforeEach(async(() => { 6 | TestBed.configureTestingModule({ 7 | imports: [SharedModelsModule] 8 | }).compileComponents(); 9 | })); 10 | 11 | it('should create', () => { 12 | expect(SharedModelsModule).toBeDefined(); 13 | }); 14 | }); 15 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/shared/models/src/lib/shared-models.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | export * from './generated/api.models'; 4 | 5 | @NgModule({ 6 | imports: [CommonModule] 7 | }) 8 | export class SharedModelsModule {} 9 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/shared/models/src/test.ts: -------------------------------------------------------------------------------- 1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 2 | 3 | import 'core-js/es7/reflect'; 4 | import 'zone.js/dist/zone'; 5 | import 'zone.js/dist/zone-testing'; 6 | import { getTestBed } from '@angular/core/testing'; 7 | import { 8 | BrowserDynamicTestingModule, 9 | platformBrowserDynamicTesting 10 | } from '@angular/platform-browser-dynamic/testing'; 11 | 12 | declare const require: any; 13 | 14 | // First, initialize the Angular testing environment. 15 | getTestBed().initTestEnvironment( 16 | BrowserDynamicTestingModule, 17 | platformBrowserDynamicTesting() 18 | ); 19 | // Then we find all the tests. 20 | const context = require.context('./', true, /\.spec\.ts$/); 21 | // And load the modules. 22 | context.keys().map(context); 23 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/shared/models/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc/libs/shared/models", 5 | "target": "es2015", 6 | "module": "es2015", 7 | "moduleResolution": "node", 8 | "declaration": true, 9 | "sourceMap": true, 10 | "inlineSources": true, 11 | "emitDecoratorMetadata": true, 12 | "experimentalDecorators": true, 13 | "importHelpers": true, 14 | "types": [], 15 | "lib": ["dom", "es2018"] 16 | }, 17 | "angularCompilerOptions": { 18 | "annotateForClosureCompiler": true, 19 | "skipTemplateCodegen": true, 20 | "strictMetadataEmit": true, 21 | "fullTemplateTypeCheck": true, 22 | "strictInjectionParameters": true, 23 | "enableResourceInlining": true 24 | }, 25 | "exclude": ["src/test.ts", "**/*.spec.ts"] 26 | } 27 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/shared/models/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc/libs/shared/models", 5 | "types": ["jasmine", "node"] 6 | }, 7 | "files": ["src/test.ts"], 8 | "include": ["**/*.spec.ts", "**/*.d.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/shared/models/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tslint.json", 3 | "rules": { 4 | "directive-selector": [true, "attribute", "blockexplorer", "camelCase"], 5 | "component-selector": [true, "element", "blockexplorer", "kebab-case"] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/shared/utils/karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration file, see link for more information 2 | // https://karma-runner.github.io/1.0/config/configuration-file.html 3 | 4 | const { join } = require('path'); 5 | const getBaseKarmaConfig = require('../../../karma.conf'); 6 | 7 | module.exports = function(config) { 8 | const baseConfig = getBaseKarmaConfig(); 9 | config.set({ 10 | ...baseConfig, 11 | coverageIstanbulReporter: { 12 | ...baseConfig.coverageIstanbulReporter, 13 | dir: join(__dirname, '../../../coverage/libs/shared/utils') 14 | } 15 | }); 16 | }; 17 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/shared/utils/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/shared-utils.module'; 2 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/shared/utils/src/lib/shared-utils.module.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, TestBed } from '@angular/core/testing'; 2 | import { SharedUtilsModule } from './shared-utils.module'; 3 | 4 | describe('SharedUtilsModule', () => { 5 | beforeEach(async(() => { 6 | TestBed.configureTestingModule({ 7 | imports: [SharedUtilsModule] 8 | }).compileComponents(); 9 | })); 10 | 11 | it('should create', () => { 12 | expect(SharedUtilsModule).toBeDefined(); 13 | }); 14 | }); 15 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/shared/utils/src/lib/shared-utils.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule, ModuleWithProviders } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { Log } from './logger.service'; 4 | 5 | export * from './logger.service'; 6 | 7 | @NgModule({ 8 | imports: [CommonModule] 9 | }) 10 | export class SharedUtilsModule { 11 | static forRoot(): ModuleWithProviders { 12 | return { 13 | ngModule: SharedUtilsModule, 14 | providers: [Log] 15 | }; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/shared/utils/src/test.ts: -------------------------------------------------------------------------------- 1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 2 | 3 | import 'core-js/es7/reflect'; 4 | import 'zone.js/dist/zone'; 5 | import 'zone.js/dist/zone-testing'; 6 | import { getTestBed } from '@angular/core/testing'; 7 | import { 8 | BrowserDynamicTestingModule, 9 | platformBrowserDynamicTesting 10 | } from '@angular/platform-browser-dynamic/testing'; 11 | 12 | declare const require: any; 13 | 14 | // First, initialize the Angular testing environment. 15 | getTestBed().initTestEnvironment( 16 | BrowserDynamicTestingModule, 17 | platformBrowserDynamicTesting() 18 | ); 19 | // Then we find all the tests. 20 | const context = require.context('./', true, /\.spec\.ts$/); 21 | // And load the modules. 22 | context.keys().map(context); 23 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/shared/utils/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc/libs/shared/utils", 5 | "target": "es2015", 6 | "module": "es2015", 7 | "moduleResolution": "node", 8 | "declaration": true, 9 | "sourceMap": true, 10 | "inlineSources": true, 11 | "emitDecoratorMetadata": true, 12 | "experimentalDecorators": true, 13 | "importHelpers": true, 14 | "types": [], 15 | "lib": ["dom", "es2018"] 16 | }, 17 | "angularCompilerOptions": { 18 | "annotateForClosureCompiler": true, 19 | "skipTemplateCodegen": true, 20 | "strictMetadataEmit": true, 21 | "fullTemplateTypeCheck": true, 22 | "strictInjectionParameters": true, 23 | "enableResourceInlining": true 24 | }, 25 | "exclude": ["src/test.ts", "**/*.spec.ts"] 26 | } 27 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/shared/utils/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc/libs/shared/utils", 5 | "types": ["jasmine", "node"] 6 | }, 7 | "files": ["src/test.ts"], 8 | "include": ["**/*.spec.ts", "**/*.d.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/shared/utils/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tslint.json", 3 | "rules": { 4 | "directive-selector": [true, "attribute", "blockexplorer", "camelCase"], 5 | "component-selector": [true, "element", "blockexplorer", "kebab-case"] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/state/global-state/karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration file, see link for more information 2 | // https://karma-runner.github.io/1.0/config/configuration-file.html 3 | 4 | const { join } = require('path'); 5 | const getBaseKarmaConfig = require('../../../karma.conf'); 6 | 7 | module.exports = function(config) { 8 | const baseConfig = getBaseKarmaConfig(); 9 | config.set({ 10 | ...baseConfig, 11 | coverageIstanbulReporter: { 12 | ...baseConfig.coverageIstanbulReporter, 13 | dir: join(__dirname, '../../../coverage/libs/state/global-state') 14 | } 15 | }); 16 | }; 17 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/state/global-state/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/+state/global.facade'; 2 | export * from './lib/+state/global.reducer'; 3 | export * from './lib/+state/global.selectors'; 4 | export * from './lib/state-global-state.module'; 5 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/state/global-state/src/lib/+state/global.facade.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | 3 | import { select, Store } from '@ngrx/store'; 4 | 5 | import { GlobalPartialState } from './global.reducer'; 6 | import { globalQuery } from './global.selectors'; 7 | import { IndentifyEntity } from './global.actions'; 8 | 9 | @Injectable() 10 | export class GlobalFacade { 11 | identifiedEntity$ = this.store.pipe(select(globalQuery.getIdentifiedEntity)); 12 | identifiedEntityType$ = this.store.pipe(select(globalQuery.getIdentifiedType)); 13 | loaded$ = this.store.pipe(select(globalQuery.getLoaded)); 14 | error$ = this.store.pipe(select(globalQuery.getError)); 15 | 16 | constructor(private store: Store) {} 17 | 18 | identify(id: string) { 19 | this.store.dispatch(new IndentifyEntity(id)); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/state/global-state/src/lib/state-global-state.module.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, TestBed } from '@angular/core/testing'; 2 | import { StateGlobalStateModule } from './state-global-state.module'; 3 | 4 | describe('StateGlobalStateModule', () => { 5 | beforeEach(async(() => { 6 | TestBed.configureTestingModule({ 7 | imports: [StateGlobalStateModule] 8 | }).compileComponents(); 9 | })); 10 | 11 | it('should create', () => { 12 | expect(StateGlobalStateModule).toBeDefined(); 13 | }); 14 | }); 15 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/state/global-state/src/test.ts: -------------------------------------------------------------------------------- 1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 2 | 3 | import 'core-js/es7/reflect'; 4 | import 'zone.js/dist/zone'; 5 | import 'zone.js/dist/zone-testing'; 6 | import { getTestBed } from '@angular/core/testing'; 7 | import { 8 | BrowserDynamicTestingModule, 9 | platformBrowserDynamicTesting 10 | } from '@angular/platform-browser-dynamic/testing'; 11 | 12 | declare const require: any; 13 | 14 | // First, initialize the Angular testing environment. 15 | getTestBed().initTestEnvironment( 16 | BrowserDynamicTestingModule, 17 | platformBrowserDynamicTesting() 18 | ); 19 | // Then we find all the tests. 20 | const context = require.context('./', true, /\.spec\.ts$/); 21 | // And load the modules. 22 | context.keys().map(context); 23 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/state/global-state/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc/libs/state/global-state", 5 | "target": "es2015", 6 | "module": "es2015", 7 | "moduleResolution": "node", 8 | "declaration": true, 9 | "sourceMap": true, 10 | "inlineSources": true, 11 | "emitDecoratorMetadata": true, 12 | "experimentalDecorators": true, 13 | "importHelpers": true, 14 | "types": [], 15 | "lib": ["dom", "es2018"] 16 | }, 17 | "angularCompilerOptions": { 18 | "annotateForClosureCompiler": true, 19 | "skipTemplateCodegen": true, 20 | "strictMetadataEmit": true, 21 | "fullTemplateTypeCheck": true, 22 | "strictInjectionParameters": true, 23 | "enableResourceInlining": true 24 | }, 25 | "exclude": ["src/test.ts", "**/*.spec.ts"] 26 | } 27 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/state/global-state/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc/libs/state/global-state", 5 | "types": ["jasmine", "node"] 6 | }, 7 | "files": ["src/test.ts"], 8 | "include": ["**/*.spec.ts", "**/*.d.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/state/global-state/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tslint.json", 3 | "rules": { 4 | "directive-selector": [true, "attribute", "blockexplorer", "camelCase"], 5 | "component-selector": [true, "element", "blockexplorer", "kebab-case"] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/state/smart-contracts-state/karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration file, see link for more information 2 | // https://karma-runner.github.io/1.0/config/configuration-file.html 3 | 4 | const { join } = require('path'); 5 | const getBaseKarmaConfig = require('../../../karma.conf'); 6 | 7 | module.exports = function(config) { 8 | const baseConfig = getBaseKarmaConfig(); 9 | config.set({ 10 | ...baseConfig, 11 | coverageIstanbulReporter: { 12 | ...baseConfig.coverageIstanbulReporter, 13 | dir: join(__dirname, '../../../coverage/libs/state/smart-contracts-state') 14 | } 15 | }); 16 | }; 17 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/state/smart-contracts-state/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/+state/smart-contracts.facade'; 2 | export * from './lib/+state/smart-contracts.reducer'; 3 | export * from './lib/+state/smart-contracts.selectors'; 4 | export * from './lib/state-smart-contracts-state.module'; 5 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/state/smart-contracts-state/src/lib/state-smart-contracts-state.module.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, TestBed } from '@angular/core/testing'; 2 | import { StateSmartContractsStateModule } from './state-smart-contracts-state.module'; 3 | 4 | describe('StateSmartContractsStateModule', () => { 5 | beforeEach(async(() => { 6 | TestBed.configureTestingModule({ 7 | imports: [StateSmartContractsStateModule] 8 | }).compileComponents(); 9 | })); 10 | 11 | it('should create', () => { 12 | expect(StateSmartContractsStateModule).toBeDefined(); 13 | }); 14 | }); 15 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/state/smart-contracts-state/src/test.ts: -------------------------------------------------------------------------------- 1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 2 | 3 | import 'core-js/es7/reflect'; 4 | import 'zone.js/dist/zone'; 5 | import 'zone.js/dist/zone-testing'; 6 | import { getTestBed } from '@angular/core/testing'; 7 | import { 8 | BrowserDynamicTestingModule, 9 | platformBrowserDynamicTesting 10 | } from '@angular/platform-browser-dynamic/testing'; 11 | 12 | declare const require: any; 13 | 14 | // First, initialize the Angular testing environment. 15 | getTestBed().initTestEnvironment( 16 | BrowserDynamicTestingModule, 17 | platformBrowserDynamicTesting() 18 | ); 19 | // Then we find all the tests. 20 | const context = require.context('./', true, /\.spec\.ts$/); 21 | // And load the modules. 22 | context.keys().map(context); 23 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/state/smart-contracts-state/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc/libs/state/smart-contracts-state", 5 | "target": "es2015", 6 | "module": "es2015", 7 | "moduleResolution": "node", 8 | "declaration": true, 9 | "sourceMap": true, 10 | "inlineSources": true, 11 | "emitDecoratorMetadata": true, 12 | "experimentalDecorators": true, 13 | "importHelpers": true, 14 | "types": [], 15 | "lib": ["dom", "es2018"] 16 | }, 17 | "angularCompilerOptions": { 18 | "annotateForClosureCompiler": true, 19 | "skipTemplateCodegen": true, 20 | "strictMetadataEmit": true, 21 | "fullTemplateTypeCheck": true, 22 | "strictInjectionParameters": true, 23 | "enableResourceInlining": true 24 | }, 25 | "exclude": ["src/test.ts", "**/*.spec.ts"] 26 | } 27 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/state/smart-contracts-state/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc/libs/state/smart-contracts-state", 5 | "types": ["jasmine", "node"] 6 | }, 7 | "files": ["src/test.ts"], 8 | "include": ["**/*.spec.ts", "**/*.d.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/state/smart-contracts-state/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tslint.json", 3 | "rules": { 4 | "directive-selector": [true, "attribute", "blockexplorer", "camelCase"], 5 | "component-selector": [true, "element", "blockexplorer", "kebab-case"] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/state/tokens-state/karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration file, see link for more information 2 | // https://karma-runner.github.io/1.0/config/configuration-file.html 3 | 4 | const { join } = require('path'); 5 | const getBaseKarmaConfig = require('../../../karma.conf'); 6 | 7 | module.exports = function(config) { 8 | const baseConfig = getBaseKarmaConfig(); 9 | config.set({ 10 | ...baseConfig, 11 | coverageIstanbulReporter: { 12 | ...baseConfig.coverageIstanbulReporter, 13 | dir: join(__dirname, '../../../coverage/libs/state/tokens-state') 14 | } 15 | }); 16 | }; 17 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/state/tokens-state/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/+state/tokens.facade'; 2 | export * from './lib/+state/tokens.reducer'; 3 | export * from './lib/+state/tokens.selectors'; 4 | 5 | export * from './lib/state-tokens-state.module'; 6 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/state/tokens-state/src/lib/services/api-configuration.ts: -------------------------------------------------------------------------------- 1 | /* tslint:disable */ 2 | import { Injectable } from '@angular/core'; 3 | 4 | /** 5 | * Global configuration for Api services 6 | */ 7 | @Injectable({ 8 | providedIn: 'root', 9 | }) 10 | export class ApiConfiguration { 11 | rootUrl: string = '/'; 12 | } 13 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/state/tokens-state/src/lib/services/strict-http-response.ts: -------------------------------------------------------------------------------- 1 | /* tslint:disable */ 2 | import { HttpResponse } from '@angular/common/http'; 3 | 4 | /** 5 | * Constrains the http to not expand the response type with `| null` 6 | */ 7 | export type StrictHttpResponse = HttpResponse & { 8 | readonly body: T; 9 | } 10 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/state/tokens-state/src/lib/services/token-detail.ts: -------------------------------------------------------------------------------- 1 | /* tslint:disable */ 2 | export interface TokenDetail { 3 | name: string; 4 | address: string; 5 | symbol: string; 6 | decimals: number; 7 | supply: number; 8 | } 9 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/state/tokens-state/src/lib/services/token-transaction-response.ts: -------------------------------------------------------------------------------- 1 | /* tslint:disable */ 2 | export interface TokenTransactionResponse { 3 | tokenAddress?: string; 4 | fromAddress?: string; 5 | toAddress?: string; 6 | txId?: string; 7 | amount?: string; 8 | time: string; 9 | } 10 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/state/tokens-state/src/lib/services/tokens.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing'; 2 | 3 | import { TokensService } from './tokens.service'; 4 | 5 | describe('TokensService', () => { 6 | beforeEach(() => TestBed.configureTestingModule({})); 7 | 8 | it('should be created', () => { 9 | const service: TokensService = TestBed.get(TokensService); 10 | expect(service).toBeTruthy(); 11 | }); 12 | }); 13 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/state/tokens-state/src/lib/state-tokens-state.module.spec.ts: -------------------------------------------------------------------------------- 1 | 2 | import { async, TestBed } from '@angular/core/testing'; 3 | import { StateTokensStateModule } from './state-tokens-state.module'; 4 | 5 | describe('StateTokensStateModule', () => { 6 | beforeEach(async(() => { 7 | TestBed.configureTestingModule({ 8 | imports: [ StateTokensStateModule ] 9 | }) 10 | .compileComponents(); 11 | })); 12 | 13 | it('should create', () => { 14 | expect(StateTokensStateModule).toBeDefined(); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/state/tokens-state/src/test.ts: -------------------------------------------------------------------------------- 1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 2 | 3 | import 'core-js/es7/reflect'; 4 | import 'zone.js/dist/zone'; 5 | import 'zone.js/dist/zone-testing'; 6 | import { getTestBed } from '@angular/core/testing'; 7 | import { 8 | BrowserDynamicTestingModule, 9 | platformBrowserDynamicTesting 10 | } from '@angular/platform-browser-dynamic/testing'; 11 | 12 | declare const require: any; 13 | 14 | // First, initialize the Angular testing environment. 15 | getTestBed().initTestEnvironment( 16 | BrowserDynamicTestingModule, 17 | platformBrowserDynamicTesting() 18 | ); 19 | // Then we find all the tests. 20 | const context = require.context('./', true, /\.spec\.ts$/); 21 | // And load the modules. 22 | context.keys().map(context); 23 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/state/tokens-state/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc/libs/state/tokens-state", 5 | "types": [ 6 | "jasmine", 7 | "node" 8 | ] 9 | }, 10 | "files": [ 11 | "src/test.ts" 12 | ], 13 | "include": [ 14 | "**/*.spec.ts", 15 | "**/*.d.ts" 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/state/tokens-state/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tslint.json", 3 | "rules": { 4 | "directive-selector": [ 5 | true, 6 | "attribute", 7 | "blockexplorer", 8 | "camelCase" 9 | ], 10 | "component-selector": [ 11 | true, 12 | "element", 13 | "blockexplorer", 14 | "kebab-case" 15 | ] 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/state/transactions-state/karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration file, see link for more information 2 | // https://karma-runner.github.io/1.0/config/configuration-file.html 3 | 4 | const { join } = require('path'); 5 | const getBaseKarmaConfig = require('../../../karma.conf'); 6 | 7 | module.exports = function(config) { 8 | const baseConfig = getBaseKarmaConfig(); 9 | config.set({ 10 | ...baseConfig, 11 | coverageIstanbulReporter: { 12 | ...baseConfig.coverageIstanbulReporter, 13 | dir: join(__dirname, '../../../coverage/libs/state/transactions-state') 14 | } 15 | }); 16 | }; 17 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/state/transactions-state/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/+state/transactions.facade'; 2 | export * from './lib/+state/transactions.reducer'; 3 | export * from './lib/+state/transactions.selectors'; 4 | export * from './lib/state-transactions-state.module'; 5 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/state/transactions-state/src/lib/state-transactions-state.module.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, TestBed } from '@angular/core/testing'; 2 | import { StateTransactionsStateModule } from './state-transactions-state.module'; 3 | 4 | describe('StateTransactionsStateModule', () => { 5 | beforeEach(async(() => { 6 | TestBed.configureTestingModule({ 7 | imports: [StateTransactionsStateModule] 8 | }).compileComponents(); 9 | })); 10 | 11 | it('should create', () => { 12 | expect(StateTransactionsStateModule).toBeDefined(); 13 | }); 14 | }); 15 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/state/transactions-state/src/test.ts: -------------------------------------------------------------------------------- 1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 2 | 3 | import 'core-js/es7/reflect'; 4 | import 'zone.js/dist/zone'; 5 | import 'zone.js/dist/zone-testing'; 6 | import { getTestBed } from '@angular/core/testing'; 7 | import { 8 | BrowserDynamicTestingModule, 9 | platformBrowserDynamicTesting 10 | } from '@angular/platform-browser-dynamic/testing'; 11 | 12 | declare const require: any; 13 | 14 | // First, initialize the Angular testing environment. 15 | getTestBed().initTestEnvironment( 16 | BrowserDynamicTestingModule, 17 | platformBrowserDynamicTesting() 18 | ); 19 | // Then we find all the tests. 20 | const context = require.context('./', true, /\.spec\.ts$/); 21 | // And load the modules. 22 | context.keys().map(context); 23 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/state/transactions-state/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc/libs/state/transactions-state", 5 | "target": "es2015", 6 | "module": "es2015", 7 | "moduleResolution": "node", 8 | "declaration": true, 9 | "sourceMap": true, 10 | "inlineSources": true, 11 | "emitDecoratorMetadata": true, 12 | "experimentalDecorators": true, 13 | "importHelpers": true, 14 | "types": [], 15 | "lib": ["dom", "es2018"] 16 | }, 17 | "angularCompilerOptions": { 18 | "annotateForClosureCompiler": true, 19 | "skipTemplateCodegen": true, 20 | "strictMetadataEmit": true, 21 | "fullTemplateTypeCheck": true, 22 | "strictInjectionParameters": true, 23 | "enableResourceInlining": true 24 | }, 25 | "exclude": ["src/test.ts", "**/*.spec.ts"] 26 | } 27 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/state/transactions-state/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc/libs/state/transactions-state", 5 | "types": ["jasmine", "node"] 6 | }, 7 | "files": ["src/test.ts"], 8 | "include": ["**/*.spec.ts", "**/*.d.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/state/transactions-state/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tslint.json", 3 | "rules": { 4 | "directive-selector": [true, "attribute", "blockexplorer", "camelCase"], 5 | "component-selector": [true, "element", "blockexplorer", "kebab-case"] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/layout/karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration file, see link for more information 2 | // https://karma-runner.github.io/1.0/config/configuration-file.html 3 | 4 | const { join } = require('path'); 5 | const getBaseKarmaConfig = require('../../../karma.conf'); 6 | 7 | module.exports = function(config) { 8 | const baseConfig = getBaseKarmaConfig(); 9 | config.set({ 10 | ...baseConfig, 11 | coverageIstanbulReporter: { 12 | ...baseConfig.coverageIstanbulReporter, 13 | dir: join(__dirname, '../../../coverage/libs/ui/layout') 14 | } 15 | }); 16 | }; 17 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/layout/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/ui-layout.module'; 2 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/layout/src/lib/components/balance/balance.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/block-explorer-ui/libs/ui/layout/src/lib/components/balance/balance.component.css -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/layout/src/lib/components/balance/balance.component.html: -------------------------------------------------------------------------------- 1 | {{whole}}{{decimalPlaces > 0 ? decimal : ''}} {{symbol}} 2 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/layout/src/lib/components/balance/balance.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { BalanceComponent } from './balance.component'; 4 | 5 | describe('BalanceComponent', () => { 6 | let component: BalanceComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ BalanceComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(BalanceComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/layout/src/lib/components/breadcrumb/breadcrumb.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/block-explorer-ui/libs/ui/layout/src/lib/components/breadcrumb/breadcrumb.component.css -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/layout/src/lib/components/breadcrumb/breadcrumb.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {{breadcrumb.label}} 5 | {{breadcrumb.label}} 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/layout/src/lib/components/breadcrumb/breadcrumb.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { BreadcrumbComponent } from './breadcrumb.component'; 4 | 5 | describe('BreadcrumbComponent', () => { 6 | let component: BreadcrumbComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ BreadcrumbComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(BreadcrumbComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/layout/src/lib/components/busy-indicator/busy-indicator.component.html: -------------------------------------------------------------------------------- 1 | 2 | {{text}} 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/layout/src/lib/components/busy-indicator/busy-indicator.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { BusyIndicatorComponent } from './busy-indicator.component'; 4 | 5 | describe('BusyIndicatorComponent', () => { 6 | let component: BusyIndicatorComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ BusyIndicatorComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(BusyIndicatorComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/layout/src/lib/components/busy-indicator/busy-indicator.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, Input } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'blockexplorer-busy-indicator', 5 | templateUrl: './busy-indicator.component.html', 6 | styleUrls: ['./busy-indicator.component.css'] 7 | }) 8 | export class BusyIndicatorComponent implements OnInit { 9 | @Input() text = 'Loading'; 10 | constructor() { } 11 | 12 | ngOnInit() { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/layout/src/lib/components/menu-bar/menu-bar.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/block-explorer-ui/libs/ui/layout/src/lib/components/menu-bar/menu-bar.component.css -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/layout/src/lib/components/menu-bar/menu-bar.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { MenuBarComponent } from './menu-bar.component'; 4 | 5 | describe('MenuBarComponent', () => { 6 | let component: MenuBarComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ MenuBarComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(MenuBarComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/layout/src/lib/components/pager/pager.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/block-explorer-ui/libs/ui/layout/src/lib/components/pager/pager.component.css -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/layout/src/lib/components/pager/pager.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { PagerComponent } from './pager.component'; 4 | 5 | describe('PagerComponent', () => { 6 | let component: PagerComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ PagerComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(PagerComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/layout/src/lib/components/pager/pager.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, EventEmitter, Output, Input } from '@angular/core'; 2 | import { first } from 'rxjs/operators'; 3 | 4 | @Component({ 5 | selector: 'blockexplorer-pager', 6 | templateUrl: './pager.component.html', 7 | styleUrls: ['./pager.component.css'] 8 | }) 9 | export class PagerComponent implements OnInit { 10 | 11 | @Input() currentPage = 1; 12 | @Input() totalPages = 1; 13 | 14 | @Output() first = new EventEmitter(); 15 | @Output() last = new EventEmitter(); 16 | @Output() next = new EventEmitter(); 17 | @Output() previous = new EventEmitter(); 18 | 19 | constructor() { } 20 | 21 | ngOnInit() { 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/layout/src/lib/ui-layout.module.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, TestBed } from '@angular/core/testing'; 2 | import { UiLayoutModule } from './ui-layout.module'; 3 | 4 | describe('UiLayoutModule', () => { 5 | beforeEach(async(() => { 6 | TestBed.configureTestingModule({ 7 | imports: [UiLayoutModule] 8 | }).compileComponents(); 9 | })); 10 | 11 | it('should create', () => { 12 | expect(UiLayoutModule).toBeDefined(); 13 | }); 14 | }); 15 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/layout/src/test.ts: -------------------------------------------------------------------------------- 1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 2 | 3 | import 'core-js/es7/reflect'; 4 | import 'zone.js/dist/zone'; 5 | import 'zone.js/dist/zone-testing'; 6 | import { getTestBed } from '@angular/core/testing'; 7 | import { 8 | BrowserDynamicTestingModule, 9 | platformBrowserDynamicTesting 10 | } from '@angular/platform-browser-dynamic/testing'; 11 | 12 | declare const require: any; 13 | 14 | // First, initialize the Angular testing environment. 15 | getTestBed().initTestEnvironment( 16 | BrowserDynamicTestingModule, 17 | platformBrowserDynamicTesting() 18 | ); 19 | // Then we find all the tests. 20 | const context = require.context('./', true, /\.spec\.ts$/); 21 | // And load the modules. 22 | context.keys().map(context); 23 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/layout/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc/libs/ui/layout", 5 | "target": "es2015", 6 | "module": "es2015", 7 | "moduleResolution": "node", 8 | "declaration": true, 9 | "sourceMap": true, 10 | "inlineSources": true, 11 | "emitDecoratorMetadata": true, 12 | "experimentalDecorators": true, 13 | "importHelpers": true, 14 | "types": [], 15 | "lib": ["dom", "es2018"] 16 | }, 17 | "angularCompilerOptions": { 18 | "annotateForClosureCompiler": true, 19 | "skipTemplateCodegen": true, 20 | "strictMetadataEmit": true, 21 | "fullTemplateTypeCheck": true, 22 | "strictInjectionParameters": true, 23 | "enableResourceInlining": true 24 | }, 25 | "exclude": ["src/test.ts", "**/*.spec.ts"] 26 | } 27 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/layout/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc/libs/ui/layout", 5 | "types": ["jasmine", "node"] 6 | }, 7 | "files": ["src/test.ts"], 8 | "include": ["**/*.spec.ts", "**/*.d.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/layout/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tslint.json", 3 | "rules": { 4 | "directive-selector": [true, "attribute", "blockexplorer", "camelCase"], 5 | "component-selector": [true, "element", "blockexplorer", "kebab-case"] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/smart-contracts/karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration file, see link for more information 2 | // https://karma-runner.github.io/1.0/config/configuration-file.html 3 | 4 | const { join } = require('path'); 5 | const getBaseKarmaConfig = require('../../../karma.conf'); 6 | 7 | module.exports = function(config) { 8 | const baseConfig = getBaseKarmaConfig(); 9 | config.set({ 10 | ...baseConfig, 11 | coverageIstanbulReporter: { 12 | ...baseConfig.coverageIstanbulReporter, 13 | dir: join(__dirname, '../../../coverage/libs/ui/smart-contracts') 14 | } 15 | }); 16 | }; 17 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/smart-contracts/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/ui-smart-contracts.module'; 2 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/smart-contracts/src/lib/components/smart-contract-summary/smart-contract-summary.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/block-explorer-ui/libs/ui/smart-contracts/src/lib/components/smart-contract-summary/smart-contract-summary.component.css -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/smart-contracts/src/lib/ui-smart-contracts.module.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, TestBed } from '@angular/core/testing'; 2 | import { UiSmartContractsModule } from './ui-smart-contracts.module'; 3 | 4 | describe('UiSmartContractsModule', () => { 5 | beforeEach(async(() => { 6 | TestBed.configureTestingModule({ 7 | imports: [UiSmartContractsModule] 8 | }).compileComponents(); 9 | })); 10 | 11 | it('should create', () => { 12 | expect(UiSmartContractsModule).toBeDefined(); 13 | }); 14 | }); 15 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/smart-contracts/src/lib/ui-smart-contracts.module.ts: -------------------------------------------------------------------------------- 1 | import { CommonModule } from '@angular/common'; 2 | import { NgModule } from '@angular/core'; 3 | import { Route, RouterModule } from '@angular/router'; 4 | import { UiLayoutModule } from '@blockexplorer/ui/layout'; 5 | import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; 6 | import { PrismModule } from '@ngx-prism/core'; 7 | import { ClipboardModule } from 'ngx-clipboard'; 8 | 9 | import { SmartContractSummaryComponent } from './components/smart-contract-summary/smart-contract-summary.component'; 10 | 11 | export const uiSmartContractsRoutes: Route[] = []; 12 | 13 | @NgModule({ 14 | imports: [CommonModule, RouterModule, UiLayoutModule, NgbModule, PrismModule, ClipboardModule], 15 | declarations: [SmartContractSummaryComponent], 16 | exports: [SmartContractSummaryComponent] 17 | }) 18 | export class UiSmartContractsModule { } 19 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/smart-contracts/src/test.ts: -------------------------------------------------------------------------------- 1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 2 | 3 | import 'core-js/es7/reflect'; 4 | import 'zone.js/dist/zone'; 5 | import 'zone.js/dist/zone-testing'; 6 | import { getTestBed } from '@angular/core/testing'; 7 | import { 8 | BrowserDynamicTestingModule, 9 | platformBrowserDynamicTesting 10 | } from '@angular/platform-browser-dynamic/testing'; 11 | 12 | declare const require: any; 13 | 14 | // First, initialize the Angular testing environment. 15 | getTestBed().initTestEnvironment( 16 | BrowserDynamicTestingModule, 17 | platformBrowserDynamicTesting() 18 | ); 19 | // Then we find all the tests. 20 | const context = require.context('./', true, /\.spec\.ts$/); 21 | // And load the modules. 22 | context.keys().map(context); 23 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/smart-contracts/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc/libs/ui/smart-contracts", 5 | "target": "es2015", 6 | "module": "es2015", 7 | "moduleResolution": "node", 8 | "declaration": true, 9 | "sourceMap": true, 10 | "inlineSources": true, 11 | "emitDecoratorMetadata": true, 12 | "experimentalDecorators": true, 13 | "importHelpers": true, 14 | "types": [], 15 | "lib": ["dom", "es2018"] 16 | }, 17 | "angularCompilerOptions": { 18 | "annotateForClosureCompiler": true, 19 | "skipTemplateCodegen": true, 20 | "strictMetadataEmit": true, 21 | "fullTemplateTypeCheck": true, 22 | "strictInjectionParameters": true, 23 | "enableResourceInlining": true 24 | }, 25 | "exclude": ["src/test.ts", "**/*.spec.ts"] 26 | } 27 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/smart-contracts/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc/libs/ui/smart-contracts", 5 | "types": ["jasmine", "node"] 6 | }, 7 | "files": ["src/test.ts"], 8 | "include": ["**/*.spec.ts", "**/*.d.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/smart-contracts/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tslint.json", 3 | "rules": { 4 | "directive-selector": [true, "attribute", "blockexplorer", "camelCase"], 5 | "component-selector": [true, "element", "blockexplorer", "kebab-case"] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/tokens/karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration file, see link for more information 2 | // https://karma-runner.github.io/1.0/config/configuration-file.html 3 | 4 | const { join } = require('path'); 5 | const getBaseKarmaConfig = require('../../../karma.conf'); 6 | 7 | module.exports = function(config) { 8 | const baseConfig = getBaseKarmaConfig(); 9 | config.set({ 10 | ...baseConfig, 11 | coverageIstanbulReporter: { 12 | ...baseConfig.coverageIstanbulReporter, 13 | dir: join(__dirname, '../../../coverage/libs/ui/tokens') 14 | } 15 | }); 16 | }; 17 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/tokens/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/ui-tokens.module'; 2 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/tokens/src/lib/components/token-summary/token-summary.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/block-explorer-ui/libs/ui/tokens/src/lib/components/token-summary/token-summary.component.css -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/tokens/src/lib/components/token-summary/token-summary.component.html: -------------------------------------------------------------------------------- 1 | Token {{ token?.name }} 2 | Summary 3 | 4 | 5 | 6 | 7 | Symbol 8 | {{ token?.symbol }} 9 | 10 | 11 | Total Supply 12 | {{ token?.supply }} 13 | 14 | 15 | Contract 16 | {{address}} 17 | 18 | 19 | 20 | Decimals 21 | {{ token?.decimals }} 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/tokens/src/lib/components/token-summary/token-summary.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { TokenSummaryComponent } from './token-summary.component'; 4 | 5 | describe('TokenSummaryComponent', () => { 6 | let component: TokenSummaryComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ TokenSummaryComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(TokenSummaryComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/tokens/src/lib/components/token-summary/token-summary.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, Input } from '@angular/core'; 2 | import { TokenDetail } from 'libs/state/tokens-state/src/lib/services/token-detail'; 3 | 4 | @Component({ 5 | selector: 'blockexplorer-token-summary', 6 | templateUrl: './token-summary.component.html', 7 | styleUrls: ['./token-summary.component.css'] 8 | }) 9 | export class TokenSummaryComponent implements OnInit { 10 | 11 | @Input() address: string; 12 | @Input() token: TokenDetail; 13 | 14 | constructor() { } 15 | 16 | ngOnInit() { 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/tokens/src/lib/components/token-transactions-table/token-transactions-table.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/block-explorer-ui/libs/ui/tokens/src/lib/components/token-transactions-table/token-transactions-table.component.css -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/tokens/src/lib/containers/token-summary-page/token-summary-page.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/block-explorer-ui/libs/ui/tokens/src/lib/containers/token-summary-page/token-summary-page.component.css -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/tokens/src/lib/ui-tokens.module.spec.ts: -------------------------------------------------------------------------------- 1 | 2 | import { async, TestBed } from '@angular/core/testing'; 3 | import { UiTokensModule } from './ui-tokens.module'; 4 | 5 | describe('UiTokensModule', () => { 6 | beforeEach(async(() => { 7 | TestBed.configureTestingModule({ 8 | imports: [ UiTokensModule ] 9 | }) 10 | .compileComponents(); 11 | })); 12 | 13 | it('should create', () => { 14 | expect(UiTokensModule).toBeDefined(); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/tokens/src/test.ts: -------------------------------------------------------------------------------- 1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 2 | 3 | import 'core-js/es7/reflect'; 4 | import 'zone.js/dist/zone'; 5 | import 'zone.js/dist/zone-testing'; 6 | import { getTestBed } from '@angular/core/testing'; 7 | import { 8 | BrowserDynamicTestingModule, 9 | platformBrowserDynamicTesting 10 | } from '@angular/platform-browser-dynamic/testing'; 11 | 12 | declare const require: any; 13 | 14 | // First, initialize the Angular testing environment. 15 | getTestBed().initTestEnvironment( 16 | BrowserDynamicTestingModule, 17 | platformBrowserDynamicTesting() 18 | ); 19 | // Then we find all the tests. 20 | const context = require.context('./', true, /\.spec\.ts$/); 21 | // And load the modules. 22 | context.keys().map(context); 23 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/tokens/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc/libs/ui/tokens", 5 | "types": [ 6 | "jasmine", 7 | "node" 8 | ] 9 | }, 10 | "files": [ 11 | "src/test.ts" 12 | ], 13 | "include": [ 14 | "**/*.spec.ts", 15 | "**/*.d.ts" 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/tokens/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tslint.json", 3 | "rules": { 4 | "directive-selector": [ 5 | true, 6 | "attribute", 7 | "blockexplorer", 8 | "camelCase" 9 | ], 10 | "component-selector": [ 11 | true, 12 | "element", 13 | "blockexplorer", 14 | "kebab-case" 15 | ] 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration file, see link for more information 2 | // https://karma-runner.github.io/1.0/config/configuration-file.html 3 | 4 | const { join } = require('path'); 5 | const getBaseKarmaConfig = require('../../../karma.conf'); 6 | 7 | module.exports = function(config) { 8 | const baseConfig = getBaseKarmaConfig(); 9 | config.set({ 10 | ...baseConfig, 11 | coverageIstanbulReporter: { 12 | ...baseConfig.coverageIstanbulReporter, 13 | dir: join(__dirname, '../../../coverage/libs/ui/transactions') 14 | } 15 | }); 16 | }; 17 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/ui-transactions.module'; 2 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/src/lib/components/address-summary/address-summary.component.css: -------------------------------------------------------------------------------- 1 | .my-4-x { 2 | margin-bottom: 1.5rem !important; 3 | } 4 | 5 | h3 { 6 | margin-top: 1.5em; 7 | } 8 | 9 | .copy-btn { 10 | display: inline-block !important; 11 | } 12 | 13 | 14 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/src/lib/components/address-summary/address-summary.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { AddressSummaryComponent } from './address-summary.component'; 4 | 5 | describe('AddressSummaryComponent', () => { 6 | let component: AddressSummaryComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ AddressSummaryComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(AddressSummaryComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/src/lib/components/block-summary/block-summary.component.css: -------------------------------------------------------------------------------- 1 | .my-4-x { 2 | margin-bottom: 1.5rem !important; 3 | } 4 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/src/lib/components/block-summary/block-summary.component.html: -------------------------------------------------------------------------------- 1 | Block #{{height}} 2 | 3 | Block Hash {{hash}} 4 | 5 | Summary 6 | 7 | 8 | 9 | 10 | Block Reward 11 | 12 | 13 | 14 | 15 | 16 | Confirmations 17 | {{confirmations}} 18 | 19 | 20 | Height 21 | {{height}} 22 | 23 | 24 | Date 25 | {{time}} 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/src/lib/components/block-summary/block-summary.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { BlockSummaryComponent } from './block-summary.component'; 4 | 5 | describe('BlockSummaryComponent', () => { 6 | let component: BlockSummaryComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ BlockSummaryComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(BlockSummaryComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/src/lib/components/last-blocks/last-blocks.component.css: -------------------------------------------------------------------------------- 1 | .load-more { 2 | color: #fff; 3 | margin-top: 20px; 4 | } 5 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/src/lib/components/last-blocks/last-blocks.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { LastBlocksComponent } from './last-blocks.component'; 4 | 5 | describe('LastBlocksComponent', () => { 6 | let component: LastBlocksComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ LastBlocksComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(LastBlocksComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/src/lib/components/last-smart-contracts/last-smart-contracts.component.css: -------------------------------------------------------------------------------- 1 | .load-more { 2 | color: #fff; 3 | margin-top: 20px; 4 | } 5 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/src/lib/components/stats/stats.component.css: -------------------------------------------------------------------------------- 1 | .load-more { 2 | color: #fff !important; 3 | margin-top: 20px; 4 | } -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/src/lib/components/stats/stats.component.html: -------------------------------------------------------------------------------- 1 | 2 | Blocks (last 24 hours): {{stats?.blockCount || 0}} 3 | Transaction inputs (last 24 hours): {{stats?.txInputsCount || 0}} 4 | 5 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/src/lib/components/stats/stats.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; 2 | import { StatsModel } from '@blockexplorer/shared/models'; 3 | 4 | @Component({ 5 | selector: 'blockexplorer-stats', 6 | templateUrl: './stats.component.html', 7 | styleUrls: ['./stats.component.css'] 8 | }) 9 | export class StatsComponent implements OnInit { 10 | 11 | @Input() stats: StatsModel = undefined; 12 | @Input() loading = false; 13 | 14 | records = 10; 15 | constructor() { } 16 | 17 | ngOnInit() { 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/src/lib/components/transaction-list-item/transaction-list-item.component.css: -------------------------------------------------------------------------------- 1 | .padded { 2 | padding-left: 30px; 3 | } -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/src/lib/components/transaction-summary/transaction-summary.component.css: -------------------------------------------------------------------------------- 1 | .my-4-x { 2 | margin-bottom: 1.5rem !important; 3 | } 4 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/src/lib/components/transaction-summary/transaction-summary.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { TransactionSummaryComponent } from './transaction-summary.component'; 4 | 5 | describe('TransactionSummaryComponent', () => { 6 | let component: TransactionSummaryComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ TransactionSummaryComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(TransactionSummaryComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/src/lib/components/transactions-list/transactions-list.component.css: -------------------------------------------------------------------------------- 1 | blockexplorer-pager 2 | { 3 | display: block; 4 | } 5 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/src/lib/components/transactions-list/transactions-list.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { TransactionsListComponent } from './transactions-list.component'; 4 | 5 | describe('TransactionsListComponent', () => { 6 | let component: TransactionsListComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [TransactionsListComponent] 12 | }).compileComponents(); 13 | })); 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(TransactionsListComponent); 17 | component = fixture.componentInstance; 18 | fixture.detectChanges(); 19 | }); 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy(); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/src/lib/components/transactions-table/transactions-table.component.css: -------------------------------------------------------------------------------- 1 | blockexplorer-pager 2 | { 3 | display: block; 4 | } 5 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/src/lib/components/transactions-table/transactions-table.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { TransactionsTableComponent } from './transactions-table.component'; 4 | 5 | describe('TransactionsTableComponent', () => { 6 | let component: TransactionsTableComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [TransactionsTableComponent] 12 | }).compileComponents(); 13 | })); 14 | 15 | beforeEach(() => { 16 | fixture = TestBed.createComponent(TransactionsTableComponent); 17 | component = fixture.componentInstance; 18 | fixture.detectChanges(); 19 | }); 20 | 21 | it('should create', () => { 22 | expect(component).toBeTruthy(); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/src/lib/containers/address-summary-page/address-summary-page.component.css: -------------------------------------------------------------------------------- 1 | blockexplorer-transaction-list-item { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/src/lib/containers/address-summary-page/address-summary-page.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { AddressSummaryPageComponent } from './address-summary-page.component'; 4 | 5 | describe('AddressSummaryPageComponent', () => { 6 | let component: AddressSummaryPageComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ AddressSummaryPageComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(AddressSummaryPageComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/src/lib/containers/address-summary-page/transactions-page/transactions-page.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/block-explorer-ui/libs/ui/transactions/src/lib/containers/address-summary-page/transactions-page/transactions-page.component.css -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/src/lib/containers/block-summary-page/block-summary-page.component.css: -------------------------------------------------------------------------------- 1 | .nav-pills { 2 | display: none !important; 3 | } -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/src/lib/containers/block-summary-page/block-summary-page.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { BlockSummaryPageComponent } from './block-summary-page.component'; 4 | 5 | describe('BlockSummaryPageComponent', () => { 6 | let component: BlockSummaryPageComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ BlockSummaryPageComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(BlockSummaryPageComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/src/lib/containers/not-found-page/not-found-page.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/block-explorer-ui/libs/ui/transactions/src/lib/containers/not-found-page/not-found-page.component.css -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/src/lib/containers/not-found-page/not-found-page.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Not found! Your search returned no results. Try a different hash. 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/src/lib/containers/not-found-page/not-found-page.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { NotFoundPageComponent } from './not-found-page.component'; 4 | 5 | describe('NotFoundPageComponent', () => { 6 | let component: NotFoundPageComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ NotFoundPageComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(NotFoundPageComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/src/lib/containers/not-found-page/not-found-page.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'blockexplorer-not-found-page', 5 | templateUrl: './not-found-page.component.html', 6 | styleUrls: ['./not-found-page.component.css'] 7 | }) 8 | export class NotFoundPageComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit() { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/src/lib/containers/transaction-summary-page/transaction-summary-page.component.css: -------------------------------------------------------------------------------- 1 | blockexplorer-transaction-list-item { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/src/lib/containers/transactions-page/transactions-page.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/block-explorer-ui/libs/ui/transactions/src/lib/containers/transactions-page/transactions-page.component.css -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/src/lib/containers/transactions-page/transactions-page.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { TransactionsPageComponent } from './transactions-page.component'; 4 | 5 | describe('TransactionsPageComponent', () => { 6 | let component: TransactionsPageComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ TransactionsPageComponent ] 12 | }) 13 | .compileComponents(); 14 | })); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(TransactionsPageComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/src/lib/ui-transactions.module.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, TestBed } from '@angular/core/testing'; 2 | import { UiTransactionsModule } from './ui-transactions.module'; 3 | 4 | describe('UiTransactionsModule', () => { 5 | beforeEach(async(() => { 6 | TestBed.configureTestingModule({ 7 | imports: [UiTransactionsModule] 8 | }).compileComponents(); 9 | })); 10 | 11 | it('should create', () => { 12 | expect(UiTransactionsModule).toBeDefined(); 13 | }); 14 | }); 15 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/src/test.ts: -------------------------------------------------------------------------------- 1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 2 | 3 | import 'core-js/es7/reflect'; 4 | import 'zone.js/dist/zone'; 5 | import 'zone.js/dist/zone-testing'; 6 | import { getTestBed } from '@angular/core/testing'; 7 | import { 8 | BrowserDynamicTestingModule, 9 | platformBrowserDynamicTesting 10 | } from '@angular/platform-browser-dynamic/testing'; 11 | 12 | declare const require: any; 13 | 14 | // First, initialize the Angular testing environment. 15 | getTestBed().initTestEnvironment( 16 | BrowserDynamicTestingModule, 17 | platformBrowserDynamicTesting() 18 | ); 19 | // Then we find all the tests. 20 | const context = require.context('./', true, /\.spec\.ts$/); 21 | // And load the modules. 22 | context.keys().map(context); 23 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc/libs/ui/transactions", 5 | "target": "es2015", 6 | "module": "es2015", 7 | "moduleResolution": "node", 8 | "declaration": true, 9 | "sourceMap": true, 10 | "inlineSources": true, 11 | "emitDecoratorMetadata": true, 12 | "experimentalDecorators": true, 13 | "importHelpers": true, 14 | "types": [], 15 | "lib": ["dom", "es2018"] 16 | }, 17 | "angularCompilerOptions": { 18 | "annotateForClosureCompiler": true, 19 | "skipTemplateCodegen": true, 20 | "strictMetadataEmit": true, 21 | "fullTemplateTypeCheck": true, 22 | "strictInjectionParameters": true, 23 | "enableResourceInlining": true 24 | }, 25 | "exclude": ["src/test.ts", "**/*.spec.ts"] 26 | } 27 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc/libs/ui/transactions", 5 | "types": ["jasmine", "node"] 6 | }, 7 | "files": ["src/test.ts"], 8 | "include": ["**/*.spec.ts", "**/*.d.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /block-explorer-ui/libs/ui/transactions/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tslint.json", 3 | "rules": { 4 | "directive-selector": [true, "attribute", "blockexplorer", "camelCase"], 5 | "component-selector": [true, "element", "blockexplorer", "kebab-case"] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /block-explorer-ui/tools/schematics/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stratisproject/BlockExplorer/a278c4bc92af16bc23e35c4ae62df6502d985509/block-explorer-ui/tools/schematics/.gitkeep -------------------------------------------------------------------------------- /block-explorer-ui/tools/tsconfig.tools.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../dist/out-tsc/tools", 5 | "rootDir": ".", 6 | "module": "commonjs", 7 | "target": "es5", 8 | "types": ["jasmine", "node"] 9 | }, 10 | "include": ["**/*.ts"] 11 | } 12 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | Block Explorer --------------------------------------------------------------------------------