Showing preview only (2,232K chars total). Download the full file or copy to clipboard to get everything.
Repository: horizontalsystems/bitcoin-kit-android
Branch: master
Commit: 8178f5681e4e
Files: 473
Total size: 2.0 MB
Directory structure:
gitextract_v0r6jup7/
├── .github/
│ └── workflows/
│ └── pull-request-notify.yml
├── .gitignore
├── .gitmodules
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── app/
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src/
│ └── main/
│ ├── AndroidManifest.xml
│ ├── java/
│ │ └── io/
│ │ └── horizontalsystems/
│ │ └── bitcoinkit/
│ │ └── demo/
│ │ ├── App.kt
│ │ ├── BalanceFragment.kt
│ │ ├── FeePriority.kt
│ │ ├── MainActivity.kt
│ │ ├── MainViewModel.kt
│ │ ├── NumberFormatHelper.kt
│ │ ├── SendReceiveFragment.kt
│ │ └── TransactionsFragment.kt
│ └── res/
│ ├── drawable/
│ │ └── ic_launcher_background.xml
│ ├── drawable-v24/
│ │ └── ic_launcher_foreground.xml
│ ├── layout/
│ │ ├── activity_main.xml
│ │ ├── fragment_balance.xml
│ │ ├── fragment_send_receive.xml
│ │ ├── fragment_transactions.xml
│ │ └── view_holder_transaction.xml
│ ├── menu/
│ │ └── navigation.xml
│ ├── mipmap-anydpi-v26/
│ │ ├── ic_launcher.xml
│ │ └── ic_launcher_round.xml
│ └── values/
│ ├── colors.xml
│ ├── strings.xml
│ └── styles.xml
├── bitcoincashkit/
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src/
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── kotlin/
│ │ │ └── io/
│ │ │ └── horizontalsystems/
│ │ │ └── bitcoincash/
│ │ │ ├── BitcoinCashKit.kt
│ │ │ ├── MainNetBitcoinCash.kt
│ │ │ ├── TestNetBitcoinCash.kt
│ │ │ └── blocks/
│ │ │ ├── AsertAlgorithm.java
│ │ │ ├── BitcoinCashBlockValidatorHelper.kt
│ │ │ ├── Utils.java
│ │ │ └── validators/
│ │ │ ├── AsertValidator.kt
│ │ │ ├── DAAValidator.kt
│ │ │ ├── EDAValidator.kt
│ │ │ └── ForkValidator.kt
│ │ └── resources/
│ │ ├── MainNetBitcoinCash-bip44.checkpoint
│ │ ├── MainNetBitcoinCash.checkpoint
│ │ ├── TestNetBitcoinCash-bip44.checkpoint
│ │ └── TestNetBitcoinCash.checkpoint
│ └── test/
│ ├── kotlin/
│ │ └── io/
│ │ └── horizontalsystems/
│ │ ├── Fixtures.kt
│ │ └── bitcoincash/
│ │ └── blocks/
│ │ ├── BitcoinCashBlockValidatorHelperTest.kt
│ │ └── validators/
│ │ ├── DAAValidatorTest.kt
│ │ └── ForkValidatorTest.kt
│ └── resources/
│ └── mockito-extensions/
│ └── org.mockito.plugins.MockMaker
├── bitcoincore/
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src/
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ └── io/
│ │ │ └── horizontalsystems/
│ │ │ └── bitcoincore/
│ │ │ ├── DustCalculator.kt
│ │ │ ├── crypto/
│ │ │ │ ├── Base58.java
│ │ │ │ ├── Bech32.java
│ │ │ │ ├── Bech32Cash.java
│ │ │ │ ├── Bech32Segwit.java
│ │ │ │ ├── CompactBits.java
│ │ │ │ ├── MurmurHash3.java
│ │ │ │ └── schnorr/
│ │ │ │ ├── Pair.java
│ │ │ │ ├── Point.java
│ │ │ │ ├── Schnorr.java
│ │ │ │ ├── SchnorrOld.java
│ │ │ │ └── Util.java
│ │ │ ├── exceptions/
│ │ │ │ ├── AddressFormatException.java
│ │ │ │ └── BitcoinException.java
│ │ │ ├── io/
│ │ │ │ ├── BitcoinInput.java
│ │ │ │ ├── BitcoinInputMarkable.java
│ │ │ │ ├── BitcoinOutput.java
│ │ │ │ └── UnsafeByteArrayOutputStream.java
│ │ │ └── utils/
│ │ │ ├── HashUtils.java
│ │ │ └── Utils.java
│ │ ├── kotlin/
│ │ │ └── io/
│ │ │ └── horizontalsystems/
│ │ │ └── bitcoincore/
│ │ │ ├── AbstractKit.kt
│ │ │ ├── BitcoinCore.kt
│ │ │ ├── BitcoinCoreBuilder.kt
│ │ │ ├── WatchAddressPublicKeyManager.kt
│ │ │ ├── WatchedTransactionManager.kt
│ │ │ ├── apisync/
│ │ │ │ ├── BCoinApi.kt
│ │ │ │ ├── BiApiTransactionProvider.kt
│ │ │ │ ├── BlockHashFetcher.kt
│ │ │ │ ├── BlockchainComApi.kt
│ │ │ │ ├── HsBlockHashFetcher.kt
│ │ │ │ ├── InsightApi.kt
│ │ │ │ ├── blockchair/
│ │ │ │ │ ├── BlockchairApi.kt
│ │ │ │ │ ├── BlockchairApiSyncer.kt
│ │ │ │ │ ├── BlockchairBlockHashFetcher.kt
│ │ │ │ │ ├── BlockchairLastBlockProvider.kt
│ │ │ │ │ └── BlockchairTransactionProvider.kt
│ │ │ │ ├── legacy/
│ │ │ │ │ ├── ApiSyncer.kt
│ │ │ │ │ ├── BlockHashDiscoveryBatch.kt
│ │ │ │ │ ├── BlockHashScanHelper.kt
│ │ │ │ │ ├── BlockHashScanner.kt
│ │ │ │ │ └── PublicKeyFetcher.kt
│ │ │ │ └── model/
│ │ │ │ ├── AddressItem.kt
│ │ │ │ ├── BlockHeaderItem.kt
│ │ │ │ └── TransactionItem.kt
│ │ │ ├── blocks/
│ │ │ │ ├── BlockDownload.kt
│ │ │ │ ├── BlockMedianTimeHelper.kt
│ │ │ │ ├── BlockSyncer.kt
│ │ │ │ ├── Blockchain.kt
│ │ │ │ ├── BloomFilterLoader.kt
│ │ │ │ ├── IBlockchainDataListener.kt
│ │ │ │ ├── IPeerSyncListener.kt
│ │ │ │ ├── InitialBlockDownload.kt
│ │ │ │ ├── MerkleBlockExtractor.kt
│ │ │ │ └── validators/
│ │ │ │ ├── BitsValidator.kt
│ │ │ │ ├── BlockValidatorChain.kt
│ │ │ │ ├── BlockValidatorException.kt
│ │ │ │ ├── BlockValidatorSet.kt
│ │ │ │ ├── IBlockValidator.kt
│ │ │ │ ├── LegacyDifficultyAdjustmentValidator.kt
│ │ │ │ ├── LegacyTestNetDifficultyValidator.kt
│ │ │ │ └── ProofOfWorkValidator.kt
│ │ │ ├── core/
│ │ │ │ ├── AccountWallet.kt
│ │ │ │ ├── BaseTransactionInfoConverter.kt
│ │ │ │ ├── DataProvider.kt
│ │ │ │ ├── DoubleSha256Hasher.kt
│ │ │ │ ├── Extensions.kt
│ │ │ │ ├── HashBytes.kt
│ │ │ │ ├── IHasher.kt
│ │ │ │ ├── Interfaces.kt
│ │ │ │ ├── PluginManager.kt
│ │ │ │ ├── TransactionDataSorterFactory.kt
│ │ │ │ ├── TransactionInfoConverter.kt
│ │ │ │ ├── Wallet.kt
│ │ │ │ └── WatchAccountWallet.kt
│ │ │ ├── crypto/
│ │ │ │ └── BloomFilter.kt
│ │ │ ├── extensions/
│ │ │ │ ├── Array.kt
│ │ │ │ └── String.kt
│ │ │ ├── managers/
│ │ │ │ ├── AccountPublicKeyManager.kt
│ │ │ │ ├── ApiManager.kt
│ │ │ │ ├── ApiSyncStateManager.kt
│ │ │ │ ├── BlockValidatorHelper.kt
│ │ │ │ ├── BloomFilterManager.kt
│ │ │ │ ├── ConnectionManager.kt
│ │ │ │ ├── IUnspentOutputProvider.kt
│ │ │ │ ├── IUnspentOutputSelector.kt
│ │ │ │ ├── IrregularOutputFinder.kt
│ │ │ │ ├── PendingOutpointsProvider.kt
│ │ │ │ ├── PublicKeyManager.kt
│ │ │ │ ├── RestoreKeyConverters.kt
│ │ │ │ ├── SyncManager.kt
│ │ │ │ ├── UnspentOutputProvider.kt
│ │ │ │ ├── UnspentOutputQueue.kt
│ │ │ │ ├── UnspentOutputSelector.kt
│ │ │ │ └── UnspentOutputSelectorSingleNoChange.kt
│ │ │ ├── models/
│ │ │ │ ├── Address.kt
│ │ │ │ ├── BitcoinPaymentData.kt
│ │ │ │ ├── BitcoinSendInfo.kt
│ │ │ │ ├── Block.kt
│ │ │ │ ├── BlockHash.kt
│ │ │ │ ├── BlockHashPublicKey.kt
│ │ │ │ ├── BlockchainState.kt
│ │ │ │ ├── Checkpoint.kt
│ │ │ │ ├── InvalidTransaction.kt
│ │ │ │ ├── InventoryItem.kt
│ │ │ │ ├── MerkleBlock.kt
│ │ │ │ ├── NetworkAddress.kt
│ │ │ │ ├── PeerAddress.kt
│ │ │ │ ├── PublicKey.kt
│ │ │ │ ├── SentTransaction.kt
│ │ │ │ ├── Transaction.kt
│ │ │ │ ├── TransactionDataSortType.kt
│ │ │ │ ├── TransactionInfo.kt
│ │ │ │ ├── TransactionInput.kt
│ │ │ │ ├── TransactionMetadata.kt
│ │ │ │ ├── TransactionOutput.kt
│ │ │ │ ├── UsedAddress.kt
│ │ │ │ └── WatchAddressPublicKey.kt
│ │ │ ├── network/
│ │ │ │ ├── Network.kt
│ │ │ │ ├── messages/
│ │ │ │ │ ├── AddrMessage.kt
│ │ │ │ │ ├── FilterLoadMessage.kt
│ │ │ │ │ ├── GetBlocksMessage.kt
│ │ │ │ │ ├── GetDataMessage.kt
│ │ │ │ │ ├── GetHeadersMessage.kt
│ │ │ │ │ ├── HeadersMessage.kt
│ │ │ │ │ ├── IMessage.kt
│ │ │ │ │ ├── InvMessage.kt
│ │ │ │ │ ├── MempoolMessage.kt
│ │ │ │ │ ├── MerkleBlockMessage.kt
│ │ │ │ │ ├── PingMessage.kt
│ │ │ │ │ ├── PongMessage.kt
│ │ │ │ │ ├── RejectMessage.kt
│ │ │ │ │ ├── TransactionMessage.kt
│ │ │ │ │ ├── UnknownMessage.kt
│ │ │ │ │ ├── VerAckMessage.kt
│ │ │ │ │ └── VersionMessage.kt
│ │ │ │ └── peer/
│ │ │ │ ├── IInventoryItemsHandler.kt
│ │ │ │ ├── IPeerTaskHandler.kt
│ │ │ │ ├── MempoolTransactions.kt
│ │ │ │ ├── Peer.kt
│ │ │ │ ├── PeerAddressManager.kt
│ │ │ │ ├── PeerConnection.kt
│ │ │ │ ├── PeerDiscover.kt
│ │ │ │ ├── PeerGroup.kt
│ │ │ │ ├── PeerManager.kt
│ │ │ │ ├── PeerTimer.kt
│ │ │ │ └── task/
│ │ │ │ ├── GetBlockHashesTask.kt
│ │ │ │ ├── GetBlockHeadersTask.kt
│ │ │ │ ├── GetMerkleBlocksTask.kt
│ │ │ │ ├── PeerTask.kt
│ │ │ │ ├── RequestTransactionsTask.kt
│ │ │ │ └── SendTransactionTask.kt
│ │ │ ├── rbf/
│ │ │ │ ├── ReplacementTransaction.kt
│ │ │ │ ├── ReplacementTransactionBuilder.kt
│ │ │ │ └── ReplacementType.kt
│ │ │ ├── serializers/
│ │ │ │ ├── BlockHeaderParser.kt
│ │ │ │ ├── InputSerializer.kt
│ │ │ │ ├── OutputSerializer.kt
│ │ │ │ └── TransactionSerializer.kt
│ │ │ ├── storage/
│ │ │ │ ├── BlockDao.kt
│ │ │ │ ├── BlockHashDao.kt
│ │ │ │ ├── BlockHashPublicKeyDao.kt
│ │ │ │ ├── BlockchainStateDao.kt
│ │ │ │ ├── CoreDatabase.kt
│ │ │ │ ├── DataObjects.kt
│ │ │ │ ├── DataTypeConverters.kt
│ │ │ │ ├── InvalidTransactionDao.kt
│ │ │ │ ├── PeerAddressDao.kt
│ │ │ │ ├── PublicKeyDao.kt
│ │ │ │ ├── SentTransactionDao.kt
│ │ │ │ ├── Storage.kt
│ │ │ │ ├── TransactionDao.kt
│ │ │ │ ├── TransactionInputDao.kt
│ │ │ │ ├── TransactionMetadataDao.kt
│ │ │ │ ├── TransactionOutputDao.kt
│ │ │ │ └── migrations/
│ │ │ │ ├── Migration_10_11.kt
│ │ │ │ ├── Migration_11_12.kt
│ │ │ │ ├── Migration_12_13.kt
│ │ │ │ ├── Migration_13_14.kt
│ │ │ │ ├── Migration_14_15.kt
│ │ │ │ ├── Migration_15_16.kt
│ │ │ │ ├── Migration_16_17.kt
│ │ │ │ ├── Migration_17_18.kt
│ │ │ │ └── Migration_18_19.kt
│ │ │ ├── transactions/
│ │ │ │ ├── BlockTransactionProcessor.kt
│ │ │ │ ├── PendingTransactionProcessor.kt
│ │ │ │ ├── SendTransactionsOnPeersSynced.kt
│ │ │ │ ├── TransactionConflictsResolver.kt
│ │ │ │ ├── TransactionCreator.kt
│ │ │ │ ├── TransactionFeeCalculator.kt
│ │ │ │ ├── TransactionInvalidator.kt
│ │ │ │ ├── TransactionSendTimer.kt
│ │ │ │ ├── TransactionSender.kt
│ │ │ │ ├── TransactionSizeCalculator.kt
│ │ │ │ ├── TransactionSyncer.kt
│ │ │ │ ├── builder/
│ │ │ │ │ ├── ECKey.kt
│ │ │ │ │ ├── EcdsaInputSigner.kt
│ │ │ │ │ ├── InputSetter.kt
│ │ │ │ │ ├── LockTimeSetter.kt
│ │ │ │ │ ├── MutableTransaction.kt
│ │ │ │ │ ├── OutputSetter.kt
│ │ │ │ │ ├── RecipientSetter.kt
│ │ │ │ │ ├── SchnorrInputSigner.kt
│ │ │ │ │ ├── TransactionBuilder.kt
│ │ │ │ │ └── TransactionSigner.kt
│ │ │ │ ├── extractors/
│ │ │ │ │ ├── MyOutputsCache.kt
│ │ │ │ │ ├── TransactionExtractor.kt
│ │ │ │ │ └── TransactionMetadataExtractor.kt
│ │ │ │ └── scripts/
│ │ │ │ ├── OpCodes.kt
│ │ │ │ └── Script.kt
│ │ │ └── utils/
│ │ │ ├── Base58AddressConverter.kt
│ │ │ ├── Bech32AddressConverter.kt
│ │ │ ├── Bip69.kt
│ │ │ ├── DirectExecutor.kt
│ │ │ ├── IAddressConverter.kt
│ │ │ ├── MainThreadExecutor.kt
│ │ │ ├── MerkleBranch.kt
│ │ │ ├── NetworkUtils.kt
│ │ │ ├── PaymentAddressParser.kt
│ │ │ └── TransactionDataSorters.kt
│ │ └── res/
│ │ └── values/
│ │ └── strings.xml
│ └── test/
│ ├── kotlin/
│ │ └── io/
│ │ └── horizontalsystems/
│ │ └── bitcoincore/
│ │ ├── Fixtures.kt
│ │ ├── RxTestRule.kt
│ │ ├── TestHelpers.kt
│ │ ├── blocks/
│ │ │ ├── BlockSyncerTest.kt
│ │ │ ├── BlockchainTest.kt
│ │ │ └── validators/
│ │ │ ├── BitsValidatorTest.kt
│ │ │ ├── LegacyDifficultyAdjustmentValidatorTest.kt
│ │ │ ├── LegacyTestNetDifficultyValidatorTest.kt
│ │ │ └── ProofOfWorkValidatorTest.kt
│ │ ├── core/
│ │ │ └── DataProviderTest.kt
│ │ ├── managers/
│ │ │ ├── ApiManagerTest.kt
│ │ │ ├── BlockDiscoveryBatchTest.kt
│ │ │ ├── BlockHashFetcherHelperTest.kt
│ │ │ ├── BlockHashFetcherTest.kt
│ │ │ ├── InitialSyncerTest.kt
│ │ │ ├── IrregularOutputFinderTest.kt
│ │ │ ├── StateManagerTest.kt
│ │ │ ├── SyncManagerTest.kt
│ │ │ ├── UnspentOutputProviderTest.kt
│ │ │ ├── UnspentOutputSelectorSingleNoChangeTest.kt
│ │ │ └── UnspentOutputSelectorTest.kt
│ │ ├── message/
│ │ │ ├── MerkleBlockExtractorTest.kt
│ │ │ └── TransactionMessageParserTest.kt
│ │ ├── models/
│ │ │ └── TransactionTest.kt
│ │ ├── network/
│ │ │ ├── PeerGroupTest.kt
│ │ │ ├── PeerManagerTest.kt
│ │ │ ├── PeerTest.kt
│ │ │ └── peer/
│ │ │ ├── PeerHostManagerTest.kt
│ │ │ └── task/
│ │ │ └── SendTransactionTaskTest.kt
│ │ ├── transactions/
│ │ │ ├── TransactionExtractorTest.kt
│ │ │ ├── TransactionProcessorTest.kt
│ │ │ ├── TransactionSenderTest.kt
│ │ │ ├── TransactionSizeCalculatorTest.kt
│ │ │ ├── TransactionSyncerTest.kt
│ │ │ ├── builder/
│ │ │ │ └── InputSignerTest.kt
│ │ │ └── scripts/
│ │ │ └── ScriptTest.kt
│ │ └── utils/
│ │ ├── AddressConverterTest.kt
│ │ ├── Bip69Test.kt
│ │ ├── CashAddressConverterTest.kt
│ │ ├── NetworkUtilsTest.kt
│ │ ├── PaymentAddressParserTest.kt
│ │ └── SegwitAddressConverterTest.kt
│ └── resources/
│ └── mockito-extensions/
│ └── org.mockito.plugins.MockMaker
├── bitcoinkit/
│ ├── .gitignore
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── kotlin/
│ │ │ └── io/
│ │ │ └── horizontalsystems/
│ │ │ └── bitcoinkit/
│ │ │ ├── BitcoinKit.kt
│ │ │ ├── MainNet.kt
│ │ │ ├── RegTest.kt
│ │ │ ├── TestNet.kt
│ │ │ ├── core/
│ │ │ │ └── DataProvider.kt
│ │ │ └── utils/
│ │ │ └── AddressConverter.kt
│ │ └── resources/
│ │ ├── MainNet-bip44.checkpoint
│ │ ├── MainNet.checkpoint
│ │ ├── TestNet-bip44.checkpoint
│ │ └── TestNet.checkpoint
│ └── test/
│ ├── kotlin/
│ │ └── io/
│ │ └── horizontalsystems/
│ │ └── bitcoinkit/
│ │ ├── Fixtures.kt
│ │ └── MainNetTest.kt
│ └── resources/
│ └── mockito-extensions/
│ └── org.mockito.plugins.MockMaker
├── build.gradle
├── dashkit/
│ ├── .gitignore
│ ├── build.gradle
│ ├── cpp/
│ │ ├── CMakeLists.txt
│ │ ├── config.h
│ │ └── dashj-bls/
│ │ ├── CMakeLists.txt
│ │ ├── bls-signatures-src.cmake
│ │ ├── bls-signatures.cmake
│ │ ├── dashj-bls-signature-wrapper.cpp
│ │ ├── pthread.c
│ │ └── stdio.cpp
│ ├── libs/
│ │ └── dashj-bls-0.15.3.jar
│ ├── proguard-rules.pro
│ └── src/
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── kotlin/
│ │ │ └── io/
│ │ │ └── horizontalsystems/
│ │ │ └── dashkit/
│ │ │ ├── DashKit.kt
│ │ │ ├── DashKitErrors.kt
│ │ │ ├── IDashStorage.kt
│ │ │ ├── IInstantTransactionDelegate.kt
│ │ │ ├── IMerkleHasher.kt
│ │ │ ├── InstantSend.kt
│ │ │ ├── InventoryType.kt
│ │ │ ├── MainNetDash.kt
│ │ │ ├── TestNetDash.kt
│ │ │ ├── X11Hasher.kt
│ │ │ ├── core/
│ │ │ │ ├── DashTransactionInfoConverter.kt
│ │ │ │ └── DoubleSha256Hasher.kt
│ │ │ ├── instantsend/
│ │ │ │ ├── BLS.kt
│ │ │ │ ├── InstantSendFactory.kt
│ │ │ │ ├── InstantSendLockValidator.kt
│ │ │ │ ├── InstantTransactionManager.kt
│ │ │ │ ├── QuorumMasternode.kt
│ │ │ │ ├── TransactionLockVoteValidator.kt
│ │ │ │ ├── instantsendlock/
│ │ │ │ │ ├── InstantSendLockHandler.kt
│ │ │ │ │ └── InstantSendLockManager.kt
│ │ │ │ └── transactionlockvote/
│ │ │ │ ├── TransactionLockVoteHandler.kt
│ │ │ │ └── TransactionLockVoteManager.kt
│ │ │ ├── managers/
│ │ │ │ ├── ConfirmedUnspentOutputProvider.kt
│ │ │ │ ├── MasternodeListManager.kt
│ │ │ │ ├── MasternodeListSyncer.kt
│ │ │ │ ├── MasternodeSortedList.kt
│ │ │ │ ├── QuorumListManager.kt
│ │ │ │ └── QuorumSortedList.kt
│ │ │ ├── masternodelist/
│ │ │ │ ├── MasternodeCbTxHasher.kt
│ │ │ │ ├── MasternodeListMerkleRootCalculator.kt
│ │ │ │ ├── MerkleRootCreator.kt
│ │ │ │ ├── MerkleRootHasher.kt
│ │ │ │ └── QuorumListMerkleRootCalculator.kt
│ │ │ ├── messages/
│ │ │ │ ├── GetMasternodeListDiffMessage.kt
│ │ │ │ ├── ISLockMessage.kt
│ │ │ │ ├── MasternodeListDiffMessage.kt
│ │ │ │ ├── TransactionLockMessage.kt
│ │ │ │ ├── TransactionLockVoteMessage.kt
│ │ │ │ └── TransactionMessage.kt
│ │ │ ├── models/
│ │ │ │ ├── CoinbaseTransaction.kt
│ │ │ │ ├── CoinbaseTransactionSerializer.kt
│ │ │ │ ├── DashTransactionInfo.kt
│ │ │ │ ├── InstantTransactionHash.kt
│ │ │ │ ├── InstantTransactionInput.kt
│ │ │ │ ├── InstantTransactionState.kt
│ │ │ │ ├── Masternode.kt
│ │ │ │ ├── MasternodeListState.kt
│ │ │ │ ├── Quorum.kt
│ │ │ │ └── SpecialTransaction.kt
│ │ │ ├── storage/
│ │ │ │ ├── DashKitDatabase.kt
│ │ │ │ └── DashStorage.kt
│ │ │ ├── tasks/
│ │ │ │ ├── PeerTaskFactory.kt
│ │ │ │ ├── RequestInstantSendLocksTask.kt
│ │ │ │ ├── RequestMasternodeListDiffTask.kt
│ │ │ │ ├── RequestTransactionLockRequestsTask.kt
│ │ │ │ └── RequestTransactionLockVotesTask.kt
│ │ │ └── validators/
│ │ │ ├── DarkGravityWaveTestnetValidator.kt
│ │ │ └── DarkGravityWaveValidator.kt
│ │ └── resources/
│ │ ├── MainNetDash-bip44.checkpoint
│ │ ├── MainNetDash.checkpoint
│ │ ├── TestNetDash-bip44.checkpoint
│ │ └── TestNetDash.checkpoint
│ └── test/
│ ├── kotlin/
│ │ └── io/
│ │ └── horizontalsystems/
│ │ └── dashkit/
│ │ ├── messages/
│ │ │ └── MasternodeListDiffMessageParserTest.kt
│ │ └── validators/
│ │ └── DarkGravityWaveValidatorTest.kt
│ └── resources/
│ └── mockito-extensions/
│ └── org.mockito.plugins.MockMaker
├── ecashkit/
│ ├── .gitignore
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── kotlin/
│ │ │ ├── chronik/
│ │ │ │ └── Chronik.java
│ │ │ └── io/
│ │ │ └── horizontalsystems/
│ │ │ └── ecash/
│ │ │ ├── ChronikApi.kt
│ │ │ ├── ECashKit.kt
│ │ │ ├── ECashRestoreKeyConverter.kt
│ │ │ └── MainNetECash.kt
│ │ └── resources/
│ │ ├── MainNetECash-bip44.checkpoint
│ │ └── MainNetECash.checkpoint
│ └── test/
│ └── java/
│ └── io/
│ └── horizontalsystems/
│ └── ecash/
│ └── ExampleUnitTest.kt
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── hodler/
│ ├── .gitignore
│ ├── build.gradle
│ ├── consumer-rules.pro
│ ├── proguard-rules.pro
│ └── src/
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── kotlin/
│ │ │ └── io/
│ │ │ └── horizontalsystems/
│ │ │ └── hodler/
│ │ │ ├── HodlerData.kt
│ │ │ ├── HodlerOutputData.kt
│ │ │ ├── HodlerPlugin.kt
│ │ │ └── LockTimeInterval.kt
│ │ └── res/
│ │ └── values/
│ │ └── strings.xml
│ └── test/
│ ├── java/
│ │ └── io/
│ │ └── horizontalsystems/
│ │ └── hodler/
│ │ └── HodlerPluginTest.kt
│ └── resources/
│ └── mockito-extensions/
│ └── org.mockito.plugins.MockMaker
├── litecoinkit/
│ ├── .gitignore
│ ├── build.gradle
│ ├── consumer-rules.pro
│ ├── proguard-rules.pro
│ └── src/
│ ├── androidTest/
│ │ └── java/
│ │ └── io/
│ │ └── horizontalsystems/
│ │ └── litecoinkit/
│ │ └── ExampleInstrumentedTest.kt
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── kotlin/
│ │ │ └── io/
│ │ │ └── horizontalsystems/
│ │ │ └── litecoinkit/
│ │ │ ├── LitecoinKit.kt
│ │ │ ├── MainNetLitecoin.kt
│ │ │ ├── ScryptHasher.kt
│ │ │ ├── TestNetLitecoin.kt
│ │ │ └── validators/
│ │ │ ├── LegacyDifficultyAdjustmentValidator.kt
│ │ │ └── ProofOfWorkValidator.kt
│ │ └── resources/
│ │ ├── MainNetLitecoin-bip44.checkpoint
│ │ ├── MainNetLitecoin.checkpoint
│ │ ├── TestNetLitecoin-bip44.checkpoint
│ │ └── TestNetLitecoin.checkpoint
│ └── test/
│ └── java/
│ └── io/
│ └── horizontalsystems/
│ └── litecoinkit/
│ ├── ExampleUnitTest.kt
│ └── ScryptHasherTest.kt
├── settings.gradle
└── tools/
├── .gitignore
├── build.gradle
├── consumer-rules.pro
├── proguard-rules.pro
└── src/
└── main/
├── AndroidManifest.xml
├── java/
│ └── io/
│ └── horizontalsystems/
│ └── tools/
│ ├── BuildCheckpoints.kt
│ ├── CheckpointSyncer.kt
│ ├── PeerAddressManager.kt
│ └── Tools.kt
└── res/
└── values/
└── strings.xml
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/workflows/pull-request-notify.yml
================================================
name: Notify PR events
on:
pull_request:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Notify to Telegrem
uses: appleboy/telegram-action@master
with:
to: ${{secrets.TELEGRAM_TO}}
token: ${{secrets.TELEGRAM_TOKEN}}
disable_web_page_preview: true
message: |
${{ github.event.pull_request.html_url }}
Title: ${{github.event.pull_request.title}}
Author: ${{github.actor}}
================================================
FILE: .gitignore
================================================
*.iml
.gradle
.idea
.DS_Store
/build
/captures
/local.properties
.externalNativeBuild
================================================
FILE: .gitmodules
================================================
[submodule "dashkit/cpp/dashj-bls/bls-signatures"]
path = dashkit/cpp/dashj-bls/bls-signatures
url = https://github.com/Chia-Network/bls-signatures
================================================
FILE: CONTRIBUTING.md
================================================
## Implementing support for a new coin for external developers
Support for coin is implemented as a separate module that depends on the module `bitcoincore`. This repository contains modules for supporting coins like `Bitcoin`, `BitcoinCash` and `Dash`. Support for a new coin should be implemented in the owners repository.
### Structure of module
The module depends on the `bitcoincore`. This dependency can be added via JitPack repository.
In the main `build.gradle` add the JitPack repository:
```
repositories {
maven { url 'https://jitpack.io' }
}
```
Add the following dependency to module `build.gradle` file:
```
dependencies {
implementation 'com.github.horizontalsystems.bitcoin-kit-android:bitcoincore:${version}'
}
```
It implements `AbstractKit` and `Network` interfaces (abstract classes).
Customizing can be done in 2 places:
1. Via `BitcoinCoreBuilder` when building `BitcoinCore`
2. Via `BitcoinCore`
There are multiple places that can be customized. See the modules [`bitcoinkit`](bitcoinkit), [`bitcoincashkit`](bitcoincashkit) and [`dashkit`](dashkit) for reference. If you need a new extension point please [add an issue](https://github.com/horizontalsystems/bitcoin-kit-android/issues/new).
When the module is released let us know about it. We will review it and decide whether to add it to Unstoppable wallet app.
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2018 Horizontal Systems
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
# BitcoinKit
`bitcoin-kit-android` is a Bitcoin wallet toolkit implemented in Kotlin. It consists of following libraries:
- `bitcoincore` is a core library that implements a full Simplified Payment Verification (`SPV`) client in `Kotlin`. It implements Bitcoin `P2P Protocol` and can be extended to be a client of other Bitcoin forks like BitcoinCash, Litecoin, etc.
- `bitcoinkit` extends **bitcoincore**, makes it usable with `Bitcoin` network.
- `bitcoincashkit` extends **bitcoincore**, makes it usable with `BitcoinCash(ABC)` network.
- `litecoinkit` extends **bitcoincore**, makes it usable with `Litecoin` network.
- `dashkit` extends **bitcoincore**, makes it usable with `Dash` network.
- `hodler` is a plugin for `bitcoincore`, that makes it possible to lock certain amount of coins until some time in the future.
Being an SPV client, **bitcoincore** downloads and validates all the block headers, inclusion of transactions in the blocks, integrity and immutability of transactions as described in the Bitcoin whitepaper or delegates validation to the extensions that implement the forks of Bitcoin.
## Core Features
- [x] Bitcoin P2P Protocol implementation in Kotlin.
- [x] Full SPV implementation for fast mobile performance with account security and privacy in mind
- [x] `P2PK`, `P2PKH`, `P2SH-P2WPKH`, `P2WPKH` outputs support.
- [x] Restoring with mnemonic seed. (Generated from private seed phrase)
- [x] Restoring with [BIP32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki) extended public key. (This becomes a `Watch account` unable to spend funds)
- [x] Quick initial restore over node API. (optional)
- [x] Handling transaction (Replacement)/(Double spend)/(Failure by expiration)
- [x] Optimized UTXO selection when spending coins.
- [x] [BIP69](https://github.com/bitcoin/bips/blob/master/bip-0069.mediawiki) or simple shuffle output ordering. (configurable)
- [x] [BIP21](https://github.com/bitcoin/bips/blob/master/bip-0021.mediawiki) URI schemes with payment address, amount, label and other parameters
# bitcoinkit
## Usage
### Initialization
First, you need an instance of *BitcoinKit* class. You can initialize it with Mnemonic seed or BIP32 extended key (private or public). To generate seed from mnemonic seed phrase you can use [HdWalletKit](https://github.com/horizontalsystems/hd-wallet-kit-android) to convert a word list to a seed.
```kotlin
val words = listOf("mnemonic", "phrase", "words")
val passphrase: String = ""
val seed = Mnemonic().toSeed(words, passphrase)
```
Then you can pass a seed to initialize an instance of *BitcoinKit*
```kotlin
val context = Application()
val bitcoinKit = BitcoinKit(
context = context,
seed = seed,
walletId = "unique_wallet_id",
syncMode = BitcoinCore.SyncMode.Api(),
networkType = NetworkType.MainNet,
confirmationsThreshold = 6,
purpose = HDWallet.Purpose.BIP84
)
```
#### `purpose`
*bitcoinkit* supports `BIP44`, `BIP49` and `BIP84` wallets. They have different derivation paths, so you need to specify this on kit initialization.
#### `syncMode`
*bitcoinkit* pulls all historical transactions of given account from bitcoin peers according to SPV protocol. This process may take several hours as it needs to download every block header with some transactions to find transactions concerning the accounts addresses. In order to speed up the initial blockchain scan, *bitcoincore* has some optimization options:
- It doesn't download blocks added before the [BIP44](https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki) was implemented by wallets, because there were no transactions concerning addresses generated by BIP44 wallets.
- If you set **API()** or **NewWallet()** to *syncMode* parameter, it first requests from an **API**(currently [Blockchain.com](https://blockchain.info)) the hashes of the blocks where there are transactions we need. Then, it downloads those blocks from the bitcoin peers. This reduces the initial synchronization time to several minutes. This also carries some risks that makes it possible for a middle-man attacker to learn about the addresses requested from your IP address. But your funds are totally safe.
If you set **Full()** to *syncMode*, then only decentralized peers are used. Once the initial blockchain scan is completed, the remaining synchronization works with decentralized peers only for all *syncMode*s.
#### Additional parameters:
- `networkType`: Mainnet or Testnet
- `confirmationsThreshold`: Minimum number of confirmations required for an unspent output to be available for use (*default: 6*)
#### Initializing with HD extended key
You can initialize `BitcoinKit` using BIP32 Extended Private/Public Key as follows:
```kotlin
val extendedKey = HDExtendedKey("xprvA1BgyAq84AiAsrMm6DKqwCXDwxLBXq76dpUfuNXNziGMzDxYLjE9AkuYBAQTpt6aJu4nFYamh6BbrRkys5fJcxGd7qixNrpVpPBxui9oYyF")
val bitcoinKit = BitcoinKit(
context = context,
extendedKey = extendedKey,
walletId = "unique_wallet_id",
syncMode = BitcoinCore.SyncMode.Api(),
networkType = NetworkType.MainNet,
confirmationsThreshold = 6
)
```
If you restore with a public extended key, then you only will be able to watch the wallet. You won't be able to send any transactions. This is how the **watch account** feature is implemented.
### Starting and Stopping
*BitcoinKit* requires to be started with `start` command. It will be in synced state as long as it is possible. You can call `stop` to stop it
```kotlin
bitcoinKit.start()
bitcoinKit.stop()
```
### Getting wallet data
#### Balance
Balance is provided in `Satoshis`:
```kotlin
val balance = bitcoinKit.balance
println(balance.spendable)
println(balance.unspendable)
```
Unspendable balance is non-zero if you have UTXO that is currently not spendable due to some custom unlock script. These custom scripts can be implemented as a plugin, like **Hodler**
#### Last Block Info
```kotlin
val blockInfo = bitcoinKit.lastBlockInfo ?: return
println(blockInfo.headerHash)
println(blockInfo.height)
println(blockInfo.timestamp)
```
#### Receive Address
Get an address which you can receive coins to. Receive address is changed each time after you actually get some coins in that address
```kotlin
bitcoinKit.receiveAddress() // "mgv1KTzGZby57K5EngZVaPdPtphPmEWjiS"
```
#### Transactions
You can get your transactions using `transactions(fromUid: String? = null, type: TransactionFilterType? = null, limit: Int? = null)` method of the *BitcoinKit* instance. It returns *Single<List<TransactionInfo>>*. You'll need to subscribe and get transactions asynchronously. See [RX Single Observers](http://reactivex.io/RxJava/3.x/javadoc/io/reactivex/rxjava3/core/Single.html) for more info.
```kotlin
val disposables = CompositeDisposable()
bitcoinKit.transactions().subscribe { transactionInfos ->
for (transactionInfo in transactionInfos) {
println("Uid: ${transactionInfo.uid}")
println("Hash: ${transactionInfo.transactionHash}")
}
}.let {
disposables.add(it)
}
```
- `fromUid` and `limit` parameters can be used for pagination.
- `type` parameter enables to filter transactions by coins flow. You can pass *incoming* OR *outgoing* to get filtered transactions
#### TransactionInfo
A sample dump:
```kotlin
// transactionInfo = {TransactionInfo}
// amount = 13114
// blockHeight = 740024
// conflictingTxHash = null
// fee = null
// inputs = {ArrayList} size = 1
// 0 = {TransactionInputInfo}
// address = "16s6q8dAgLbDT3szEc4nvTh81deRCBtEa1"
// mine = false
// value = null
// outputs = {ArrayList} size = 2
// 0 = {TransactionOutputInfo}
// address = "bc1qsg9ul383f8pespcvc8u3katl6gnsr7sjyfe3pc"
// changeOutput = false
// mine = true
// pluginData = null
// pluginDataString = null
// pluginId = null
// value = 13114
// 1 = {TransactionOutputInfo}
// address = "16VCm8mYhHE3EiELi8GiYEqAjnPu1TSgAV"
// changeOutput = false
// mine = false
// pluginData = null
// pluginDataString = null
// pluginId = null
// value = 1422
// status = {TransactionStatus} RELAYED
// timestamp = 1654766137
// transactionHash = "cadf99db1e145dcfadfa2bc3eacb94831eb6c53d376f4f873aa4ac017b8c7f8f"
// transactionIndex = 2760
// type = {TransactionType} Incoming
// uid = "75934663-3c84-4b38-9b6d-810d3433de17"
```
`uid`
A local unique ID
`type`
- *Incoming*
- *Outgoing*
- *SentToSelf*
`status`
- *NEW* -> transaction is in mempool
- *RELAYED* -> transaction is in block
- *INVALID* -> transaction is not included in block due to an error OR replaced by another one (RBF).
### Sending BTC
```kotlin
bitcoinKit.send(address = "36k1UofZ2iP2NYax9znDCsksajfKeKLLMJ", value = 100000000, feeRate = 10, sortType = TransactionDataSortType.Bip69)
```
This first validates a given address and amount, creates new transaction, then sends it over the peers network. If there's any error with given address/amount or network, it raises an exception.
#### Validate address
```kotlin
bitcoinKit.validateAddress(address = "mrjQyzbX9SiJxRC2mQhT4LvxFEmt9KEeRY")
```
#### Evaluate fee
```kotlin
bitcoinKit.fee(address = "36k1UofZ2iP2NYax9znDCsksajfKeKLLMJ", value = 100000000, feeRate = 10)
```
### Parsing BIP21 URI
You can use `parsePaymentAddress` method to parse a BIP21 URI:
```kotlin
bitcoinKit.parsePaymentAddress("bitcoin:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?amount=50&label=Luke-Jr&message=Donation%20for%20project%20xyz")
// ▿ BitcoinPaymentData
// - address : "175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W"
// - version : null
// - amount : 50.0
// - label : "Luke-Jr"
// - message : "Donation for project xyz"
// - parameters : null
```
### Subscribing to BitcoinKit data
Balance, transactions, last blocks synced and kit state are available in real-time. `BitcoinKit.Listener` interface must be implemented and set to *BitcoinKit* instance to receive that.
```kotlin
class Manager(val bitcoinKit: BitcoinKit) : BitcoinKit.Listener {
init {
bitcoinKit.listener = this
}
override fun onBalanceUpdate(balance: BalanceInfo) {
}
override fun onLastBlockInfoUpdate(blockInfo: BlockInfo) {
}
override fun onKitStateUpdate(state: BitcoinCore.KitState) {
}
override fun onTransactionsUpdate(inserted: List<TransactionInfo>, updated: List<TransactionInfo>) {
}
override fun onTransactionsDelete(hashes: List<String>) {
}
}
```
# bitcoincashkit
## Features
- [x] `Base58` and `Bech32`
- [x] Validation of BCH hard forks
- [x] `ASERT`, `DAA`, `EDA` validations
## Usage
Because BitcoinCash is a fork of Bitcoin, the usage of this library does not differ much from `bitcoinkit`. So we only describe some differences between them.
### Initialization
All BitcoinCash wallets use default [BIP44](https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki) derivation path where *coinType* is `145` according to [SLIP44](https://github.com/satoshilabs/slips/blob/master/slip-0044.md). But since it's a fork of Bitcoin, `0` coinType also can be restored.
```kotlin
val context = Application()
val seed = Mnemonic().toSeed(listOf("mnemonic", "phrase", "words"), "")
val bitcoinCashKit = BitcoinCashKit(
context = context,
seed = seed,
walletId = "unique_wallet_id",
syncMode = BitcoinCore.SyncMode.Api(),
networkType = NetworkType.MainNet(MainNetBitcoinCash.CoinType.Type145),
confirmationsThreshold = 6
)
```
# litecoinkit
Usage identical to `bitcoinkit`
# dashkit
## Features
- [x] Instant send
- [x] LLMQ lock, Masternodes validation
## Usage
### Initialization
```kotlin
val context = Application()
val seed = Mnemonic().toSeed(listOf("mnemonic", "phrase", "words"), "")
val dashKit = DashKit(
context = context,
seed = seed,
walletId = "unique_wallet_id",
syncMode = BitcoinCore.SyncMode.Api(),
networkType = NetworkType.MainNet,
confirmationsThreshold = 6
)
```
### DashTransactionInfo
Dash has some transactions marked `instant`. So, instead of `TransactionInfo` object *DashKit* works with `DashTransactionInfo` that has that field and a respective `DashKit.Listener` listener class.
# hodler
`hodler` is a plugin to `bitcoincore`, that makes it possible to lock bitcoins until some time in the future. It relies on [CHECKSEQUENCEVERIFY](https://github.com/bitcoin/bips/blob/master/bip-0112.mediawiki) and [Relative time-locks](https://github.com/bitcoin/bips/blob/master/bip-0068.mediawiki). It may be used with other forks of Bitcoin that support them. `UnstooppableWallet` opts in this plugin and enables it for Bitcoin as an experimental feature.
## How it works
To lock funds we create P2SH output where redeem script has `OP_CSV` OpCode that ensures that the input has a proper Sequence Number(`nSequence`) field and that it enables a relative time-lock.
In [this](https://blockstream.info/tx/1cd11e80d04c82d098f19badb153ea12ec84cda408daaadc566cc129f967a435?input:1&expand) sample transaction the second input unlocks such an output. It has a signature, public key and the following redeem script in its scriptSig:
`OP_PUSHBYTES_3 070040 OP_CSV OP_DROP OP_DUP OP_HASH160 OP_PUSHBYTES_20 853316620ed93e4ade18f8218f9aa15dc36c768e OP_EQUALVERIFY OP_CHECKSIG`
- `OP_PUSHBYTES_3 070040 OP_CSV OP_DROP` part ensures that needed amount of time is passed. Specifically `07` part of `070040` bytes says that it's locked for 1 hour. See [here](https://github.com/horizontalsystems/bitcoin-kit-android/blob/master/hodler/src/main/kotlin/io/horizontalsystems/hodler/LockTimeInterval.kt) and [here](https://github.com/bitcoin/bips/blob/master/bip-0068.mediawiki) for how it's evaluated.
- `OP_DUP OP_HASH160 OP_PUSHBYTES_20 853316620ed93e4ade18f8218f9aa15dc36c768e OP_EQUALVERIFY OP_CHECKSIG` part is the same locking script as of `P2PKH` output, that ensures the spender is the owner of the private key matching the public key hashed to `853316620ed93e4ade18f8218f9aa15dc36c768e`.
### Detection of incoming time-locked funds
When you have such an `P2SH` output, you only have an address and a hash of a redeem script in the output. If you are not aware of incoming time-locked funds in advance, there's no way you can detect that a particular output is yours. For this reason, we add an extra `OP_RETURN` output beside that `P2SH` output as a hint. That output tells us
- ID of the plugin (1 byte): `bitcoincore` can handle multiple plugins like this one.
- Time-lock period (2 bytes)
- Hash of the receiver's public key (20 bytes)
For example, [this](https://blockstream.info/tx/bdc3e995100269c8813f291dd9ea5489d8a17bd163002f70b5abbe05b5dccbd3?expand) is a *hint* output for the input above. It has following data:
`OP_RETURN OP_PUSHNUM_1 OP_PUSHBYTES_2 0700 OP_PUSHBYTES_20 853316620ed93e4ade18f8218f9aa15dc36c768e`
## Limitations
### Locked time periods
This plugin can lock coins for `1 hour`, `1 month`, `half a year` and `1 year`. This is a limitation arising from the need of restoring those outputs using Simplified Payment Verification (SPV) `Bloom Filters`. Since each lock time generates different `P2SH` addresses, it wouldn't be possible to restore those outputs without knowing the exact lock time period in advance. So we generate 4 different addresses for each public key and use them in the bloom filters.
### BTC amount
We allow maximum 0.5 BTC to be locked. We assume that's an acceptable amount to be locked if done unintentionally.
## Prerequisites
* JDK >= 1.8
* Android 6 (minSdkVersion 23) or greater
## Installation
Add the JitPack to module build.gradle
```
repositories {
maven { url 'https://jitpack.io' }
}
```
Add the following dependency to your build.gradle file:
```
dependencies {
implementation 'com.github.horizontalsystems:bitcoin-kit-android:master-SNAPSHOT'
}
```
## Example App
All features of the library are used in example project. It can be referred as a starting point for usage of the library.
* [Example App](https://github.com/horizontalsystems/bitcoin-kit-android/tree/master/app)
## Dependencies
* [HDWalletKit](https://github.com/horizontalsystems/hd-wallet-kit-android) - HD Wallet related features, mnemonic phrase
## Contributing
[Contributing](CONTRIBUTING.md)
## License
The `bitcoin-kit-android` is open source and available under the terms of the [MIT License](https://github.com/horizontalsystems/bitcoin-kit-android/blob/master/LICENSE)
================================================
FILE: app/.gitignore
================================================
/build
================================================
FILE: app/build.gradle
================================================
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
}
android {
namespace 'io.horizontalsystems.bitcoinkit.demo'
compileSdk 34
defaultConfig {
applicationId "io.horizontalsystems.bitcoinkit.demo"
minSdkVersion 23
targetSdkVersion 34
versionCode 1
versionName "0.3.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions { jvmTarget = '17' }
packagingOptions {
resources {
pickFirsts += ['META-INF/atomicfu.kotlin_module']
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'com.google.android.material:material:1.10.0'
implementation 'io.reactivex.rxjava2:rxjava:2.2.19'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
// ViewModel and LiveData
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
//LeakCanary
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.10'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
implementation project(':bitcoinkit')
implementation project(':dashkit')
implementation project(':bitcoincashkit')
implementation project(':litecoinkit')
implementation project(':ecashkit')
}
================================================
FILE: app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
================================================
FILE: app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name=".App"
android:allowBackup="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
================================================
FILE: app/src/main/java/io/horizontalsystems/bitcoinkit/demo/App.kt
================================================
package io.horizontalsystems.bitcoinkit.demo
import android.app.Application
class App : Application() {
override fun onCreate() {
super.onCreate()
instance = this
}
companion object {
lateinit var instance: App
private set
}
}
================================================
FILE: app/src/main/java/io/horizontalsystems/bitcoinkit/demo/BalanceFragment.kt
================================================
package io.horizontalsystems.bitcoinkit.demo
import androidx.lifecycle.Observer
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.TextView
import androidx.appcompat.app.AlertDialog
import androidx.lifecycle.ViewModelProvider
import io.horizontalsystems.bitcoincore.BitcoinCore
import java.text.SimpleDateFormat
import java.util.*
class BalanceFragment : Fragment() {
lateinit var viewModel: MainViewModel
lateinit var networkName: TextView
lateinit var balanceValue: TextView
lateinit var balanceUnspendableValue: TextView
lateinit var lastBlockDateValue: TextView
lateinit var lastBlockValue: TextView
lateinit var stateValue: TextView
lateinit var startButton: Button
lateinit var clearButton: Button
lateinit var buttonDebug: Button
lateinit var buttonStatus: Button
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel = activity?.let { ViewModelProvider(it).get(MainViewModel::class.java) } ?: return
viewModel.balance.observe(this, Observer { balance ->
when (balance) {
null -> {
balanceValue.text = ""
balanceUnspendableValue.text = ""
}
else -> {
balanceValue.text = NumberFormatHelper.cryptoAmountFormat.format(balance.spendable / 100_000_000.0)
balanceUnspendableValue.text = NumberFormatHelper.cryptoAmountFormat.format((balance.unspendableTimeLocked + balance.unspendableNotRelayed) / 100_000_000.0)
}
}
})
val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US)
viewModel.lastBlock.observe(this, Observer {
it?.let { blockInfo ->
lastBlockValue.text = blockInfo.height.toString()
val strDate = dateFormat.format(Date(blockInfo.timestamp * 1000))
lastBlockDateValue.text = strDate
}
})
viewModel.state.observe(this, Observer { state ->
when (state) {
is BitcoinCore.KitState.Synced -> {
stateValue.text = "synced"
}
is BitcoinCore.KitState.ApiSyncing -> {
stateValue.text = "api syncing ${state.transactions} txs"
}
is BitcoinCore.KitState.Syncing -> {
stateValue.text = "syncing ${"%.3f".format(state.progress)}"
}
is BitcoinCore.KitState.NotSynced -> {
stateValue.text = "not synced ${state.exception.javaClass.simpleName}"
}
}
})
viewModel.status.observe(this, Observer {
when (it) {
MainViewModel.State.STARTED -> {
startButton.isEnabled = false
}
else -> {
startButton.isEnabled = true
}
}
})
viewModel.statusInfo.observe(this, Observer { statusInfo ->
activity?.let {
val dialog = AlertDialog.Builder(it)
.setMessage(formatMapToString(statusInfo))
.setTitle("Status Info")
.create()
dialog.show()
}
})
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_balance, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
networkName = view.findViewById(R.id.networkName)
networkName.text = viewModel.networkName
balanceValue = view.findViewById(R.id.balanceValue)
balanceUnspendableValue = view.findViewById(R.id.balanceUnspendableValue)
lastBlockValue = view.findViewById(R.id.lastBlockValue)
lastBlockDateValue = view.findViewById(R.id.lastBlockDateValue)
stateValue = view.findViewById(R.id.stateValue)
startButton = view.findViewById(R.id.buttonStart)
clearButton = view.findViewById(R.id.buttonClear)
buttonDebug = view.findViewById(R.id.buttonDebug)
buttonStatus = view.findViewById(R.id.buttonStatus)
startButton.setOnClickListener {
viewModel.start()
}
clearButton.setOnClickListener {
viewModel.clear()
}
buttonDebug.setOnClickListener {
viewModel.showDebugInfo()
}
buttonStatus.setOnClickListener {
viewModel.showStatusInfo()
}
}
@Suppress("UNCHECKED_CAST")
private fun formatMapToString(status: Map<String, Any>?, indentation: String = "", bullet: String = "", level: Int = 0): String? {
if (status == null)
return null
val sb = StringBuilder()
status.toList().forEach { (key, value) ->
val title = "$indentation$bullet$key"
when (value) {
is Map<*, *> -> {
val formattedValue = formatMapToString(value as? Map<String, Any>, "\t\t$indentation", " - ", level + 1)
sb.append("$title:\n$formattedValue${if (level < 2) "\n" else ""}")
}
else -> {
sb.appendln("$title: $value")
}
}
}
val statusString = sb.trimEnd()
return if (statusString.isEmpty()) "" else "$statusString\n"
}
}
================================================
FILE: app/src/main/java/io/horizontalsystems/bitcoinkit/demo/FeePriority.kt
================================================
package io.horizontalsystems.bitcoinkit.demo
sealed class FeePriority(val feeRate: Int) {
object Low : FeePriority(5)
object Medium : FeePriority(10)
object High : FeePriority(15)
}
================================================
FILE: app/src/main/java/io/horizontalsystems/bitcoinkit/demo/MainActivity.kt
================================================
package io.horizontalsystems.bitcoinkit.demo
import android.os.Bundle
import com.google.android.material.bottomnavigation.BottomNavigationView
import androidx.fragment.app.Fragment
import androidx.appcompat.app.AppCompatActivity
import android.view.MenuItem
import androidx.lifecycle.ViewModelProvider
class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemSelectedListener {
private val balanceFragment = BalanceFragment()
private val transactionsFragment = TransactionsFragment()
private val sendReceiveFragment = SendReceiveFragment()
private val fm = supportFragmentManager
private var active: Fragment = balanceFragment
lateinit var viewModel: MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val navigation = findViewById<BottomNavigationView>(R.id.navigation)
navigation.setOnNavigationItemSelectedListener(this)
fm.beginTransaction().add(R.id.fragment_container, sendReceiveFragment, "3").hide(sendReceiveFragment).commit()
fm.beginTransaction().add(R.id.fragment_container, transactionsFragment, "2").hide(transactionsFragment).commit()
fm.beginTransaction().add(R.id.fragment_container, balanceFragment, "1").commit()
viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
viewModel.init()
}
override fun onNavigationItemSelected(item: MenuItem): Boolean {
val fragment = when (item.itemId) {
R.id.navigation_home -> balanceFragment
R.id.navigation_transactions -> transactionsFragment
R.id.navigation_send_receive -> sendReceiveFragment
else -> null
}
if (fragment != null) {
supportFragmentManager
.beginTransaction()
.hide(active)
.show(fragment)
.commit()
active = fragment
return true
}
return false
}
}
================================================
FILE: app/src/main/java/io/horizontalsystems/bitcoinkit/demo/MainViewModel.kt
================================================
package io.horizontalsystems.bitcoinkit.demo
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import io.horizontalsystems.bitcoincore.BitcoinCore
import io.horizontalsystems.bitcoincore.BitcoinCore.KitState
import io.horizontalsystems.bitcoincore.core.IPluginData
import io.horizontalsystems.bitcoincore.exceptions.AddressFormatException
import io.horizontalsystems.bitcoincore.managers.SendValueErrors
import io.horizontalsystems.bitcoincore.models.BalanceInfo
import io.horizontalsystems.bitcoincore.models.BitcoinSendInfo
import io.horizontalsystems.bitcoincore.models.BlockInfo
import io.horizontalsystems.bitcoincore.models.TransactionDataSortType
import io.horizontalsystems.bitcoincore.models.TransactionFilterType
import io.horizontalsystems.bitcoincore.models.TransactionInfo
import io.horizontalsystems.bitcoincore.storage.UtxoFilters
import io.horizontalsystems.bitcoinkit.BitcoinKit
import io.horizontalsystems.hdwalletkit.HDWallet.Purpose
import io.horizontalsystems.hodler.HodlerData
import io.horizontalsystems.hodler.HodlerPlugin
import io.horizontalsystems.hodler.LockTimeInterval
import io.reactivex.disposables.CompositeDisposable
class MainViewModel : ViewModel(), BitcoinKit.Listener {
enum class State {
STARTED, STOPPED
}
private var transactionFilterType: TransactionFilterType? = null
val types = listOf(null) + TransactionFilterType.values()
val transactions = MutableLiveData<List<TransactionInfo>>()
val balance = MutableLiveData<BalanceInfo>()
val lastBlock = MutableLiveData<BlockInfo>()
val state = MutableLiveData<KitState>()
val status = MutableLiveData<State>()
val transactionRaw = MutableLiveData<String>()
val statusInfo = MutableLiveData<Map<String, Any>>()
lateinit var networkName: String
private val disposables = CompositeDisposable()
private var started = false
set(value) {
field = value
status.value = (if (value) State.STARTED else State.STOPPED)
}
private lateinit var bitcoinKit: BitcoinKit
private val walletId = "MyWallet"
private val networkType = BitcoinKit.NetworkType.MainNet
private val syncMode = BitcoinCore.SyncMode.Api()
private val purpose = Purpose.BIP44
fun init() {
//TODO create unique seed phrase,perhaps using shared preferences?
val words = "used ugly meat glad balance divorce inner artwork hire invest already piano".split(" ")
val passphrase = ""
bitcoinKit = BitcoinKit(App.instance, words, passphrase, walletId, networkType, syncMode = syncMode, purpose = purpose)
bitcoinKit.listener = this
networkName = bitcoinKit.networkName
balance.value = bitcoinKit.balance
lastBlock.value = bitcoinKit.lastBlockInfo
state.value = bitcoinKit.syncState
started = false
}
fun start() {
if (started) return
started = true
bitcoinKit.start()
}
fun clear() {
bitcoinKit.stop()
BitcoinKit.clear(App.instance, networkType, walletId)
init()
}
fun showDebugInfo() {
bitcoinKit.showDebugInfo()
}
fun showStatusInfo() {
statusInfo.postValue(bitcoinKit.statusInfo())
}
//
// BitcoinKit Listener implementations
//
override fun onTransactionsUpdate(inserted: List<TransactionInfo>, updated: List<TransactionInfo>) {
setTransactionFilterType(transactionFilterType)
}
override fun onTransactionsDelete(hashes: List<String>) {
}
override fun onBalanceUpdate(balance: BalanceInfo) {
this.balance.postValue(balance)
}
override fun onLastBlockInfoUpdate(blockInfo: BlockInfo) {
this.lastBlock.postValue(blockInfo)
}
override fun onKitStateUpdate(state: KitState) {
this.state.postValue(state)
}
val receiveAddressLiveData = MutableLiveData<String>()
val feeLiveData = MutableLiveData<Long>()
val errorLiveData = MutableLiveData<String>()
val addressLiveData = MutableLiveData<String>()
val amountLiveData = MutableLiveData<Long>()
var amount: Long? = null
set(value) {
field = value
updateFee()
}
var address: String? = null
set(value) {
field = value
updateFee()
}
var feePriority: FeePriority = FeePriority.Medium
set(value) {
field = value
updateFee()
}
var timeLockInterval: LockTimeInterval? = null
set(value) {
field = value
updateFee()
}
fun onReceiveClick() {
receiveAddressLiveData.value = bitcoinKit.receiveAddress()
}
fun onSendClick() {
when {
address.isNullOrBlank() -> {
errorLiveData.value = "Send address cannot be blank"
}
amount == null -> {
errorLiveData.value = "Send amount cannot be blank"
}
else -> {
try {
val transaction = bitcoinKit.send(
address!!,
null,
amount!!,
feeRate = feePriority.feeRate,
sortType = TransactionDataSortType.Shuffle,
pluginData = getPluginData(),
rbfEnabled = true,
changeToFirstInput = false,
filters = UtxoFilters()
)
amountLiveData.value = null
feeLiveData.value = null
addressLiveData.value = null
errorLiveData.value = "Transaction sent ${transaction.header.serializedTxInfo}"
} catch (e: Exception) {
errorLiveData.value = when (e) {
is SendValueErrors.InsufficientUnspentOutputs,
is SendValueErrors.EmptyOutputs -> "Insufficient balance"
is AddressFormatException -> "Could not Format Address"
else -> e.message ?: "Failed to send transaction (${e.javaClass.name})"
}
}
}
}
}
fun onMaxClick() {
try {
amountLiveData.value = bitcoinKit.maximumSpendableValue(
address,
null,
feePriority.feeRate,
null,
getPluginData(),
false,
UtxoFilters()
)
} catch (e: Exception) {
amountLiveData.value = 0
errorLiveData.value = when (e) {
is SendValueErrors.Dust,
is SendValueErrors.EmptyOutputs -> "You need at least ${e.message} satoshis to make an transaction"
is AddressFormatException -> "Could not Format Address"
else -> e.message ?: "Maximum could not be calculated"
}
}
}
private fun updateFee() {
try {
feeLiveData.value = amount?.let {
fee(it, address).fee
}
} catch (e: Exception) {
errorLiveData.value = e.message ?: e.javaClass.simpleName
}
}
private fun fee(value: Long, address: String? = null): BitcoinSendInfo {
return bitcoinKit.sendInfo(
value,
address,
null,
feeRate = feePriority.feeRate,
unspentOutputs = null,
pluginData = getPluginData(),
changeToFirstInput = false,
filters = UtxoFilters()
)
}
private fun getPluginData(): MutableMap<Byte, IPluginData> {
val pluginData = mutableMapOf<Byte, IPluginData>()
timeLockInterval?.let {
pluginData[HodlerPlugin.id] = HodlerData(it)
}
return pluginData
}
fun onRawTransactionClick(transactionHash: String) {
transactionRaw.postValue(bitcoinKit.getRawTransaction(transactionHash))
}
fun setTransactionFilterType(transactionFilterType: TransactionFilterType?) {
this.transactionFilterType = transactionFilterType
bitcoinKit.transactions(type = transactionFilterType).subscribe { txList: List<TransactionInfo> ->
transactions.postValue(txList)
}.let {
disposables.add(it)
}
}
}
================================================
FILE: app/src/main/java/io/horizontalsystems/bitcoinkit/demo/NumberFormatHelper.kt
================================================
package io.horizontalsystems.bitcoinkit.demo
import java.text.NumberFormat
object NumberFormatHelper {
val fiatAmountFormat: NumberFormat
get() {
val numberFormat = NumberFormat.getInstance()
numberFormat.maximumFractionDigits = 2
numberFormat.minimumFractionDigits = 2
return numberFormat
}
val cryptoAmountFormat: NumberFormat
get() {
val numberFormat = NumberFormat.getInstance()
numberFormat.maximumFractionDigits = 12
numberFormat.minimumFractionDigits = 2
return numberFormat
}
}
================================================
FILE: app/src/main/java/io/horizontalsystems/bitcoinkit/demo/SendReceiveFragment.kt
================================================
package io.horizontalsystems.bitcoinkit.demo
import android.os.Bundle
import android.text.Editable
import android.text.TextWatcher
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.Button
import android.widget.EditText
import android.widget.RadioGroup
import android.widget.Spinner
import android.widget.TextView
import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import io.horizontalsystems.hodler.LockTimeInterval
class SendReceiveFragment : Fragment() {
private lateinit var viewModel: MainViewModel
lateinit var receiveAddressText: TextView
lateinit var receiveAddressButton: Button
lateinit var sendAmount: EditText
lateinit var sendAddress: EditText
lateinit var txFeeValue: TextView
lateinit var sendButton: Button
lateinit var maxButton: Button
lateinit var radioGroup: RadioGroup
lateinit var lockTimePeriodValue: Spinner
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_send_receive, container, false)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel = activity?.let { ViewModelProvider(it).get(MainViewModel::class.java) } ?: return
viewModel.receiveAddressLiveData.observe(viewLifecycleOwner, Observer {
receiveAddressText.text = it
})
viewModel.amountLiveData.observe(viewLifecycleOwner, Observer {
sendAmount.setText(it?.toString())
})
viewModel.addressLiveData.observe(viewLifecycleOwner, Observer {
sendAddress.setText(it)
})
viewModel.feeLiveData.observe(viewLifecycleOwner, Observer {
txFeeValue.text = it?.toString()
})
viewModel.errorLiveData.observe(viewLifecycleOwner, Observer {
//TODO TOASTS NO PREVIOUS OUTPUT SCRIPT CHANGE THE SEED?
val toast = Toast.makeText(context, "$it", Toast.LENGTH_LONG)
toast.setGravity(Gravity.CENTER, 0, 0)
toast.show()
})
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
receiveAddressText = view.findViewById(R.id.receiveAddressText)
receiveAddressButton = view.findViewById(R.id.receiveAddressButton)
sendAmount = view.findViewById(R.id.sendAmount)
sendAddress = view.findViewById(R.id.sendAddress)
txFeeValue = view.findViewById(R.id.txFeeValue)
sendButton = view.findViewById(R.id.sendButton)
maxButton = view.findViewById(R.id.maxButton)
radioGroup = view.findViewById(R.id.radioGroup)
lockTimePeriodValue = view.findViewById(R.id.lockTimePeriodValue)
receiveAddressButton.setOnClickListener {
viewModel.onReceiveClick()
}
sendButton.setOnClickListener {
viewModel.onSendClick()
}
maxButton.setOnClickListener {
viewModel.onMaxClick()
}
sendAmount.addTextChangedListener(SimpleTextWatcher {
viewModel.amount = try {
sendAmount.text?.toString()?.toLong()
} catch (e: NumberFormatException) {
null
}
})
sendAddress.addTextChangedListener(SimpleTextWatcher {
viewModel.address = sendAddress.text.toString()
})
radioGroup.setOnCheckedChangeListener { _, checkedId ->
val feePriority = when (checkedId) {
R.id.radioLow -> FeePriority.Low
R.id.radioMedium -> FeePriority.Medium
R.id.radioHigh -> FeePriority.High
else -> throw Exception("Undefined priority")
}
viewModel.feePriority = feePriority
}
lockTimePeriodValue.adapter = ArrayAdapter(view.context, android.R.layout.simple_spinner_dropdown_item, LockTimeIntervalOption.getIntervals())
lockTimePeriodValue.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onNothingSelected(parent: AdapterView<*>?) = Unit
override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
viewModel.timeLockInterval = (parent?.getItemAtPosition(position) as LockTimeIntervalOption).interval
}
}
}
}
class LockTimeIntervalOption(val interval: LockTimeInterval? = null) {
override fun toString(): String {
return interval?.name ?: "OFF"
}
companion object {
fun getIntervals(): Array<LockTimeIntervalOption> {
return arrayOf(LockTimeIntervalOption()) + LockTimeInterval.values().map { LockTimeIntervalOption(it) }
}
}
}
class SimpleTextWatcher(private val callback: (s: Editable?) -> Unit) : TextWatcher {
override fun afterTextChanged(s: Editable?) {
callback.invoke(s)
}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) = Unit
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) = Unit
}
================================================
FILE: app/src/main/java/io/horizontalsystems/bitcoinkit/demo/TransactionsFragment.kt
================================================
package io.horizontalsystems.bitcoinkit.demo
import android.annotation.SuppressLint
import android.graphics.Color
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.TextView
import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.tabs.TabLayout
import io.horizontalsystems.bitcoincore.models.TransactionInfo
import io.horizontalsystems.bitcoincore.models.TransactionInputInfo
import io.horizontalsystems.bitcoincore.models.TransactionOutputInfo
import io.horizontalsystems.dashkit.models.DashTransactionInfo
import io.horizontalsystems.hodler.HodlerOutputData
import io.horizontalsystems.hodler.HodlerPlugin
import java.text.DateFormat
import java.util.Date
import java.util.Locale
class TransactionsFragment : Fragment(), ViewHolderTransaction.Listener {
private lateinit var viewModel: MainViewModel
private lateinit var transactionsRecyclerView: RecyclerView
private val transactionsAdapter = TransactionsAdapter(this)
lateinit var tabs: TabLayout
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel = activity?.let { ViewModelProvider(it).get(MainViewModel::class.java) } ?: return
viewModel.transactions.observe(this, Observer {
it?.let { transactions ->
transactionsAdapter.items = transactions
transactionsAdapter.notifyDataSetChanged()
}
})
viewModel.transactionRaw.observe(this, Observer { transactionHex ->
activity?.let {
val dialog = AlertDialog.Builder(it)
.setMessage(transactionHex)
.setTitle("Transaction HEX")
.create()
dialog.show()
}
})
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_transactions, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
tabs = view.findViewById(R.id.tabs)
transactionsRecyclerView = view.findViewById(R.id.transactions)
transactionsRecyclerView.adapter = transactionsAdapter
transactionsRecyclerView.layoutManager = LinearLayoutManager(context)
viewModel.types.forEach {
val text = tabs.newTab()
.setText(it?.name ?: "All")
.setId(it?.ordinal ?: 100)
tabs.addTab(text)
}
tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab) {
viewModel.setTransactionFilterType(viewModel.types.find {
it?.ordinal == tab.id
})
}
override fun onTabUnselected(tab: TabLayout.Tab?) = Unit
override fun onTabReselected(tab: TabLayout.Tab?) = Unit
})
viewModel.setTransactionFilterType(null)
}
override fun onClickRawTransaction(transactionHash: String) {
viewModel.onRawTransactionClick(transactionHash)
}
}
class TransactionsAdapter(private val listener: ViewHolderTransaction.Listener) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
var items = listOf<TransactionInfo>()
override fun getItemCount() = items.size
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder =
ViewHolderTransaction(LayoutInflater.from(parent.context).inflate(R.layout.view_holder_transaction, parent, false), listener)
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (holder) {
is ViewHolderTransaction -> holder.bind(items[position], itemCount - position)
}
}
}
class ViewHolderTransaction(val containerView: View, private val listener: Listener) : RecyclerView.ViewHolder(containerView) {
interface Listener {
fun onClickRawTransaction(transactionHash: String)
}
private val summary = containerView.findViewById<TextView>(R.id.summary)!!
private val buttonRaw = containerView.findViewById<Button>(R.id.buttonRaw)!!
@SuppressLint("SetTextI18n")
fun bind(transactionInfo: TransactionInfo, index: Int) {
buttonRaw.setOnClickListener {
listener.onClickRawTransaction(transactionInfo.transactionHash)
}
containerView.setBackgroundColor(if (index % 2 == 0) Color.parseColor("#dddddd") else Color.TRANSPARENT)
val txAmount = transactionInfo.amount
val amount = NumberFormatHelper.cryptoAmountFormat.format(txAmount / 100_000_000.0)
val fee = transactionInfo.fee?.let {
NumberFormatHelper.cryptoAmountFormat.format(it / 100_000_000.0)
} ?: "n/a"
var text = "#$index"
text += "\nStatus: ${transactionInfo.status.name}, ${transactionInfo.type.name}"
if (transactionInfo is DashTransactionInfo) {
text += "\nInstant: ${transactionInfo.instantTx.toString().toUpperCase(Locale.getDefault())}"
}
text += "\nInputs: ${mapInputs(transactionInfo.inputs)}" +
"\nOutputs: ${mapOutputs(transactionInfo.outputs)}" +
"\nAmount: $amount" +
"\nFee: $fee" +
"\nTx hash: ${transactionInfo.transactionHash}" +
"\nTx index: ${transactionInfo.transactionIndex}" +
"\nBlock: ${transactionInfo.blockHeight}" +
"\nTimestamp: ${transactionInfo.timestamp}" +
"\nDate: ${formatDate(transactionInfo.timestamp)}" +
"\nConflicting tx hash: ${transactionInfo.conflictingTxHash}"
summary.text = text
summary.setOnClickListener {
println(transactionInfo)
println(text)
}
}
private fun mapOutputs(list: List<TransactionOutputInfo>): String {
return list.joinToString("") {
val sb = StringBuilder()
sb.append("\n- address: ${it.address}")
sb.append("\n value: ${it.value}")
sb.append("\n mine: ${it.mine}")
sb.append("\n change: ${it.changeOutput}")
sb.append("\n memo: ${it.memo}")
if (it.pluginId == HodlerPlugin.id && it.pluginData != null) {
(it.pluginData as? HodlerOutputData)?.let { hodlerData ->
val lockTimeInterval = hodlerData.lockTimeInterval
hodlerData.approxUnlockTime?.let { lockedUntilApprox ->
sb.append("\n * Locked: ${lockTimeInterval.name}, approx until ${formatDate(lockedUntilApprox)}")
}
sb.append("\n * Address: ${hodlerData.addressString}")
sb.append("\n * Value: ${it.value}")
}
}
sb.toString()
}
}
private fun mapInputs(list: List<TransactionInputInfo>): String {
return list.joinToString("") {
val sb = StringBuilder()
sb.append("\n- address: ${it.address}")
sb.append("\n value: ${it.value}")
sb.append("\n mine: ${it.mine}")
sb.toString()
}
}
private fun formatDate(timestamp: Long): String {
return DateFormat.getInstance().format(Date(timestamp * 1000))
}
}
================================================
FILE: app/src/main/res/drawable/ic_launcher_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportHeight="108"
android:viewportWidth="108">
<path
android:fillColor="#26A69A"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
</vector>
================================================
FILE: app/src/main/res/drawable-v24/ic_launcher_foreground.xml
================================================
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportHeight="108"
android:viewportWidth="108">
<path
android:fillType="evenOdd"
android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z"
android:strokeColor="#00000000"
android:strokeWidth="1">
<aapt:attr name="android:fillColor">
<gradient
android:endX="78.5885"
android:endY="90.9159"
android:startX="48.7653"
android:startY="61.0927"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z"
android:strokeColor="#00000000"
android:strokeWidth="1" />
</vector>
================================================
FILE: app/src/main/res/layout/activity_main.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/container"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="56dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
/>
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/navigation"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:background="@android:color/white"
app:menu="@menu/navigation"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
================================================
FILE: app/src/main/res/layout/fragment_balance.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
android:padding="8dp">
<TextView
android:id="@+id/networkTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Network:"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/networkName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
app:layout_constraintStart_toEndOf="@+id/networkTitle"
app:layout_constraintTop_toTopOf="parent"
tools:text="Testnet" />
<TextView
android:id="@+id/balanceTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="Balance:"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/networkTitle" />
<TextView
android:id="@+id/balanceValue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
app:layout_constraintStart_toEndOf="@+id/balanceTitle"
app:layout_constraintTop_toTopOf="@+id/balanceTitle"
tools:text="100.0" />
<TextView
android:id="@+id/balanceUnspendableTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="Balance Unspendable:"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/balanceTitle" />
<TextView
android:id="@+id/balanceUnspendableValue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
app:layout_constraintStart_toEndOf="@+id/balanceUnspendableTitle"
app:layout_constraintTop_toTopOf="@+id/balanceUnspendableTitle"
tools:text="100.0" />
<TextView
android:id="@+id/stateTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="State:"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/balanceUnspendableTitle" />
<TextView
android:id="@+id/stateValue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
app:layout_constraintStart_toEndOf="@+id/stateTitle"
app:layout_constraintTop_toTopOf="@+id/stateTitle"
tools:text="syncing" />
<TextView
android:id="@+id/lastBlockTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="Last Block:"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/stateTitle" />
<TextView
android:id="@+id/lastBlockValue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
app:layout_constraintStart_toEndOf="@+id/lastBlockTitle"
app:layout_constraintTop_toTopOf="@+id/lastBlockTitle"
tools:text="123000" />
<TextView
android:id="@+id/lastBlockDateTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="Until:"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/lastBlockTitle" />
<TextView
android:id="@+id/lastBlockDateValue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
app:layout_constraintStart_toEndOf="@+id/lastBlockDateTitle"
app:layout_constraintTop_toTopOf="@+id/lastBlockDateTitle"
tools:text="2019-01-01 12:12:12" />
<Button
android:id="@+id/buttonStart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:text="Start"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/lastBlockDateTitle" />
<Button
android:id="@+id/buttonDebug"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:layout_marginEnd="28dp"
android:text="Debug info"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/lastBlockDateTitle" />
<Button
android:id="@+id/buttonClear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:text="Clear"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/buttonStart" />
<Button
android:id="@+id/buttonStatus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:text="Status"
app:layout_constraintEnd_toEndOf="@+id/buttonDebug"
app:layout_constraintTop_toBottomOf="@+id/buttonDebug" />
</androidx.constraintlayout.widget.ConstraintLayout>
================================================
FILE: app/src/main/res/layout/fragment_send_receive.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
android:scrollbars="vertical">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="8dp">
<TextView
android:id="@+id/receiveAddressText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:scrollbarAlwaysDrawHorizontalTrack="true"
android:text="Click the button below to get address"
android:textIsSelectable="true"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/receiveAddressButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="36dp"
android:layout_marginEnd="20dp"
android:text="Receive"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<View
android:id="@+id/divider"
android:layout_width="368dp"
android:layout_height="1dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:background="?android:attr/listDivider"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/receiveAddressButton" />
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/sendAddressLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/divider">
<EditText
android:id="@+id/sendAddress"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Address"
android:inputType="text" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/sendAmountLayout"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
app:layout_constraintEnd_toStartOf="@+id/maxButton"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/sendAddressLayout">
<EditText
android:id="@+id/sendAmount"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:hint="Amount (Satoshi)"
android:inputType="numberDecimal" />
</com.google.android.material.textfield.TextInputLayout>
<Button
android:id="@+id/maxButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:text="Max Available"
app:layout_constraintBottom_toBottomOf="@+id/sendAmountLayout"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/sendAmountLayout"
app:layout_constraintTop_toTopOf="@+id/sendAmountLayout" />
<TextView
android:id="@+id/txFeeTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="10dp"
android:text="Fee (Satoshi):"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/maxButton" />
<TextView
android:id="@+id/txFeeValue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
app:layout_constraintStart_toEndOf="@+id/txFeeTitle"
app:layout_constraintTop_toTopOf="@+id/txFeeTitle"
tools:text="328" />
<TextView
android:id="@+id/feePriorityTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="16dp"
android:text="Fee priority:"
app:layout_constraintEnd_toStartOf="@+id/radioGroup"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/txFeeTitle" />
<RadioGroup
android:id="@+id/radioGroup"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="@+id/feePriorityTitle"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/feePriorityTitle"
app:layout_constraintTop_toTopOf="@+id/feePriorityTitle">
<RadioButton
android:id="@+id/radioLow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Low" />
<RadioButton
android:id="@+id/radioMedium"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:checked="true"
android:text="Meduim" />
<RadioButton
android:id="@+id/radioHigh"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="High" />
</RadioGroup>
<TextView
android:id="@+id/lockTimeIntervalTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="24dp"
android:text="Lock for period"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/feePriorityTitle" />
<Spinner
android:id="@+id/lockTimePeriodValue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
app:layout_constraintBottom_toBottomOf="@+id/lockTimeIntervalTitle"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/lockTimeIntervalTitle" />
<Button
android:id="@+id/sendButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="24dp"
android:layout_marginEnd="8dp"
android:text="Send"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/lockTimePeriodValue" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.core.widget.NestedScrollView>
================================================
FILE: app/src/main/res/layout/fragment_transactions.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@android:color/white"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabs"
app:tabMode="auto"
android:layout_width="wrap_content"
android:layout_height="0dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/transactions"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tabs" />
</androidx.constraintlayout.widget.ConstraintLayout>
================================================
FILE: app/src/main/res/layout/view_holder_transaction.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp">
<TextView
android:id="@+id/summary"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:textIsSelectable="true"
tools:text="Summary"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/buttonRaw"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Raw"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/summary"
style="@style/Widget.MaterialComponents.Button.TextButton"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
================================================
FILE: app/src/main/res/menu/navigation.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/navigation_home"
android:title="Balance" />
<item
android:id="@+id/navigation_transactions"
android:title="Transactions" />
<item
android:id="@+id/navigation_send_receive"
android:title="Send/Receive" />
</menu>
================================================
FILE: app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>
================================================
FILE: app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>
================================================
FILE: app/src/main/res/values/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
</resources>
================================================
FILE: app/src/main/res/values/strings.xml
================================================
<resources>
<string name="app_name">BitcoinKit</string>
</resources>
================================================
FILE: app/src/main/res/values/styles.xml
================================================
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.MaterialComponents.Light.DarkActionBar">
</style>
</resources>
================================================
FILE: bitcoincashkit/.gitignore
================================================
/build
================================================
FILE: bitcoincashkit/build.gradle
================================================
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-kapt'
id 'maven-publish'
}
afterEvaluate {
publishing {
publications {
release(MavenPublication) {
from components.release
}
}
}
}
android {
namespace 'io.horizontalsystems.bitcoincashkit'
compileSdk 34
defaultConfig {
minSdkVersion 23
targetSdkVersion 34
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
test.java.srcDirs += 'src/test/kotlin'
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions { jvmTarget = '17' }
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
implementation 'androidx.annotation:annotation:1.1.0'
// Room
implementation 'androidx.room:room-runtime:2.5.0'
implementation 'androidx.room:room-rxjava2:2.5.0'
kapt 'androidx.room:room-compiler:2.5.0'
api project(':bitcoincore')
// Test helpers
testImplementation 'junit:junit:4.13.2'
testImplementation 'org.junit.jupiter:junit-jupiter:5.6.1'
testImplementation 'org.mockito:mockito-core:3.3.3'
testImplementation 'com.nhaarman:mockito-kotlin-kt1.1:1.6.0'
testImplementation 'org.powermock:powermock-api-mockito2:2.0.7'
testImplementation 'org.powermock:powermock-module-junit4:2.0.7'
// Spek
testImplementation "org.spekframework.spek2:spek-dsl-jvm:2.0.9"
testRuntimeOnly "org.spekframework.spek2:spek-runner-junit5:2.0.9"
testRuntimeOnly "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
// Android Instrumentation Test
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'com.linkedin.dexmaker:dexmaker-mockito-inline:2.28.3'
androidTestImplementation 'com.nhaarman:mockito-kotlin-kt1.1:1.6.0'
}
================================================
FILE: bitcoincashkit/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
================================================
FILE: bitcoincashkit/src/main/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android" />
================================================
FILE: bitcoincashkit/src/main/kotlin/io/horizontalsystems/bitcoincash/BitcoinCashKit.kt
================================================
package io.horizontalsystems.bitcoincash
import android.content.Context
import android.database.sqlite.SQLiteDatabase
import io.horizontalsystems.bitcoincash.blocks.BitcoinCashBlockValidatorHelper
import io.horizontalsystems.bitcoincash.blocks.validators.AsertValidator
import io.horizontalsystems.bitcoincash.blocks.validators.DAAValidator
import io.horizontalsystems.bitcoincash.blocks.validators.EDAValidator
import io.horizontalsystems.bitcoincash.blocks.validators.ForkValidator
import io.horizontalsystems.bitcoincore.AbstractKit
import io.horizontalsystems.bitcoincore.BitcoinCore
import io.horizontalsystems.bitcoincore.BitcoinCore.SyncMode
import io.horizontalsystems.bitcoincore.BitcoinCoreBuilder
import io.horizontalsystems.bitcoincore.apisync.BlockchainComApi
import io.horizontalsystems.bitcoincore.apisync.HsBlockHashFetcher
import io.horizontalsystems.bitcoincore.apisync.blockchair.BlockchairApi
import io.horizontalsystems.bitcoincore.apisync.blockchair.BlockchairBlockHashFetcher
import io.horizontalsystems.bitcoincore.apisync.blockchair.BlockchairTransactionProvider
import io.horizontalsystems.bitcoincore.blocks.BlockMedianTimeHelper
import io.horizontalsystems.bitcoincore.blocks.validators.BlockValidatorChain
import io.horizontalsystems.bitcoincore.blocks.validators.BlockValidatorSet
import io.horizontalsystems.bitcoincore.blocks.validators.LegacyDifficultyAdjustmentValidator
import io.horizontalsystems.bitcoincore.blocks.validators.ProofOfWorkValidator
import io.horizontalsystems.bitcoincore.core.IApiTransactionProvider
import io.horizontalsystems.bitcoincore.extensions.toReversedByteArray
import io.horizontalsystems.bitcoincore.managers.ApiSyncStateManager
import io.horizontalsystems.bitcoincore.managers.Bip44RestoreKeyConverter
import io.horizontalsystems.bitcoincore.managers.BlockchairCashRestoreKeyConverter
import io.horizontalsystems.bitcoincore.models.Address
import io.horizontalsystems.bitcoincore.models.Checkpoint
import io.horizontalsystems.bitcoincore.models.WatchAddressPublicKey
import io.horizontalsystems.bitcoincore.network.Network
import io.horizontalsystems.bitcoincore.storage.CoreDatabase
import io.horizontalsystems.bitcoincore.storage.Storage
import io.horizontalsystems.bitcoincore.utils.AddressConverterChain
import io.horizontalsystems.bitcoincore.utils.Base58AddressConverter
import io.horizontalsystems.bitcoincore.utils.CashAddressConverter
import io.horizontalsystems.bitcoincore.utils.PaymentAddressParser
import io.horizontalsystems.hdwalletkit.HDExtendedKey
import io.horizontalsystems.hdwalletkit.HDWallet.Purpose
import io.horizontalsystems.hdwalletkit.Mnemonic
class BitcoinCashKit : AbstractKit {
sealed class NetworkType {
class MainNet(val coinType: MainNetBitcoinCash.CoinType) : NetworkType()
object TestNet : NetworkType()
val description: String
get() = when (this) {
is MainNet -> {
when (coinType) {
MainNetBitcoinCash.CoinType.Type0 -> "mainNet" // back compatibility for database file name in old NetworkType
MainNetBitcoinCash.CoinType.Type145 -> "mainNet-145"
}
}
is TestNet -> "testNet"
}
}
interface Listener : BitcoinCore.Listener
override var bitcoinCore: BitcoinCore
override var network: Network
var listener: Listener? = null
set(value) {
field = value
bitcoinCore.listener = value
}
constructor(
context: Context,
words: List<String>,
passphrase: String,
walletId: String,
networkType: NetworkType = defaultNetworkType,
peerSize: Int = defaultPeerSize,
syncMode: SyncMode = defaultSyncMode,
confirmationsThreshold: Int = defaultConfirmationsThreshold
) : this(context, Mnemonic().toSeed(words, passphrase), walletId, networkType, peerSize, syncMode, confirmationsThreshold)
constructor(
context: Context,
seed: ByteArray,
walletId: String,
networkType: NetworkType = defaultNetworkType,
peerSize: Int = defaultPeerSize,
syncMode: SyncMode = defaultSyncMode,
confirmationsThreshold: Int = defaultConfirmationsThreshold
) : this(context, HDExtendedKey(seed, Purpose.BIP44), walletId, networkType, peerSize, syncMode, confirmationsThreshold)
/**
* @constructor Creates and initializes the BitcoinKit
* @param context The Android context
* @param extendedKey HDExtendedKey that contains HDKey and version
* @param walletId an arbitrary ID of type String.
* @param networkType The network type. The default is MainNet.
* @param peerSize The # of peer-nodes required. The default is 10 peers.
* @param syncMode How the kit syncs with the blockchain. The default is SyncMode.Api().
* @param confirmationsThreshold How many confirmations required to be considered confirmed. The default is 6 confirmations.
*/
constructor(
context: Context,
extendedKey: HDExtendedKey,
walletId: String,
networkType: NetworkType = defaultNetworkType,
peerSize: Int = defaultPeerSize,
syncMode: SyncMode = defaultSyncMode,
confirmationsThreshold: Int = defaultConfirmationsThreshold
) {
network = network(networkType)
bitcoinCore = bitcoinCore(
context = context,
extendedKey = extendedKey,
watchAddressPublicKey = null,
networkType = networkType,
network = network,
walletId = walletId,
syncMode = syncMode,
peerSize = peerSize,
confirmationsThreshold = confirmationsThreshold
)
}
/**
* @constructor Creates and initializes the BitcoinKit
* @param context The Android context
* @param watchAddress address for watching in read-only mode
* @param walletId an arbitrary ID of type String.
* @param networkType The network type. The default is MainNet.
* @param peerSize The # of peer-nodes required. The default is 10 peers.
* @param syncMode How the kit syncs with the blockchain. The default is SyncMode.Api().
* @param confirmationsThreshold How many confirmations required to be considered confirmed. The default is 6 confirmations.
*/
constructor(
context: Context,
watchAddress: String,
walletId: String,
networkType: NetworkType = defaultNetworkType,
peerSize: Int = defaultPeerSize,
syncMode: SyncMode = defaultSyncMode,
confirmationsThreshold: Int = defaultConfirmationsThreshold
) {
network = network(networkType)
val address = parseAddress(watchAddress, network)
val watchAddressPublicKey = WatchAddressPublicKey(address.lockingScriptPayload, address.scriptType)
bitcoinCore = bitcoinCore(
context = context,
extendedKey = null,
watchAddressPublicKey = watchAddressPublicKey,
networkType = networkType,
network = network,
walletId = walletId,
syncMode = syncMode,
peerSize = peerSize,
confirmationsThreshold = confirmationsThreshold
)
}
private fun bitcoinCore(
context: Context,
extendedKey: HDExtendedKey?,
watchAddressPublicKey: WatchAddressPublicKey?,
networkType: NetworkType,
network: Network,
walletId: String,
syncMode: SyncMode,
peerSize: Int,
confirmationsThreshold: Int
): BitcoinCore {
val database = CoreDatabase.getInstance(context, getDatabaseName(networkType, walletId, syncMode))
val storage = Storage(database)
val checkpoint = Checkpoint.resolveCheckpoint(syncMode, network, storage)
val apiSyncStateManager = ApiSyncStateManager(storage, network.syncableFromApi && syncMode !is SyncMode.Full)
val apiTransactionProvider = apiTransactionProvider(networkType, syncMode)
val paymentAddressParser = PaymentAddressParser("bitcoincash", removeScheme = false)
val blockValidatorSet = blockValidatorSet(networkType, storage)
val bitcoinCore = BitcoinCoreBuilder()
.setContext(context)
.setExtendedKey(extendedKey)
.setWatchAddressPublicKey(watchAddressPublicKey)
.setPurpose(Purpose.BIP44)
.setNetwork(network)
.setCheckpoint(checkpoint)
.setPaymentAddressParser(paymentAddressParser)
.setPeerSize(peerSize)
.setSyncMode(syncMode)
.setConfirmationThreshold(confirmationsThreshold)
.setStorage(storage)
.setApiTransactionProvider(apiTransactionProvider)
.setApiSyncStateManager(apiSyncStateManager)
.setBlockValidator(blockValidatorSet)
.build()
// extending bitcoinCore
val bech32 = CashAddressConverter(network.addressSegwitHrp)
bitcoinCore.prependAddressConverter(bech32)
val restoreKeyConverter = if (syncMode is SyncMode.Blockchair) {
BlockchairCashRestoreKeyConverter(bech32)
} else {
val base58 = Base58AddressConverter(network.addressVersion, network.addressScriptVersion)
Bip44RestoreKeyConverter(base58)
}
bitcoinCore.addRestoreKeyConverter(restoreKeyConverter)
return bitcoinCore
}
private fun parseAddress(address: String, network: Network): Address {
val addressConverter = AddressConverterChain().apply {
prependConverter(CashAddressConverter(network.addressSegwitHrp))
prependConverter(Base58AddressConverter(network.addressVersion, network.addressScriptVersion))
}
return addressConverter.convert(address)
}
private fun blockValidatorSet(
networkType: NetworkType,
storage: Storage
): BlockValidatorSet {
val blockValidatorSet = BlockValidatorSet()
blockValidatorSet.addBlockValidator(ProofOfWorkValidator())
val blockValidatorChain = BlockValidatorChain()
if (networkType is NetworkType.MainNet) {
val blockHelper = BitcoinCashBlockValidatorHelper(storage)
val daaValidator = DAAValidator(targetSpacing, blockHelper)
val asertValidator = AsertValidator()
blockValidatorChain.add(ForkValidator(bchnChainForkHeight, bchnChainForkBlockHash, asertValidator))
blockValidatorChain.add(asertValidator)
blockValidatorChain.add(ForkValidator(svForkHeight, abcForkBlockHash, daaValidator))
blockValidatorChain.add(daaValidator)
blockValidatorChain.add(LegacyDifficultyAdjustmentValidator(blockHelper, heightInterval, targetTimespan, maxTargetBits))
blockValidatorChain.add(EDAValidator(maxTargetBits, blockHelper, BlockMedianTimeHelper(storage)))
}
blockValidatorSet.addBlockValidator(blockValidatorChain)
return blockValidatorSet
}
private fun apiTransactionProvider(
networkType: NetworkType,
syncMode: SyncMode
): IApiTransactionProvider {
val blockchairApi = BlockchairApi(network.blockchairChainId)
val blockchairBlockHashFetcher = BlockchairBlockHashFetcher(blockchairApi)
return when (networkType) {
is NetworkType.MainNet -> {
if (syncMode is SyncMode.Blockchair) {
BlockchairTransactionProvider(blockchairApi, blockchairBlockHashFetcher)
} else {
BlockchainComApi("https://api.haskoin.com/bch/blockchain", blockchairBlockHashFetcher)
}
}
NetworkType.TestNet -> {
BlockchainComApi(
transactionApiUrl = "https://api.haskoin.com/bchtest/blockchain",
blockHashFetcher = HsBlockHashFetcher("https://api.blocksdecoded.com/v1/blockchains/bitcoin-cash")
)
}
}
}
companion object {
const val maxTargetBits: Long = 0x1d00ffff // Maximum difficulty
const val targetSpacing = 10 * 60 // 10 minutes per block.
const val targetTimespan: Long = 14 * 24 * 60 * 60 // 2 weeks per difficulty cycle, on average.
var heightInterval = targetTimespan / targetSpacing // 2016 blocks
const val svForkHeight = 556767 // 2018 November 14
const val bchnChainForkHeight = 661648 // 2020 November 15, 14:13 GMT
val abcForkBlockHash = "0000000000000000004626ff6e3b936941d341c5932ece4357eeccac44e6d56c".toReversedByteArray()
val bchnChainForkBlockHash = "0000000000000000029e471c41818d24b8b74c911071c4ef0b4a0509f9b5a8ce".toReversedByteArray()
val defaultNetworkType: NetworkType = NetworkType.MainNet(MainNetBitcoinCash.CoinType.Type145)
val defaultSyncMode: SyncMode = SyncMode.Api()
const val defaultPeerSize: Int = 10
const val defaultConfirmationsThreshold: Int = 6
private fun getDatabaseName(networkType: NetworkType, walletId: String, syncMode: SyncMode): String =
"BitcoinCash-${networkType.description}-$walletId-${syncMode.javaClass.simpleName}"
fun clear(context: Context, networkType: NetworkType, walletId: String) {
for (syncMode in listOf(SyncMode.Api(), SyncMode.Full(), SyncMode.Blockchair())) {
try {
SQLiteDatabase.deleteDatabase(context.getDatabasePath(getDatabaseName(networkType, walletId, syncMode)))
} catch (ex: Exception) {
continue
}
}
}
private fun network(networkType: NetworkType) = when (networkType) {
is NetworkType.MainNet -> MainNetBitcoinCash(networkType.coinType)
NetworkType.TestNet -> TestNetBitcoinCash()
}
private fun addressConverter(network: Network): AddressConverterChain {
val addressConverter = AddressConverterChain()
val bech32 = CashAddressConverter(network.addressSegwitHrp)
addressConverter.prependConverter(bech32)
return addressConverter
}
fun firstAddress(
seed: ByteArray,
networkType: NetworkType,
): Address {
return BitcoinCore.firstAddress(
seed,
Purpose.BIP44,
network(networkType),
addressConverter(network(networkType))
)
}
fun firstAddress(
extendedKey: HDExtendedKey,
networkType: NetworkType,
): Address {
return BitcoinCore.firstAddress(
extendedKey,
Purpose.BIP44,
network(networkType),
addressConverter(network(networkType))
)
}
}
}
================================================
FILE: bitcoincashkit/src/main/kotlin/io/horizontalsystems/bitcoincash/MainNetBitcoinCash.kt
================================================
package io.horizontalsystems.bitcoincash
import io.horizontalsystems.bitcoincore.network.Network
import io.horizontalsystems.bitcoincore.transactions.scripts.Sighash
import kotlin.experimental.or
class MainNetBitcoinCash(coinType: CoinType = CoinType.Type145) : Network() {
override var port: Int = 8333
override var magic: Long = 0xe8f3e1e3L
override var bip32HeaderPub: Int = 0x0488b21e
override var bip32HeaderPriv: Int = 0x0488ade4
override var addressVersion: Int = 0
override var addressSegwitHrp: String = "bitcoincash"
override var addressScriptVersion: Int = 5
override var coinType: Int = coinType.value
override val blockchairChainId: String = "bitcoin-cash"
override val maxBlockSize = 32 * 1024 * 1024
override val dustRelayTxFee = 1000 // https://github.com/Bitcoin-ABC/bitcoin-abc/blob/master/src/policy/policy.h#L78
override val sigHashForked = true
override val sigHashValue = Sighash.FORKID or Sighash.ALL
override var dnsSeeds = listOf(
"seed.bch.loping.net", // Loping.net Seeder
"bch.bitjson.com", // Bitjson (Jason Dreyzehner)
"bchseed.c3-soft.com", // c3-soft
"seed.flowee.cash", // Flowee The Hub
"btccash-seeder.bitcoinunlimited.info" // Bitcoin Unlimited
)
enum class CoinType(val value: Int) {
Type0(0),
Type145(145)
}
}
================================================
FILE: bitcoincashkit/src/main/kotlin/io/horizontalsystems/bitcoincash/TestNetBitcoinCash.kt
================================================
package io.horizontalsystems.bitcoincash
import io.horizontalsystems.bitcoincore.network.Network
import io.horizontalsystems.bitcoincore.transactions.scripts.Sighash
import kotlin.experimental.or
class TestNetBitcoinCash : Network() {
override var port: Int = 18333
override var magic: Long = 0xf4f3e5f4
override var bip32HeaderPub: Int = 0x043587cf
override var bip32HeaderPriv: Int = 0x04358394
override var addressVersion: Int = 111
override var addressSegwitHrp: String = "bchtest"
override var addressScriptVersion: Int = 196
override var coinType: Int = 1
override val blockchairChainId: String = ""
override val maxBlockSize = 32 * 1024 * 1024
override val dustRelayTxFee = 1000 // https://github.com/Bitcoin-ABC/bitcoin-abc/blob/master/src/policy/policy.h#L78
override val sigHashForked = true
override val sigHashValue = Sighash.FORKID or Sighash.ALL
override var dnsSeeds = listOf(
"testnet-seed.bitcoinabc.org", // Bitcoin ABC seeder
"testnet-seed-abc.bitcoinforks.org", // bitcoinforks seeders
"testnet-seed.bitprim.org", // Bitprim
"testnet-seed.deadalnix.me", // Amaury SÉCHET
"testnet-seeder.criptolayer.net" // criptolayer.net
)
}
================================================
FILE: bitcoincashkit/src/main/kotlin/io/horizontalsystems/bitcoincash/blocks/AsertAlgorithm.java
================================================
package io.horizontalsystems.bitcoincash.blocks;
import java.math.BigInteger;
public class AsertAlgorithm {
public static final BigInteger TARGET_SPACING_BIGINT = BigInteger.valueOf(10L * 60L); // 10 minutes per block.
public static final int MAX_BITS = 0x1d00ffff;
public static final String MAX_BITS_STRING = "1d00ffff";
public static final BigInteger MAX_TARGET = Utils.decodeCompactBits(MAX_BITS);
/**
* Compute aserti-2d DAA target
*/
public static BigInteger computeAsertTarget(BigInteger refTarget, BigInteger referenceBlockAncestorTime, BigInteger referenceBlockHeight,
BigInteger evalBlockTime, BigInteger evalBlockHeight) {
Utils.checkState(evalBlockHeight.compareTo(referenceBlockHeight) >= 0, "");
BigInteger heightDiff = evalBlockHeight.subtract(referenceBlockHeight);
//referenceBlockAncestorTime is the timestamp of the ancestor of the anchor block
BigInteger timeDiff = evalBlockTime.subtract(referenceBlockAncestorTime);
//used by asert. two days in seconds.
BigInteger halfLife = BigInteger.valueOf(2L * 24L * 60L * 60L);
BigInteger rbits = BigInteger.valueOf(16L);
BigInteger radix = BigInteger.ONE.shiftLeft(rbits.intValue());
BigInteger target = refTarget;
BigInteger exponent;
BigInteger heightDiffWithOffset = heightDiff.add(BigInteger.ONE);
BigInteger targetHeightOffsetMultiple = TARGET_SPACING_BIGINT.multiply(heightDiffWithOffset);
exponent = timeDiff.subtract(targetHeightOffsetMultiple);
exponent = exponent.shiftLeft(rbits.intValue());
exponent = exponent.divide(halfLife);
BigInteger numShifts = exponent.shiftRight(rbits.intValue());
exponent = exponent.subtract(numShifts.shiftLeft(rbits.intValue()));
BigInteger factor = BigInteger.valueOf(195766423245049L).multiply(exponent);
factor = factor.add(BigInteger.valueOf(971821376L).multiply(exponent.pow(2)));
factor = factor.add(BigInteger.valueOf(5127L).multiply(exponent.pow(3)));
factor = factor.add(BigInteger.valueOf(2L).pow(47));
factor = factor.shiftRight(48);
target = target.multiply(radix.add(factor));
if(numShifts.compareTo(BigInteger.ZERO) < 0) {
target = target.shiftRight(-numShifts.intValue());
} else {
target = target.shiftLeft(numShifts.intValue());
}
target = target.shiftRight(16);
if(target.equals(BigInteger.ZERO)) {
return BigInteger.valueOf(Utils.encodeCompactBits(BigInteger.ONE));
}
if(target.compareTo(MAX_TARGET) > 0) {
return new BigInteger(MAX_BITS_STRING, 16);
}
return BigInteger.valueOf(Utils.encodeCompactBits(target));
}
public static BigInteger computeAsertTarget(int referenceBlockBits, BigInteger referenceBlockAncestorTime, BigInteger referenceBlockHeight,
BigInteger evalBlockTime, BigInteger evalBlockHeight) {
BigInteger refTarget = Utils.decodeCompactBits(referenceBlockBits);
return computeAsertTarget(refTarget, referenceBlockAncestorTime, referenceBlockHeight, evalBlockTime, evalBlockHeight);
}
}
================================================
FILE: bitcoincashkit/src/main/kotlin/io/horizontalsystems/bitcoincash/blocks/BitcoinCashBlockValidatorHelper.kt
================================================
package io.horizontalsystems.bitcoincash.blocks
import io.horizontalsystems.bitcoincore.core.IStorage
import io.horizontalsystems.bitcoincore.managers.BlockValidatorHelper
import io.horizontalsystems.bitcoincore.models.Block
class BitcoinCashBlockValidatorHelper(storage: IStorage) : BlockValidatorHelper(storage) {
// Get median of last 3 blocks based on timestamp
fun getSuitableBlock(blocks: MutableList<Block>): Block {
if (blocks[0].timestamp > blocks[2].timestamp) {
blocks.swap(0, 2)
}
if (blocks[0].timestamp > blocks[1].timestamp) {
blocks.swap(0, 1)
}
if (blocks[1].timestamp > blocks[2].timestamp) {
blocks.swap(1, 2)
}
return blocks[1]
}
private fun MutableList<Block>.swap(index1: Int, index2: Int) {
val tmp = this[index1]
this[index1] = this[index2]
this[index2] = tmp
}
}
================================================
FILE: bitcoincashkit/src/main/kotlin/io/horizontalsystems/bitcoincash/blocks/Utils.java
================================================
package io.horizontalsystems.bitcoincash.blocks;
import java.math.BigInteger;
/*
Extracted from bitcoincashj
*/
public class Utils {
/**
* <p>The "compact" format is a representation of a whole number N using an unsigned 32 bit number similar to a
* floating point format. The most significant 8 bits are the unsigned exponent of base 256. This exponent can
* be thought of as "number of bytes of N". The lower 23 bits are the mantissa. Bit number 24 (0x800000) represents
* the sign of N. Therefore, N = (-1^sign) * mantissa * 256^(exponent-3).</p>
*
* <p>Satoshi's original implementation used BN_bn2mpi() and BN_mpi2bn(). MPI uses the most significant bit of the
* first byte as sign. Thus 0x1234560000 is compact 0x05123456 and 0xc0de000000 is compact 0x0600c0de. Compact
* 0x05c0de00 would be -0x40de000000.</p>
*
* <p>Bitcoin only uses this "compact" format for encoding difficulty targets, which are unsigned 256bit quantities.
* Thus, all the complexities of the sign bit and using base 256 are probably an implementation accident.</p>
*/
public static BigInteger decodeCompactBits(long compact) {
int size = ((int) (compact >> 24)) & 0xFF;
byte[] bytes = new byte[4 + size];
bytes[3] = (byte) size;
if (size >= 1) bytes[4] = (byte) ((compact >> 16) & 0xFF);
if (size >= 2) bytes[5] = (byte) ((compact >> 8) & 0xFF);
if (size >= 3) bytes[6] = (byte) (compact & 0xFF);
return decodeMPI(bytes, true);
}
/**
* @see Utils#decodeCompactBits(long)
*/
public static long encodeCompactBits(BigInteger value) {
long result;
int size = value.toByteArray().length;
if (size <= 3)
result = value.longValue() << 8 * (3 - size);
else
result = value.shiftRight(8 * (size - 3)).longValue();
// The 0x00800000 bit denotes the sign.
// Thus, if it is already set, divide the mantissa by 256 and increase the exponent.
if ((result & 0x00800000L) != 0) {
result >>= 8;
size++;
}
result |= size << 24;
result |= value.signum() == -1 ? 0x00800000 : 0;
return result;
}
public static BigInteger decodeMPI(byte[] mpi, boolean hasLength) {
byte[] buf;
if (hasLength) {
int length = (int) readUint32BE(mpi, 0);
buf = new byte[length];
System.arraycopy(mpi, 4, buf, 0, length);
} else
buf = mpi;
if (buf.length == 0)
return BigInteger.ZERO;
boolean isNegative = (buf[0] & 0x80) == 0x80;
if (isNegative)
buf[0] &= 0x7f;
BigInteger result = new BigInteger(buf);
return isNegative ? result.negate() : result;
}
public static long readUint32BE(byte[] bytes, int offset) {
return ((bytes[offset] & 0xffl) << 24) |
((bytes[offset + 1] & 0xffl) << 16) |
((bytes[offset + 2] & 0xffl) << 8) |
(bytes[offset + 3] & 0xffl);
}
public static void checkState(final boolean expression, String message) {
if (!expression) {
throw new IllegalStateException(message);
}
}
}
================================================
FILE: bitcoincashkit/src/main/kotlin/io/horizontalsystems/bitcoincash/blocks/validators/AsertValidator.kt
================================================
package io.horizontalsystems.bitcoincash.blocks.validators
import io.horizontalsystems.bitcoincash.blocks.AsertAlgorithm
import io.horizontalsystems.bitcoincore.blocks.validators.BlockValidatorException
import io.horizontalsystems.bitcoincore.blocks.validators.IBlockChainedValidator
import io.horizontalsystems.bitcoincore.models.Block
class AsertValidator : IBlockChainedValidator {
private val anchorBlockHeight = 661647
private val anchorParentBlockTime = 1605447844.toBigInteger() // 2020 November 15, 14:13 GMT
private val anchorBlockBits = 0x1804dafe
override fun isBlockValidatable(block: Block, previousBlock: Block): Boolean {
return previousBlock.height >= anchorBlockHeight
}
override fun validate(block: Block, previousBlock: Block) {
val bits = AsertAlgorithm.computeAsertTarget(anchorBlockBits, anchorParentBlockTime, anchorBlockHeight.toBigInteger(), previousBlock.timestamp.toBigInteger(), previousBlock.height.toBigInteger())
if (bits != block.bits.toBigInteger()) {
throw BlockValidatorException.NotEqualBits()
}
}
}
================================================
FILE: bitcoincashkit/src/main/kotlin/io/horizontalsystems/bitcoincash/blocks/validators/DAAValidator.kt
================================================
package io.horizontalsystems.bitcoincash.blocks.validators
import io.horizontalsystems.bitcoincash.blocks.BitcoinCashBlockValidatorHelper
import io.horizontalsystems.bitcoincore.blocks.validators.BlockValidatorException
import io.horizontalsystems.bitcoincore.blocks.validators.IBlockChainedValidator
import io.horizontalsystems.bitcoincore.crypto.CompactBits
import io.horizontalsystems.bitcoincore.models.Block
class DAAValidator(
private val targetSpacing: Int,
private val blockValidatorHelper: BitcoinCashBlockValidatorHelper
) : IBlockChainedValidator {
private val largestHash = 1.toBigInteger() shl 256
private val consensusDaaForkHeight = 504031 // 11/13/2017 @ 8:58pm (UTC)
override fun isBlockValidatable(block: Block, previousBlock: Block): Boolean {
return previousBlock.height >= consensusDaaForkHeight
}
override fun validate(block: Block, previousBlock: Block) {
val chunk = blockValidatorHelper.getPreviousChunk(previousBlock.height, 146)
validateDAA(block, chunk)
}
private fun validateDAA(candidate: Block, chunk: List<Block>) {
val firstSuitable = blockValidatorHelper.getSuitableBlock(mutableListOf(chunk[0], chunk[1], chunk[2]))
val lastSuitable = blockValidatorHelper.getSuitableBlock(mutableListOf(chunk[chunk.size - 3], chunk[chunk.size - 2], chunk[chunk.size - 1]))
val heightInterval = lastSuitable.height - firstSuitable.height
var actualTimespan = lastSuitable.timestamp - firstSuitable.timestamp
if (actualTimespan > 288 * targetSpacing)
actualTimespan = 288 * targetSpacing.toLong()
if (actualTimespan < 72 * targetSpacing)
actualTimespan = 72 * targetSpacing.toLong()
val lastSuitableIndex = chunk.indexOf(lastSuitable)
val blocks = chunk.slice((lastSuitableIndex - heightInterval + 1) until lastSuitableIndex).toMutableList()
var chainWork = 0.toBigInteger()
blocks += lastSuitable
blocks.forEach {
val target = CompactBits.decode(it.bits)
chainWork += largestHash / (target + 1.toBigInteger())
}
chainWork = chainWork * targetSpacing.toBigInteger() / actualTimespan.toBigInteger()
val target = largestHash / chainWork - 1.toBigInteger()
val bits = CompactBits.encode(target)
if (bits != candidate.bits) {
throw BlockValidatorException.NotEqualBits()
}
}
}
================================================
FILE: bitcoincashkit/src/main/kotlin/io/horizontalsystems/bitcoincash/blocks/validators/EDAValidator.kt
================================================
package io.horizontalsystems.bitcoincash.blocks.validators
import io.horizontalsystems.bitcoincash.blocks.BitcoinCashBlockValidatorHelper
import io.horizontalsystems.bitcoincore.blocks.BlockMedianTimeHelper
import io.horizontalsystems.bitcoincore.blocks.validators.BlockValidatorException
import io.horizontalsystems.bitcoincore.blocks.validators.IBlockChainedValidator
import io.horizontalsystems.bitcoincore.crypto.CompactBits
import io.horizontalsystems.bitcoincore.models.Block
// Emergency Difficulty Adjustment
class EDAValidator(
private val maxTargetBits: Long,
private val blockValidatorHelper: BitcoinCashBlockValidatorHelper,
private val blockMedianTimeHelper: BlockMedianTimeHelper
) : IBlockChainedValidator {
override fun isBlockValidatable(block: Block, previousBlock: Block): Boolean {
return true
}
override fun validate(block: Block, previousBlock: Block) {
if (previousBlock.bits == maxTargetBits) {
if (block.bits != maxTargetBits) {
throw BlockValidatorException.NotEqualBits()
}
return
}
val cursorBlock = checkNotNull(blockValidatorHelper.getPrevious(previousBlock, 6)) {
throw BlockValidatorException.NoPreviousBlock()
}
val mpt6blocks = medianTimePast(previousBlock) - medianTimePast(cursorBlock)
if (mpt6blocks >= 12 * 3600) {
val decodedBits = CompactBits.decode(previousBlock.bits)
val pow = decodedBits + (decodedBits shr 2)
var powBits = CompactBits.encode(pow)
if (powBits > maxTargetBits)
powBits = maxTargetBits
if (powBits != block.bits) {
throw BlockValidatorException.NotEqualBits()
}
} else if (previousBlock.bits != block.bits) {
throw BlockValidatorException.NotEqualBits()
}
}
private fun medianTimePast(block: Block): Long {
return blockMedianTimeHelper.medianTimePast(block) ?: block.height.toLong()
}
}
================================================
FILE: bitcoincashkit/src/main/kotlin/io/horizontalsystems/bitcoincash/blocks/validators/ForkValidator.kt
================================================
package io.horizontalsystems.bitcoincash.blocks.validators
import io.horizontalsystems.bitcoincore.blocks.validators.BlockValidatorException
import io.horizontalsystems.bitcoincore.blocks.validators.IBlockChainedValidator
import io.horizontalsystems.bitcoincore.blocks.validators.IBlockValidator
import io.horizontalsystems.bitcoincore.models.Block
class ForkValidator(
private val forkHeight: Int,
private val expectedBlockHash: ByteArray,
private val concreteBlockValidator: IBlockValidator
) : IBlockChainedValidator {
override fun isBlockValidatable(block: Block, previousBlock: Block): Boolean {
return block.height == forkHeight
}
override fun validate(block: Block, previousBlock: Block) {
if (!block.headerHash.contentEquals(expectedBlockHash)) {
throw BlockValidatorException.WrongBlockHash(expectedBlockHash, block.headerHash)
}
concreteBlockValidator.validate(block, previousBlock)
}
}
================================================
FILE: bitcoincashkit/src/main/resources/MainNetBitcoinCash-bip44.checkpoint
================================================
02000000ba3f2b4208ec0495b2e3743465cae2b44d8f1c778b44cf6b0000000000000000d287e52e8045c060c1cee47d1cc7559c7b8ab8db580539fb55fc579a998ea14efe0e50538c9d001926c0c180a08504003f72e59e0db5b38e5210369dc2fb4831ab1e81f3b5dbec3d0000000000000000
0200000088c03613a752946272147792ee524af4acbffc3c1a70204b00000000000000005b679afd22900abbf4221db5401ee867c99264e13f754777ccaf1fd92f1fa4fb3a0d5053aab3001931afde449f850400ba3f2b4208ec0495b2e3743465cae2b44d8f1c778b44cf6b0000000000000000
02000000de6076c4ebaf8a99d1aed6600b702499921d606e5b7df60500000000000000005aedac698f670b8c787f2339575bd4466e558adc6e0f6e8e0373005618c672820a0c5053aab300196bf4edac9e85040088c03613a752946272147792ee524af4acbffc3c1a70204b0000000000000000
02000000f308b5ad14372c12cd08c584596e0790a7fed9f2846b8e170000000000000000a69485840909da4d1236721b721f2638a7d1c716f085f099cc21c705bdeef8494f085053aab300190efbed749d850400de6076c4ebaf8a99d1aed6600b702499921d606e5b7df6050000000000000000
02000000ebb127579225c0b7c9556364ee197eff8d84c2c474cbe0090000000000000000bf62b8c209d82909d5883e8095e8cbabab5545ad29839b25c973944fd161ed44a5055053aab30019058e37689c850400f308b5ad14372c12cd08c584596e0790a7fed9f2846b8e170000000000000000
02000000a8ed0256dd77435126cffa9d9d6550046a45ff63643c492200000000000000002546a265189fd9caf283386a90dc53a15d7a9caf8daff4b4b741851bb8a6421173015053aab30019effe96599b850400ebb127579225c0b7c9556364ee197eff8d84c2c474cbe0090000000000000000
0200000012a3a9812e4b2f1311576e9abf834e7b247c139453da7b4300000000000000003a54f400aee6cef8fc999858ca83ea110b2a71da91c53061e736dc0f8fe5438fca005053aab3001951fab8bd9a850400a8ed0256dd77435126cffa9d9d6550046a45ff63643c49220000000000000000
020000001bdf3c4a0aaf48ad2b6fe321f9ca2687fc77b7dcffe0c54b00000000000000005e1932b8b416ffb592c6c6a900016eb76a5ff1ef264823a8dbea2a5506ae5aa472ff4f53aab3001951c856699985040012a3a9812e4b2f1311576e9abf834e7b247c139453da7b430000000000000000
0200000045c081445f0c886c0e9c06100a032f899a0ca02981c7242c00000000000000007404f4844f9ea3bf199e9b0879359a682442805f36df07f07705a52e818479dc57fc4f53aab30019b4de0dde988504001bdf3c4a0aaf48ad2b6fe321f9ca2687fc77b7dcffe0c54b0000000000000000
02000000edeafbbb92af050ce4fdff9b2e42c7c7e09a1fb7b3420e81000000000000000061b816aeadc6d8060be33252375f320f73f6b2c7385b517525574dde8bfd1770e2fa4f53aab30019a29707c59785040045c081445f0c886c0e9c06100a032f899a0ca02981c7242c0000000000000000
02000000223f307aadd3b7f79b72f224a5b5b5df31722cec5f48c51e000000000000000047ea9aa89e6ecc12e573daa8efb6727cfeda897455bbc0a6b2f69c2d209f4b71f5f94f53aab3001907fad61a96850400edeafbbb92af050ce4fdff9b2e42c7c7e09a1fb7b3420e810000000000000000
02000000b09566bca15f31a35345a5bc315b2957b3efdd75bc7c4c6400000000000000006f5d1c5a30362de6e2bcb95aab111149a77cba7f9f72c925a82b0348500d217748f64f53aab30019f6a067c695850400223f307aadd3b7f79b72f224a5b5b5df31722cec5f48c51e0000000000000000
020000003209dff479cfc22384c25fe241f907e24ba8e29e103d3c390000000000000000c0ebec8579d6a66721537ec2425c7083b9da1ed863585725b7680b1f6d2072dce1f34f53aab30019365408bc94850400b09566bca15f31a35345a5bc315b2957b3efdd75bc7c4c640000000000000000
02000000e589a04528b496bb1bd163424583ec8c3a3eebd64decbcaa000000000000000092c84273d629837a781f62df4ff1e98735bae5e69d6680421d3d106a501add60d5f24f53aab300190d2711dc938504003209dff479cfc22384c25fe241f907e24ba8e29e103d3c390000000000000000
0200000031ad2c1506d203293dd6348d5f54ff5b14629186933f58620000000000000000227058a7137843a516996ce7ce984beab4fd5e9099709bdbb1bc98f3517c3c56e3ee4f53aab3001992a4e3f792850400e589a04528b496bb1bd163424583ec8c3a3eebd64decbcaa0000000000000000
02000000bc7498364b22f646653e7753fdd49013e51bc7c5be5b8a4e0000000000000000d98447ac6d93c629fc81af9a49a074d7db60b90c5790fce9990f9114a493194affed4f53aab30019d81bf0829185040031ad2c1506d203293dd6348d5f54ff5b14629186933f58620000000000000000
02000000910bd6e05b76fb5ed472b76c07a28313da789d778ad2e57700000000000000008380c76e3c4b8f48c2965c4c4c16653e85e99329780b92dc12bea667f041e3164aed4f53aab30019aa7b9ff690850400bc7498364b22f646653e7753fdd49013e51bc7c5be5b8a4e0000000000000000
02000000ba34128aadc2e73a6d9bbe328cd660b517752fa57ee411600000000000000000f1042e7234a288d31ef80f8893481272bcd6eea0fa513dfaebf3ac5a92f37e7c12ec4f53aab300190c5f41688f850400910bd6e05b76fb5ed472b76c07a28313da789d778ad2e5770000000000000000
02000000bd6fd95daaccf77098024073cc5dededffad394ae025844b00000000000000005d77b6ee34ad3a5363f58cfafb015e3d72efd8e918cde7029345b385f30d16513ae94f53aab30019bb8afec88e850400ba34128aadc2e73a6d9bbe328cd660b517752fa57ee411600000000000000000
02000000ae7c78592678f6ba5065bd9a0662271013134a89434fd8a900000000000000004759f0afc2f484916fb6a082338323be7c2cd2803b76abc375153df5d808733966e74f53aab300195dcfb6778d850400bd6fd95daaccf77098024073cc5dededffad394ae025844b0000000000000000
020000009ee688465fe1174c750089d5195f8348cd439e60c930c74a000000000000000006a33880503c7f14c144f037f2ac1819b27160bde2722c995e39be1218d3ecc79ee54f53aab30019a193cd438c850400ae7c78592678f6ba5065bd9a0662271013134a89434fd8a90000000000000000
02000000e077c2bab49992492d535b1b60549fc97593011717c03580000000000000000065abe8c39e5bf51cf5d87373f6366b87e1974802dd801f1af5516f2cd8bfbddce5e34f53aab30019e34ea8c38b8504009ee688465fe1174c750089d5195f8348cd439e60c930c74a0000000000000000
020000007a8cb9e2ea2f7fcc1d0195ddb2175965bf45f2812cacea3c0000000000000000304629e4aa6d3c307a719db55ee29bb073048b003e759118a3acbbe02497ca5848df4f53aab30019dbf02e988a850400e077c2bab49992492d535b1b60549fc97593011717c035800000000000000000
02000000578569a85a532af78d9f2bb448a439c376e916782b212d0f00000000000000006f504b91547c7fd4cf0a99b3ac4fdcee30a779cce3c099819d43be85b838bd5168dd4f53aab30019c54e259b898504007a8cb9e2ea2f7fcc1d0195ddb2175965bf45f2812cacea3c0000000000000000
02000000f0f00b72042032823151b265c854cced592cf73d8638b94c0000000000000000a34029fd1f9dfe44947178ae0d4491289ddacf75989b06b90d0142eb3d86536c2fd94f53aab30019f08e0c4688850400578569a85a532af78d9f2bb448a439c376e916782b212d0f0000000000000000
0200000038375a7969c498dab5b388afbc1c3d374bd9210425f4c074000000000000000008b8a73fbb942d2e35f7faaacbe76aa63193b9c36a2f39d0698b1e23a924363333d64f53aab30019a07c2e2b87850400f0f00b72042032823151b265c854cced592cf73d8638b94c0000000000000000
0200000011355cd4abdbce81ff0583e7317f35329acbf14a57214b85000000000000000070702c32c6a515e0b167e642db4409f537b5addd63c2e41630635aae8499456fb0d54f53aab30019f3b8fbf48685040038375a7969c498dab5b388afbc1c3d374bd9210425f4c0740000000000000000
02000000a091e9e5205df3c26a27b8499c26b7bfd1e75b7bdb8522a60000000000000000c4d57b53d1ee807ffee287f0a11fe1b24c3324442863ddae9036a8951558d4acf6d34f53aab300194cb573318585040011355cd4abdbce81ff0583e7317f35329acbf14a57214b850000000000000000
020000007ac6087351f59c8730e7109cef79a2118d4e9788cb09732e0000000000000000b09c72103aa7e6cb81faef18027c57e700aa33a9f02b95013b605605763d02b2bdce4f53aab300190e0c313e84850400a091e9e5205df3c26a27b8499c26b7bfd1e75b7bdb8522a60000000000000000
02000000543a88c9ead76ff8c031d558b6214f37d2258a057288a98200000000000000004a7420c2953accf8630c75fca3821ade63aafc1d99b476aeb78f1f6c7044044f33cd4f53aab30019cfdad2b6838504007ac6087351f59c8730e7109cef79a2118d4e9788cb09732e0000000000000000
02000000c281b9672067629d19873f9e50b52e5c6d713f1535cdc6770000000000000000ece1a30937fe7a6478df3283167980b6440a36bfc79fd5ed876aec9a718527d4a1cc4f53aab30019b5a9e54c82850400543a88c9ead76ff8c031d558b6214f37d2258a057288a9820000000000000000
02000000148699aa20a44895895985d5e3d9f31f0e59e626540b7d840000000000000000dcad236ea06fd34e30ae519f477dc084bf75552f85578e0a8b9c6cc804dcab8e08c94f53aab3001997fd95e881850400c281b9672067629d19873f9e50b52e5c6d713f1535cdc6770000000000000000
020000008b4317c07870ee8b16e1c279a0a9405e539249d12032b02a00000000000000000b9b5d0f7351b5bc05f2bdc9557963d80a50660dc3aec57fb6fe2432b7ce4b5dacc84f53aab30019486b48f680850400148699aa20a44895895985d5e3d9f31f0e59e626540b7d840000000000000000
02000000a35cbb341f4dc369daf1db4aa6c7b6deb906f21431fade65000000000000000064014a614d54ad4f58430a53336480ca53fee63b3a24032708c7ca41887f92b07dc84f53aab30019770e1ccb7f8504008b4317c07870ee8b16e1c279a0a9405e539249d12032b02a0000000000000000
020000000f217937f5acb6f5ee6b1046391fc8dafc7d14f45b543b190000000000000000bc3dadbb38272b5516159c21f3254d4535b9de7e45d142f932295953b953e9788ec54f53aab300197d5dd9e07e850400a35cbb341f4dc369daf1db4aa6c7b6deb906f21431fade650000000000000000
020000003dfecf95a637d583ed7d83e60c337cce28184b369c8055190000000000000000ed988bc76a1ace4d5af85c915b6b6247fcadb679daeba41e871852899a646ced13c54f53aab3001913012e107d8504000f217937f5acb6f5ee6b1046391fc8dafc7d14f45b543b190000000000000000
0200000042feba1f0689217040e87a2d5c8003f62054ca70526020870000000000000000854c2a9323d372c80ccd60b8fe93bbf1335e5596dae48aa9a8e85f988c6ab68607c54f53aab30019625b285a7c8504003dfecf95a637d583ed7d83e60c337cce28184b369c8055190000000000000000
0200000006eed96748eb886c2dd80a66929b6d436d88f8178ce89ab00000000000000000e76ca180a82080b3a12ab75ff1349fb5291ff66e3e061c3bcd2af0937a32cf4c55c24f53aab300190711fa907b85040042feba1f0689217040e87a2d5c8003f62054ca70526020870000000000000000
0200000060f84899b9dc1829026b42c8a869c3f3cbfe48f44c5fe5740000000000000000f19c0030b60d269e1c1eb2c8c5663b5d848e3e3a8cdb95c40e6cc807cb29aab855bd4f53aab30019cd5a218a7a85040006eed96748eb886c2dd80a66929b6d436d88f8178ce89ab00000000000000000
020000003874f8b15e3878126e2ab6ada58c4ccb5e9f7ae66006b78700000000000000001a9e63d440c243638fa43d841a6556244b071c51400eaa35f58ab897052bdf5cc6bd4f53aab300195338dba17985040060f84899b9dc1829026b42c8a869c3f3cbfe48f44c5fe5740000000000000000
0200000048833a11adfe8ca520774d04c30b9c1145d0a0ef7e9d392d0000000000000000f80f0c720479c629e2d8ded2e1835d4871d6efe6489e80a2c7b6b599dd5faa4b35bb4f53aab3001927672991788504003874f8b15e3878126e2ab6ada58c4ccb5e9f7ae66006b7870000000000000000
0200000027ab9802f9fca4a65bb4ed509f475ec85dced21f5d0337920000000000000000f91e0f223667c1872506d8a658e24d5374b0cc802b2fa552d2fc68f72343aa2e28ba4f53aab300191894e0a87785040048833a11adfe8ca520774d04c30b9c1145d0a0ef7e9d392d0000000000000000
020000009afe656e0f5922610f0ce98ef4c28e0787674a55189b3619000000000000000039886ac4637bfb353647625edf6b0a6726fa8879c72abb5505022c0fef7bec3c21b94f53aab300197ace04de7685040027ab9802f9fca4a65bb4ed509f475ec85dced21f5d0337920000000000000000
020000009dd8612854be8ca84cd2cd26de8b43cf5339428a261aed8800000000000000003668922c235558f89ad6a4f0e8b5a20e29aebfdf693df11b302fe523729af35dcfb34f53aab30019337ed7ea758504009afe656e0f5922610f0ce98ef4c28e0787674a55189b36190000000000000000
02000000b93523be114558c5d172c44d9d1c3f420c9dd4e49d1467a7000000000000000069d1718c45b6cf2fcb253cd14efc6690b5d9afd89f7246daf0e3be736579a94ac4b14f53aab30019024a2f9e748504009dd8612854be8ca84cd2cd26de8b43cf5339428a261aed880000000000000000
0200000075cbd526a5327ec10cd9bceae74892b180d27a689f153682000000000000000056e857744cc3fb9ac15423b9d23daf69603975ee83876e020fefd946ed6e7bc75bb14f53aab30019ef2968c073850400b93523be114558c5d172c44d9d1c3f420c9dd4e49d1467a70000000000000000
02000000cb0eddbea32985fc9ee1be87ec23ece886358219536adf440000000000000000653d36f8ffc0a89d2e12358b580cd6e1b0156389fd2d27b54d4107bb9d858f325cb04f53aab300191177f5287285040075cbd526a5327ec10cd9bceae74892b180d27a689f1536820000000000000000
0200000017fa90299ce9d234cf73c46cb8c4e7480454ec9167b4bd50000000000000000047b38999f9af6fee382fb1b098fe469fc0ab777ab1bc7a73b14bde7673932688deaf4f53aab300194a3cc36671850400cb0eddbea32985fc9ee1be87ec23ece886358219536adf440000000000000000
020000003268f352f71040e8a15f9c8062d3d5005715436536ba293d00000000000000009e3f8bc6691440d64a681c0dfc9ec2fd459797d7e3e6259362d656daa7374628b8ac4f53aab300197987a3617085040017fa90299ce9d234cf73c46cb8c4e7480454ec9167b4bd500000000000000000
02000000d2a652ae1b7e57e072f5e3743136dd46ada4d073a3a06039000000000000000079e27bc7faaa03a719d1491ad6dad19ba0b0cb17f443de7c461247c3f47ec45982ab4f53aab30019e804deb86f8504003268f352f71040e8a15f9c8062d3d5005715436536ba293d0000000000000000
020000006ce2aba8861ec16c546d23fa8af538ce6112f109a9f412360000000000000000497e72f1c1fad86b7e35e230c11e76f635e5c6e809223423f478c39b685b0c615da94f53aab30019f29795776e850400d2a652ae1b7e57e072f5e3743136dd46ada4d073a3a060390000000000000000
02000000cd27f3686735c946a32f079fea0aff1dc7f8dfe9ada6ecb00000000000000000dd504f552b7f71b6685a8d2dbff92d7c2a62344ce87b801ba4f3c274ca547f7851a94f53aab300194ddb49a06d8504006ce2aba8861ec16c546d23fa8af538ce6112f109a9f412360000000000000000
0200000089b96fd7b5009cbfdd98322574e1c160f89a1cb7a9bc7fb30000000000000000e3c124151985dd04e2c32ba5e241abd5b22ffd479869259246e29c26a3a9164809a54f53aab30019e177d7866c850400cd27f3686735c946a32f079fea0aff1dc7f8dfe9ada6ecb00000000000000000
02000000cc8480971555c86209a87f72f51f407ca4dad13fa00079020000000000000000d1ecb901afaaf70e7725f25b444bae44071b6219d50a9c940a556091577a35a50ea44f53aab30019aca3f9ce6b85040089b96fd7b5009cbfdd98322574e1c160f89a1cb7a9bc7fb30000000000000000
020000004b5b861369e67a4d87657dfffe85253f23fe13815f8e07080000000000000000850ac13a6bf15fe700a8da6f0ec852039a6630a4d474b1b1929db160086ebd1edfa14f53aab30019ce0868a96a850400cc8480971555c86209a87f72f51f407ca4dad13fa00079020000000000000000
0200000026ba9cc1ff8180ffabee37b7f7682e2dbe38a21762edf53e0000000000000000887b0db8b15a3275165919cdc23ebcfc46b758ce96ecd1ac8c7c8c93a9ec445b88a04f53aab3001973a47edc698504004b5b861369e67a4d87657dfffe85253f23fe13815f8e07080000000000000000
0200000090bcbfd0a472558833ce464368e939768752e568a93c343500000000000000000716a874daf6c450b277db0baf34463aebb14a4e0e79270e21d4e6c583d33ef0129f4f53aab30019ed605ce76885040026ba9cc1ff8180ffabee37b7f7682e2dbe38a21762edf53e0000000000000000
020000005f9c242c6b61d0782af687009b48ef873961c8190a052d310000000000000000ed13b2a231aa9fad7154f558202dd7d3ea40105f6d8a1a351043e5a130e8fb2f889e4f53aab30019d8a34f2e6785040090bcbfd0a472558833ce464368e939768752e568a93c34350000000000000000
02000000be15ccaa2406d7ce2190b4afcb338c49fa3faaa5b6fcd7060000000000000000b2ac4861093a0d319985089c50739d4e8d3e54d0adfc16b4e60f200bcaf8ea43d59d4f53aab30019cdf6810c668504005f9c242c6b61d0782af687009b48ef873961c8190a052d310000000000000000
02000000c77835534d0a487d00de30f7b40370c958eaa50f1a21089d0000000000000000c26a86958b0dbebe7f7f91e51c0f59486864214b56a1a9c01628a3dad832ca88e09c4f53aab300195365730965850400be15ccaa2406d7ce2190b4afcb338c49fa3faaa5b6fcd7060000000000000000
02000000429c00b13583ac149843442aa129cf2d44ce396f518e186b00000000000000002796c110ead15a0a3b6b6e84048c821d0edc94a1aaf9eaf08d1ddd6c285927fa4d9b4f53aab30019d8a2f7ff64850400c77835534d0a487d00de30f7b40370c958eaa50f1a21089d0000000000000000
0200000057415e3cf946d26fad4a69de1832a90937a361a9e8e2b94700000000000000003979bdd7c50be7a00c0d5af930dc11fd21bff44342c09a4d959f60a268f38b5838964f53aab30019c13a8d5663850400429c00b13583ac149843442aa129cf2d44ce396f518e186b0000000000000000
02000000a1423eae0bbdf430c71516721db80190448f1a9a97e2e2600000000000000000c594080c3ca9c1b1d960025ee20da0e9530cec194c811f728e61bfdb74c308f907944f53aab30019d57d9c066285040057415e3cf946d26fad4a69de1832a90937a361a9e8e2b9470000000000000000
02000000233b174e68901ebfae050b981ae24d40390d61d26cb7ff720000000000000000b09410313b3c343d16240637ec98993f5c266d1d30a82801a874499b68605bb673934f53aab3001970c6192861850400a1423eae0bbdf430c71516721db80190448f1a9a97e2e2600000000000000000
02000000f490c3382fac48e779350c67e10072983f5faae76cebaa960000000000000000fb3ed4c465d037d7e0f320702eb52586e95ed052c241266e5a00f04d8d46e013f3924f53aab3001994e10afb60850400233b174e68901ebfae050b981ae24d40390d61d26cb7ff720000000000000000
02000000a72f696a171bd2c58c7e3eea3ff05be15808d7d9d6860e7b0000000000000000ef70e9f7a49418e55b471de2c416f5d42bc8053972c21b5071e28363bc7085c128904f53aab3001990682ba15f850400f490c3382fac48e779350c67e10072983f5faae76cebaa960000000000000000
02000000a3f72083fa8cfc8883ef1fb9cf33e719db6c03046f323d6a0000000000000000b213c8c36e257ac08c71f1c11c4b3bbb8e278e3f4f6d96413660a75736fa9ff2018e4f53aab3001925b485255e850400a72f696a171bd2c58c7e3eea3ff05be15808d7d9d6860e7b0000000000000000
02000000ff3728a8389cd1c1a2ca8a2e825fc1803fd41fca1b41712400000000000000001010056c33aa93d7fe00344d33a90d8c250aaa8cbb7d8a197135a8392fe75c441e8d4f53aab300194839ccd85d850400a3f72083fa8cfc8883ef1fb9cf33e719db6c03046f323d6a0000000000000000
02000000e1e4f9bfff2512284a9fc44bd35cd2fe9e3deb6d179903660000000000000000f0ae9d62b2e6489d07ab442123e79ebaf87016edf7165f667a1386d1af28bd277d894f53aab300197e4bb89b5c850400ff3728a8389cd1c1a2ca8a2e825fc1803fd41fca1b4171240000000000000000
020000006b6b77ad6ca3ca34259d6788fdadeef1547a0fa84d731845000000000000000024dcb54597ce76f1d34053d1173092e1a66959c5fc46ddd61e6d1cef2336ac7e27874f53aab3001903c4d70f5b850400e1e4f9bfff2512284a9fc44bd35cd2fe9e3deb6d179903660000000000000000
020000000df888a842be963a78d897be945d3b6b13c337bd3d99645c0000000000000000d695710e85c2d259b073efc5505d8a33d3065044fe2420263fafd7e165f0accd89874f53aab30019b192482a5a8504006b6b77ad6ca3ca34259d6788fdadeef1547a0fa84d7318450000000000000000
020000002d420e24ba7ec1fea33a8c317c0f5fc3cb601e28398d219d000000000000000060b3be45558b170a3c5bba932a058f4dab252a2f679021613713eeb80779629386874f53aab3001998924e3f598504000df888a842be963a78d897be945d3b6b13c337bd3d99645c0000000000000000
02000000764b23552e51c6cfda870eac15f990dac9413932015cc066000000000000000036d520c80b481c1ab56e93466cc6afe2aea1724744ef1bbd7ce09f5f0050a9555e874f53aab300192c47769e588504002d420e24ba7ec1fea33a8c317c0f5fc3cb601e28398d219d0000000000000000
020000000d1805f9cd06b1a95d282eb025d5df977d95fd48ae6b6d1d0000000000000000beb93f892f198a8a68eec93fe96895c212e78b7f395e1dfeb878a59bbe9562702e864f53aab30019b0cc06b457850400764b23552e51c6cfda870eac15f990dac9413932015cc0660000000000000000
02000000e3690d5b97db4837340c4b868fa67c9ef0fbd455c05676060000000000000000cd037bce20c7fec31ac599c5ae9b8f585d2cfb722dff5cc6e2a564335f558c1ce2834f53aab300194cfd7f34568504000d1805f9cd06b1a95d282eb025d5df977d95fd48ae6b6d1d0000000000000000
020000002f7007a253d1c19df4ba90e727bc2074b5a86d19055128730000000000000000fb4a40c6ebe74bdb5ce8bf10360d041995bfc5ded3e9fe775b8b2ee0df2751e3df824f53aab300199dc17fb655850400e3690d5b97db4837340c4b868fa67c9ef0fbd455c05676060000000000000000
0200000065ce6aee748fa5cf93e4f58a5e27efbf36e808ffdf7f89b100000000000000003918448585c6c551ef5cc3718aa05920832799ab2139e7b1bb27a1952b38f6ba4f814f53aab30019cf84687f548504002f7007a253d1c19df4ba90e727bc2074b5a86d19055128730000000000000000
0200000050f5d898a6863e578b33cdbf4e0a450ddb5974e6e7cc87a10000000000000000c9bd0e56b8d6ae7ed84cba97b154d14a225b57d494865a398b4cd7df3ae0887893804f53aab300192ca5a1ba5385040065ce6aee748fa5cf93e4f58a5e27efbf36e808ffdf7f89b10000000000000000
020000001885ce9ecedd1ad9a984a99cb0892e05e76ce4f9a4b0959100000000000000009f99224474cf0aafb9c896ffc8ad292efb26138ff8d3d205401111bdf093c70aed7d4f53aab30019322dad085285040050f5d898a6863e578b33cdbf4e0a450ddb5974e6e7cc87a10000000000000000
020000003dc4683a79dbebfae6fae6dab9485332c2b4e3104582ee2800000000000000007585606dc0e260afcf37207053d9d20a227052b9c4c08250e365892147aa6704097d4f53aab30019d05817a7518504001885ce9ecedd1ad9a984a99cb0892e05e76ce4f9a4b095910000000000000000
02000000d4aa5b768011c87fb2988beefc1dfc3c0c27b5445d4ae8060000000000000000b4c2433ae9881920487f975725beabd79399cdb6acd6a57933e9e1dec0261dc5117f4f53aab300191240ee49508504003dc4683a79dbebfae6fae6dab9485332c2b4e3104582ee280000000000000000
020000001a593e49d585a5987f78c5b141d74238f953dcb25ce2eb680000000000000000bd54cff7a4d185ccad60eb31cf7a9b83256ec0742ebc6e2682f1ada5977a22e69d794f53aab3001916a2d12e4f850400d4aa5b768011c87fb2988beefc1dfc3c0c27b5445d4ae8060000000000000000
02000000bee844fc7a75db08426459904d2a223bd3c80252ebd18c1f0000000000000000adb779bbc3e7af5f724290c5e102a4d8eae315f8d0b5de6240fdbe7372fdbbed69794f53aab30019d603a6674e8504001a593e49d585a5987f78c5b141d74238f953dcb25ce2eb680000000000000000
02000000caef89dccbfd7e8a6e14ef44f43f8c16201fb8cbb72a797c0000000000000000770552d3ffa346313864ad81af4e179bb2c6e502a51f34db4c30edb3847de8d441774f53aab30019a642fc8b4d850400bee844fc7a75db08426459904d2a223bd3c80252ebd18c1f0000000000000000
0200000033a8f19953f1c6b6ece262e4d26a9a262cb598e852cef99a0000000000000000bdf4f023f783249f866adc74e8b633022f1afe71e15f47c4ad03d20bdf79ab9f0a774f53aab30019eb8b93754c850400caef89dccbfd7e8a6e14ef44f43f8c16201fb8cbb72a797c0000000000000000
0200000034f5b6c08a27e092aeb4adb5370c016cc79a88b09412db4500000000000000003ac289bfdec3d121cc8f2e31404d3c2da154238dbcd424a71cc007b9eff13c3e99754f53aab300195bcd03924b85040033a8f19953f1c6b6ece262e4d26a9a262cb598e852cef99a0000000000000000
020000005b6639ac9d2483341c991d6c999e415961502bc5c31a168a000000000000000026fc89c24402c97a8cdc70d202014b3f02585b7fedb514a5e4db6a7fa81cd5d9b7744f53aab300198130df8d4a85040034f5b6c08a27e092aeb4adb5370c016cc79a88b09412db450000000000000000
02000000a64a8d644080e215b4007f64acf883c1877a4e912c83e69e0000000000000000b589f128dd342e7d2acdb1c9471dcbe0c7b9e184ac232b8d3cc4a00bff8042d2766f4f53aab300194ee5562b498504005b6639ac9d2483341c991d6c999e415961502bc5c31a168a0000000000000000
020000003d0fe23a5aa47fae62dede20794661fba6943c9fe25764a30000000000000000e264374685cafd7b6e4aa6ec65fee7d5f2f2bed349fbaa2b6529823df816bcc1016f4f53aab30019bb976a1048850400a64a8d644080e215b4007f64acf883c1877a4e912c83e69e0000000000000000
02000000d6daa7600fbeb2e44e30962670ec38573dc4f96e7bda02950000000000000000cb95ae12c3e77829e9eb65f184997ff269a246ef3adf77629b4c467236e20624e86e4f53aab30019be628613478504003d0fe23a5aa47fae62dede20794661fba6943c9fe25764a30000000000000000
0200000029ed27f5cc527daacf035aa17c6814fd936d9ddf9723d03200000000000000008f836090c6d0b4bb8c3e0d8e79717018e8b9bf0d3613ead3fc003120a82e10324d6e4f53aab30019481e0bc146850400d6daa7600fbeb2e44e30962670ec38573dc4f96e7bda02950000000000000000
020000009d85a7a41cf63d3a14e0c02b22df37afdf4dafd68578a26a0000000000000000bdeceb9a02027fafd09ce755e1f5f87b31a0bbf27106c6adc990ea40dfeef9e54f694f53aab300196640e5564585040029ed27f5cc527daacf035aa17c6814fd936d9ddf9723d0320000000000000000
02000000a5cbf81c4d5d3e89669ca406fd9b8fdde99c63e67a7759aa00000000000000007d2107d5f8603e077561f0e9b5eac5936e3919ed12d13afdc3e4eecb9e22c4b2ba694f53aab3001963041b86448504009d85a7a41cf63d3a14e0c02b22df37afdf4dafd68578a26a0000000000000000
02000000606ded4b084da4f712e562b081408b28584c0ebc05f7bd210000000000000000f4ef310e4649682bc300d2e53d137dc7c2a78c89c6b312d68ba7b2a8a170ddab05694f53aab30019c8dbb3e543850400a5cbf81c4d5d3e89669ca406fd9b8fdde99c63e67a7759aa0000000000000000
020000002e8da06450c35d020ab2a4d9e510ee89fca196e77f12f0560000000000000000184797be67e17ad2e9fe4eb5d6cb2dd6cb593e28cac759f0048ecd1f1a80600b87694f53aab30019b8a802a842850400606ded4b084da4f712e562b081408b28584c0ebc05f7bd210000000000000000
02000000ccc36e54810b1412ced7a9a00b37223074c6080ea0dd189c00000000000000000b0cced8fe8361aa7f219649df4daffc0044a4f48e002e17ca6624596401acd0e9664f53aab3001935ee7e1f418504002e8da06450c35d020ab2a4d9e510ee89fca196e77f12f0560000000000000000
0200000038393b82255dfeadb0fac022ce3e1783eec78ac504b50d9c0000000000000000cb8eb7cf71aeeeb94ec62e30cfef0eb203a8231e22b1ed1eb2ef263f1e4892a586604f53aab30019cd94b47140850400ccc36e54810b1412ced7a9a00b37223074c6080ea0dd189c0000000000000000
020000000d0d2b4e81465971b908d12a4213a9298acfa7e5c64552910000000000000000cbc469f068c7b093db78b4560f87aa426de78c2a7a1dc4e2b3d070d9c71b3fe85d5f4f53aab30019a3008f9c3f85040038393b82255dfeadb0fac022ce3e1783eec78ac504b50d9c0000000000000000
02000000be5a12d77b6f57d35657352ca97e6f63cf7c96418b85c279000000000000000029ed471aa72e61952ec049a6e017feab2719c2759fb57e8deb5a8cb440e2d3fbb15c4f53aab3001958d29efb3e8504000d0d2b4e81465971b908d12a4213a9298acfa7e5c64552910000000000000000
0200000081727d1330040849bde55ef61312bd3cc56a5fd25c338f1b0000000000000000e0fe553450d2009fb94e859fa5304c6bdf6e1a5ca504bc29ec00c49920e0a8cc665c4f53aab30019af038f383d850400be5a12d77b6f57d35657352ca97e6f63cf7c96418b85c2790000000000000000
02000000fb0307d0fb53e09602225ac23bbe7ed41956ecb7d24baa1e000000000000000060d1ded77639c5d5d3206fa93382ff97af2d73f50d30200bb186dbcf3fd9d3bff85a4f53aab300198fadf0773c85040081727d1330040849bde55ef61312bd3cc56a5fd25c338f1b0000000000000000
02000000f22bef36ce9113bcbcfed19855f41b892368be6ee4a303a20000000000000000df62f043351ec709ac1b9c4c5bc803aad1a200e55e32d98b876bd9ffbf5c11ffed5a4f53aab30019f624ac1d3b850400fb0307d0fb53e09602225ac23bbe7ed41956ecb7d24baa1e0000000000000000
02000000e6fc23bf68a531067151ac200b6c17f31ef36ea75ebf054800000000000000000b4cc592c0f058cd48c0f8deced0b419167481fac90e7dddc03666bcd5d0bae77e534f53aab30019101824fd3a850400f22bef36ce9113bcbcfed19855f41b892368be6ee4a303a20000000000000000
02000000cd4e3a43fcf50fa19ca3ca122bd17741ac6f85a6aa961ab10000000000000000e89391c419414cce2df6c0ae00f5b39d04019a112327942a0187451c80dd6e53ea4f4f53aab3001908489b5439850400e6fc23bf68a531067151ac200b6c17f31ef36ea75ebf05480000000000000000
020000007102b8fd502967b883062d558bbcb1934de7792aec9413720000000000000000c5676ae74f68105d8d671b3990773a0ec8d6ec3bc663a91c5ae4ea64d6d3347f81494f53aab3001923d85ce638850400cd4e3a43fcf50fa19ca3ca122bd17741ac6f85a6aa961ab10000000000000000
020000002f15862adb55833c2773f570de340c49db7722809fd3f0940000000000000000b3ed418a2282f811e3d2a90b734f1b639a6ed64a98c01e0ba032ce914ab9b73d73484f53aab30019e2163656378504007102b8fd502967b883062d558bbcb1934de7792aec9413720000000000000000
02000000101d5109c4b77b74f9fa469d665b68b3dd80d1d84dde19170000000000000000512c5c78a4f53886740ddfcd89f1387d419c0be3f97642465628683c830841f70e484f53aab30019de598b35368504002f15862adb55833c2773f570de340c49db7722809fd3f0940000000000000000
020000001e6ea1cce073efbfcd5fd45232129a7efeca5c5a43ebe02d00000000000000003b24db33c7b9b256f84c5f934d5f504d885c11b6bd5bb1ce7f14a921992dd274c1434f53aab30019012fb91735850400101d5109c4b77b74f9fa469d665b68b3dd80d1d84dde19170000000000000000
02000000877999b7a3cb95fa7729a4f5e22109cae34ee4e941c2e7a300000000000000000387ffc351b3167742fd1bf42525d8c33e0c45d5117eec38720a3ac17a21729cef414f53aab3001949b1f27b348504001e6ea1cce073efbfcd5fd45232129a7efeca5c5a43ebe02d0000000000000000
02000000f70e98f57e4af2a8a7deb52792a250e02d30a68d23d793ad00000000000000003fbf0eb8beca9bd4eed150de6f370b8610579a8d22debfffdbb02f9a183483a319404f53aab3001921d9c2c833850400877999b7a3cb95fa7729a4f5e22109cae34ee4e941c2e7a30000000000000000
02000000ce7ac68dc3123b45436cef787e839b9eedc7c963da4989ab00000000000000000e246ec6bd3d3321242604f6703e87d59c7642daf414fd5e95e1778a125ec0f542404f53aab30019d8e62d8732850400f70e98f57e4af2a8a7deb52792a250e02d30a68d23d793ad0000000000000000
0200000062122d2b42728d0b320aabf1732b31b55fad13dd32ccf77700000000000000006258cc658d5427533d85a3252d8778d550fdc15c72a7ade86a16c12459a817bc9e3f4f53aab30019e4f5551131850400ce7ac68dc3123b45436cef787e839b9eedc7c963da4989ab0000000000000000
020000009423cfc6819c7020bd42ac27e80b1c7c4f730aaea42fd013000000000000000067ba626bd952462953728eb9cb471846cbae71327a36e6a613ab8317995f577e9b3e4f53aab30019e0dcbfac3085040062122d2b42728d0b320aabf1732b31b55fad13dd32ccf7770000000000000000
02000000ccf2187358b9f1eaaa7fcf58ec2d9fb600348dfa6c2bb8350000000000000000e9b32f7cec2ca0499488cd8159d9e1be2794b20ad5d2b97b5ee9bfdd3a7c320bdd3d4f53aab300196dd6199f2f8504009423cfc6819c7020bd42ac27e80b1c7c4f730aaea42fd0130000000000000000
0200000065a11cfbe57eb93892b8a6a3c14080c483c2e67ae685f1580000000000000000fe252a834d8b62231f9b01ba6a48227a47fbc22f8007e9728636b11dd6b43409343c4f53aab30019a32afb6e2e850400ccf2187358b9f1eaaa7fcf58ec2d9fb600348dfa6c2bb8350000000000000000
02000000b04fc8a8dc72a839990c1146a8ab753d96598e1802365a8a000000000000000071bcfd14c366a576b3b05500f9e7052f7704696608272f0b61f86f6c6d469874063b4f53aab30019b5578ed32d85040065a11cfbe57eb93892b8a6a3c14080c483c2e67ae685f1580000000000000000
02000000c0d2fa1356fecf883d9a905a379d71acaa413368f2f4cb3b0000000000000000400253656db80a89b86b8f685be54be1571a4ea40540773d9101dba015f736d4223a4f53aab30019d88a29842c850400b04fc8a8dc72a839990c1146a8ab753d96598e1802365a8a0000000000000000
02000000ec1242bd5fe1fdd1b9f3736ba2eae1200cb03235c1d927060000000000000000ad21d25ddca5da312acaf1c50fec67bb18c04f2bc212e64f74c2ce0347375bc9c6384f53aab300199d0e666c2b850400c0d2fa1356fecf883d9a905a379d71acaa413368f2f4cb3b0000000000000000
0200000044e6a3529e8b18c6449f9e3e1efbda878af990fe5e4aa90500000000000000003174e12d9fa1a7aeae40d2cc8af5b2b31223dc3dbb5ea94ca1cc8bb684b908713f384f53aab30019065bd7292a850400ec1242bd5fe1fdd1b9f3736ba2eae1200cb03235c1d927060000000000000000
020000004105a5c0ea0853a02d20af3cbd042feafb8dc2f79315522f0000000000000000a1a2dea77a9d186e336ade332fc6b011c83fc44add2d83b4bded99946040aba53a384f53aab300195341aa282985040044e6a3529e8b18c6449f9e3e1efbda878af990fe5e4aa9050000000000000000
020000002d008795f0acd1e7dcdc5aa76afaba1ba31c271aab32f738000000000000000004dbad9b0b50922c369acd1c1e35bd28bb3deb59f20b2221a7ef78d417e01bd3a3324f53aab30019ac9159d5288504004105a5c0ea0853a02d20af3cbd042feafb8dc2f79315522f0000000000000000
02000000f8cbbfcbd9a5709910c5f79056ff83e9ffc43e03940a96730000000000000000db2e57c047b670986ac8f7f40992003dd711690f9ba3fe6f0967203e1bf76490e62e4f53aab30019558f91fa278504002d008795f0acd1e7dcdc5aa76afaba1ba31c271aab32f7380000000000000000
020000001e63ba192d148693cd116c484d602d5b60ae4210c9445d5d0000000000000000185caf72267125f82ea2a8d75690a6250d82739a18f8915a55cbe33a3da598d006284f53aab30019a7ee66ad26850400f8cbbfcbd9a5709910c5f79056ff83e9ffc43e03940a96730000000000000000
0200000021b148c8fc7f61a8cbab86fa917d3c4c7f6183139b034931000000000000000045e0e292469d9911d8f01d97bb83338f1583625382305441dd9bebf694a80f2cad284f53aab30019c4744f67258504001e63ba192d148693cd116c484d602d5b60ae4210c9445d5d0000000000000000
020000000248cf85be1d7ba49a2013dde6e2ebe3a8a46e342b16fa3d0000000000000000ee1f75947dff4dea62a76b6b0c60e2cc76cac26a2beacb6c5bc6788828dbbe7008254f53aab30019c9ea1c532485040021b148c8fc7f61a8cbab86fa917d3c4c7f6183139b0349310000000000000000
0200000022a85507651f1129652a25b54a284d43d1d755ee2d2ce17900000000000000005f25d77d06d7fc6aa3bb0cec575a1b9d68ee120ca6a261e0057240eff8acaa78f4244f53aab30019b82048dc238504000248cf85be1d7ba49a2013dde6e2ebe3a8a46e342b16fa3d0000000000000000
02000000e1c354e61233452e21c7d7419c9a31fbcb4ccc3c9bbf00600000000000000000a103278c41b8d1e5f9ac5f177005529b1f1ad2d56681ddc03003e07a3223ee1981244f53aab30019a95b4c9c2285040022a85507651f1129652a25b54a284d43d1d755ee2d2ce1790000000000000000
02000000d44d7f012a71a227c5f500e88e67966b9e0f0e104f2af62d000000000000000046b84388d0c0786b398f7a116e480ed9b945989ae8482a2d5c62b39cb2177fa59f204f53aab3001935ab54c821850400e1c354e61233452e21c7d7419c9a31fbcb4ccc3c9bbf00600000000000000000
0200000017aad17f4acfdc72e3bbd8e9fc885e3ccef06274e86c5b6a0000000000000000adeb010e3be1306361545949e16dfabad1275361550061801de0227470c383886e1b4f53aab30019b5b7442f20850400d44d7f012a71a227c5f500e88e67966b9e0f0e104f2af62d0000000000000000
02000000981200022c790a6d2da10be7b2e3d057885c57706f9884100000000000000000a592635e157a7ac121e4ebe71a7e2d8baaa40ea06186997a961de473bcc0e43545194f53aab30019001cdd5a1f85040017aad17f4acfdc72e3bbd8e9fc885e3ccef06274e86c5b6a0000000000000000
020000008c7c954557748ce467a11742bccf733e5df09aef26cb36080000000000000000677e01646e62e466d8a30870638848f5f2682935047da6ad9b5cbef55af050cdbb174f53aab300198d0c43221e850400981200022c790a6d2da10be7b2e3d057885c57706f9884100000000000000000
02000000bf4c372f972fbd1beeb682bb5f84169fef89cfa1ff9b322700000000000000006d9a0c989b1532ca9ed7cef4ea8c738822604c276339bad06b828a8fd6ed2ce2f2164f53aab30019923733f91d8504008c7c954557748ce467a11742bccf733e5df09aef26cb36080000000000000000
0200000054fc78066d71e469c398be1525587527302faab49f81979000000000000000004cc800d9ad02a4180a5ef6e96f13bad059c7a7fd7ae49a3e4c51d4d47963d4cfeb144f53aab30019831103731c850400bf4c372f972fbd1beeb682bb5f84169fef89cfa1ff9b32270000000000000000
02000000739d7509fc558e59272558711e7560dd3eae023f1a3f484700000000000000008981569b49984136e549bfc2af562057b01e53f3977e472e8bf1152671d6c478d1144f53aab3001930a1a7ab1b85040054fc78066d71e469c398be1525587527302faab49f8197900000000000000000
02000000a30f864fb3282f0bb533bfaf294fa71ea6d24e9a6a9bfd7d0000000000000000fc56b108ee29b70c7eff51f8ae8a31a76ecfde8cec57e32b90d29336bfe9835330114f53aab30019d28c826c1a850400739d7509fc558e59272558711e7560dd3eae023f1a3f48470000000000000000
020000003bb767b1cccc63d26553d2ffac3bf8d38648b986e0f7c17f00000000000000004af836f012bf26e6cd03c6d844c7c321aeaadf571f1556fad1fd5f9ffc1c5628e70d4f53aab30019714eb9e219850400a30f864fb3282f0bb533bfaf294fa71ea6d24e9a6a9bfd7d0000000000000000
0200000039a5d05c2762372ddafba55b2f57406cb3e6c874fc770e950000000000000000327ffc418d5daeec95a0bf5e07eb55171636e62ca9d539302d4fb7b4f79a38ecd90c4f53aab300196d1fd401188504003bb767b1cccc63d26553d2ffac3bf8d38648b986e0f7c17f0000000000000000
020000003b9343ae2bad5197438df09269076707f328d806f3c0d51c00000000000000009fd2c1de375bdfb2ace14b0236a14bef281fd8d404944053a9fda7a4a376b44f2c0a4f53aab30019237a8cf11785040039a5d05c2762372ddafba55b2f57406cb3e6c874fc770e950000000000000000
02000000a079768528b9ef1b365b313553337d5fc6e403fb5d3de73100000000000000003992d23c20b895f9fe71994bd03f885c13dff7141117dae130a5f7e3f6c0e45725094f53aab300194843f437168504003b9343ae2bad5197438df09269076707f328d806f3c0d51c0000000000000000
02000000423eb273b0cf153fbe42b6cfe544f48f1c4991f6fc3562660000000000000000cfc95644d97a0e9e2f04b7139fa3ad891f9fc5ce7fc63ff95cf59430623950e369084f53aab300190c5670c415850400a079768528b9ef1b365b313553337d5fc6e403fb5d3de7310000000000000000
02000000af28abbb9ed1305d9aaa0f6efeec9021b864480b5e7935a40000000000000000bda0ab7dd66310642e6b39f135f5303f1872e3b3b5d0ce4b1d7423af5e95dd150b004f53aab30019e5b545e214850400423eb273b0cf153fbe42b6cfe544f48f1c4991f6fc3562660000000000000000
02000000331a74f700fefabfdf1f1093bd36576bb00d7c6d9dd8713a0000000000000000482eecd9a424899a7eb6ae85bc0b9d5519f5fb87739ea6c13f9668a40ef17a39e4fd4e53aab300196e5bce5c13850400af28abbb9ed1305d9aaa0f6efeec9021b864480b5e7935a40000000000000000
02000000a0310d422e8a7f095ef38b461631a772eb8d1f9dc4bcae3a0000000000000000a6a4469562add71b42286a3033f27d8d027c186b1640735ae206536825b79b0152fd4e53aab300190b4a4cbd12850400331a74f700fefabfdf1f1093bd36576bb00d7c6d9dd8713a0000000000000000
020000005cfeea1fc4b068f75b30b35edd263a8ffeb90778f6de1c20000000000000000069c107d2d425598fc8352a050d2827b6657e02a0eded7bca667b10910ad64a8f30fd4e53aab300192c5b667611850400a0310d422e8a7f095ef38b461631a772eb8d1f9dc4bcae3a0000000000000000
02000000c495295ebb9eec9333aceb2c124cae92a3b43c3a4b60a28000000000000000008e189eeab9d432eb27d4a35fc84c538031f2397c8df52d6eb242be1c659c03e89efc4e53aab3001994c92316108504005cfeea1fc4b068f75b30b35edd263a8ffeb90778f6de1c200000000000000000
02000000ad09610c309bd28cc9c9d036f6ece1797bf6f5be681394790000000000000000ae9e1173bd110c3c9abd91f8a078949e221b3bebbddb0070626aa061056ce29d6ef64e53aab3001963bc9bac0f850400c495295ebb9eec9333aceb2c124cae92a3b43c3a4b60a2800000000000000000
02000000ebe9e64039e239a5c40498e886b0498d6903a8d364df89200000000000000000a15f0a52681c1bc1c7ad2fa1ef32047d60b3d07ae852fd1ea8b73acca9fb1fea51f64e53aab3001923e35fdc0e850400ad09610c309bd28cc9c9d036f6ece1797bf6f5be681394790000000000000000
================================================
FILE: bitcoincashkit/src/main/resources/MainNetBitcoinCash.checkpoint
================================================
0000fa272fd14221bb34078aa748fa05c33ede7b7dbb380e4f6a7e000000000000000000c99855609b8d0e0f8ba9114eaa0885f384fa9c15e436e2ee3cbe0683caa2406f47a3ca694f36011853bdf29aee690e00bbc51b428e139b7f64e4ebb4246a8efc35a8a0d0e761e5000000000000000000
00405221dc1942796c2587dad65cdcf6948bafbe8995f1acc42c30000000000000000000a96c8d6094e715fba9f028bfac89dc59b29b5d9a289d7b8b9e227afdb7c9ac69ea9fca69ed3601182ee43da7ed690e002fd14221bb34078aa748fa05c33ede7b7dbb380e4f6a7e000000000000000000
00c0473c32b4969b8e1a6143b1b514e2dddbd2e2fb58fd9a105cd6000000000000000000e5b8d7fc2aeea524281d9d2914aed067e6715f2bf8403250b8340a1aa2994862839fca699d370118f4a584e1ec690e00dc1942796c2587dad65cdcf6948bafbe8995f1acc42c30000000000000000000
00c0b131bf0267373d7a0cadb668538c35b0d1cc25442a3f3de1c6000000000000000000849b371c00e741ae0c33954e557bb2fca6b7c9894ea177cb77e13384718f275b509fca695338011834785c29eb690e0032b4969b8e1a6143b1b514e2dddbd2e2fb58fd9a105cd6000000000000000000
00000026228c4f10ff851d148c6fb56f43397b26d7abcdd36c25a200000000000000000011b3a81f152920895460a12c152fd43aaed89ded81e4f624db09159b0b49751b309fca69f9370118a15121b9ea690e00bf0267373d7a0cadb668538c35b0d1cc25442a3f3de1c6000000000000000000
00000020a0202dd69317d2c6acfb6f0acb3e016f01d7871695018e000000000000000000a95e3317f455d60091f7d1445011645c2cb0d525fe5b2da3d60ef26b3dd7394fbc9bca69d537011855bcd54ae9690e00228c4f10ff851d148c6fb56f43397b26d7abcdd36c25a2000000000000000000
0080e631c16ebb60b26d2192abcb8857df48a3712d93042bb3002d0000000000000000006cbf8a498a480e2108f4b153d3d53163a48a7d1aae335181fb43ade22dbb44e3f698ca694b3801181211128ae8690e00a0202dd69317d2c6acfb6f0acb3e016f01d7871695018e000000000000000000
00006020c6024ae2f28440d871a7144b1f9c73c91713c495034414010000000000000000456c57690a19117a7e4c3e64ca0bd173334662e9570d88afa0b43f5fae4fea1c0b98ca69d138011859b6195ee7690e00c16ebb60b26d2192abcb8857df48a3712d93042bb3002d000000000000000000
00205d2848af7fd5ba80ee7fefa0171f7014c3166549d395b9ffee00000000000000000097197c723ba84ad85ba551aadfdc823bfba4a0fcb79cbd6ce1849e8e8c9a1de45497ca69a538011836b5cd65e6690e00c6024ae2f28440d871a7144b1f9c73c91713c495034414010000000000000000
000050248940bf978d9e598fac9c4e2fdd90265708b544d0db8f300100000000000000001886825ca108eb33a688bc9416792d739cd8e232fb4213e970e15ede5abb3ae27594ca69f1380118ea33c680e5690e0048af7fd5ba80ee7fefa0171f7014c3166549d395b9ffee000000000000000000
0040d22537239c2d3d24f83f986abc69ee4919e744fdf4d4373b7e0000000000000000009d2d6a5415880fee4a68f1f47fdd966089c318ee9dcacf8047ff9fa5483769b30a93ca697e38011834898801e4690e008940bf978d9e598fac9c4e2fdd90265708b544d0db8f30010000000000000000
0020f52a8235f7bb692c937be8cb23bef8b96c8efad4d4a0c5b022000000000000000000dcf379ac866fe6ba637aa9b52891f280ecaa816cec3a7645d27c43c375d760604c8fca69233901181118694be3690e0037239c2d3d24f83f986abc69ee4919e744fdf4d4373b7e000000000000000000
00208c23b7410977965931ddc9e86f5afa5be117a720cb38bbda2a0100000000000000007ecad4dd77a8138b6d15386cdd7770879df7a34a6dbc5a5ce192e5835f6015aff38eca69553901188fb0e2a4e2690e008235f7bb692c937be8cb23bef8b96c8efad4d4a0c5b022000000000000000000
00e06d2af3baf8a20d0bcae765f4e73aa3c828916c748d967e9eee00000000000000000060f259564a222a1c9915339709a563db4ce850d805061e870014e6f9d5de57a4368dca69883901180f13464ae1690e00b7410977965931ddc9e86f5afa5be117a720cb38bbda2a010000000000000000
00200020afd0e74736ab8e06f9a18cd0e1f7d2ce7fa0b9bdcf90b700000000000000000064330a5110c883009456f96b271a180da884c0561069c227b8126e92694949f17d8bca69473a01187b2e2a97e0690e00f3baf8a20d0bcae765f4e73aa3c828916c748d967e9eee000000000000000000
00e0ff3ff23181cde48b0a35ae8780ece0e2e05f9a30995563317e000000000000000000b39d4b8d8e8216765cc801f4cf74564f8c1558e6dddff8a5cedb0ff9cdd02732748bca69fb3a0118b5cbc453df690e00afd0e74736ab8e06f9a18cd0e1f7d2ce7fa0b9bdcf90b7000000000000000000
00607f250be62c38c3f2758e032efae3cd5d94dca082916399293a0000000000000000008579ac2b3df2fc8f267eefcbf1f6391f564ac10b935f3a8377b03f9d7a826db1468bca69023b01183ac55657de690e00f23181cde48b0a35ae8780ece0e2e05f9a30995563317e000000000000000000
0000ff3f750d79a46750f70780092ba9076f74da5484b4e281e628010000000000000000f3350d74d8a7b479552302d49ba08fd6563d68f9b9ca44dff262001a387220430789ca69ef3a01189eacc827dd690e000be62c38c3f2758e032efae3cd5d94dca082916399293a000000000000000000
00602b21c8d1c8644566ec6662765aabd9c87d541dff4be43efaf1000000000000000000ad6584557336a280e663b65ae4f9971e68b6ca06a91e5d6775502c8c1f43498e6f86ca69613b0118093461e6dc690e00750d79a46750f70780092ba9076f74da5484b4e281e628010000000000000000
000005207e8a72135e9d70e2b257b0a0ac0000e2ece8f13ee1f006000000000000000000d89a3dd1944f552efe2d92310f28f4b447af9ed212b8a62d373d3b23098d040a7985ca693a3b01189553c608db690e00c8d1c8644566ec6662765aabd9c87d541dff4be43efaf1000000000000000000
0000ae259b9cf511cbb948d78cfcfbcad37ec8ba2594819369bbd50000000000000000006b6a261537a1b084af8b6ff7a2949e4eec7d24f0c499e433e881e18e5ca162e2a882ca69e83b0118017cee1cda690e007e8a72135e9d70e2b257b0a0ac0000e2ece8f13ee1f006000000000000000000
004006203c1622b6970ebb9a70c587328da15c00223ba26146c4080100000000000000002e7b85be0412d5378536dc5632b53f36f30f73a4d456be243ee7080673c52d526882ca69a23b01182c749d5cd9690e009b9cf511cbb948d78cfcfbcad37ec8ba2594819369bbd5000000000000000000
00e00620a58250dd46b5609a11a6bbfa5a5c787c4a99bfc06c4ca0000000000000000000854d911408613c39a8cafe2c050e5f9996ece46764caa4dc97d1bc6960837ee2397fca69d73b01183fd7a558d8690e003c1622b6970ebb9a70c587328da15c00223ba26146c408010000000000000000
00c0e029c9e2cb65605543ab809b26325413e395aed4619e5e67ff000000000000000000beeb4e4bd78aaf2b18e5cd6c72f220e92582b18d5d1e2e156ff5f6366f097318827dca699b3b01183874f238d7690e00a58250dd46b5609a11a6bbfa5a5c787c4a99bfc06c4ca0000000000000000000
00e0ff3f947c2d1dd261f1f26840ff1820de5edea1651f9b8ae7be000000000000000000087cdf61d310d52cd2987719e8430c5808e3b219095db7cd77ff6c6de430525d747aca69633b0118bd513ec0d6690e00c9e2cb65605543ab809b26325413e395aed4619e5e67ff000000000000000000
000000207cd957a77a95abca7c069d33c4d6534bef207a094472a6000000000000000000e6484e1a7ee2bf9c688c760dfe8a9faaa3f40e1f853a570bcfc2fdec69fd2cea7177ca69a73b0118df9cfa8fd5690e00947c2d1dd261f1f26840ff1820de5edea1651f9b8ae7be000000000000000000
00c0122260be8c5e4eb8e43553f4a66b5fba05ef31aa2e2f49ab35000000000000000000242e4d89d6b8cda569fe7fa511de04c51d4d798a1c1686b32ad9bdad4546ac80ea75ca69673c0118be014ff6d4690e007cd957a77a95abca7c069d33c4d6534bef207a094472a6000000000000000000
006014311f771ea7a5854d4a5df9c9b1551c667ac5261873c97fc90000000000000000006f09c46d6a008a1fa1703fb4da7bbb849363a26cbe4a17f17f65f5f9da4f03a0df75ca69cd3c01183de05902d3690e0060be8c5e4eb8e43553f4a66b5fba05ef31aa2e2f49ab35000000000000000000
00200220c475572e0b82ad03e41ea2cd5dc182d04c8cd5e3530d680000000000000000006bbfa7c18951974bdc28ff75d8c3cdf97393f2add46114a4640594001527ff14c174ca695b3d0118723174f1d2690e001f771ea7a5854d4a5df9c9b1551c667ac5261873c97fc9000000000000000000
00805638f35e7999c74eecbdc60b9424680825689103fc1efa496e0000000000000000000d8c4d50ae7fa40a768505ccd4e8c5672769078b38dfb26123b4283d5e856f0c1974ca69a33d01181ebbd0a1d1690e00c475572e0b82ad03e41ea2cd5dc182d04c8cd5e3530d68000000000000000000
0080842a77e98bcd2d7361e4bb357f277792bd113b2dabe3e05927000000000000000000faa053042be2305581fc0f95629dfaa5749218cc59250da827c3ec8cd988da059e72ca694f3c01186278761bd0690e00f35e7999c74eecbdc60b9424680825689103fc1efa496e000000000000000000
00c00620a4544192a355287053f3d6c35c7b4f957f70aac07344a50000000000000000007ece2f73653f69616c1737e7f4e8344208b1a380d2b8173de1aa867aa59cdfe8366cca69903c0118416602d7cf690e0077e98bcd2d7361e4bb357f277792bd113b2dabe3e05927000000000000000000
008055272737973e90d4c6c3f6b470ce086238c168ff6ba276d4fd00000000000000000086c1c10c7dd257b230329fd32367c0696afd22545648ab0a178f6dae5961a056a66aca69933c011835d6e1d4ce690e00a4544192a355287053f3d6c35c7b4f957f70aac07344a5000000000000000000
00404d2ad8ed3a951d7b51caaafb6aac80789cd8cfb75de948c7100100000000000000008553e1b0db69265bd492f237bc0d6558cf9ed7d77de16435db78658ca3f2d94b5568ca69eb3c0118cb159d62cd690e002737973e90d4c6c3f6b470ce086238c168ff6ba276d4fd000000000000000000
00e01320d270276861b0864838ce1f9dd699a6495cbb33ec02ed1a00000000000000000038b1c0c880e96cad09c4d83d1ad13d921b6f1b9bab60f45505d6cfbf7fb05e390f67ca69a53d01188bb8ca50cc690e00d8ed3a951d7b51caaafb6aac80789cd8cfb75de948c710010000000000000000
0020d22688e92d7b93386f5c0f0f02d56a8c892377c030528dc75b000000000000000000320f9d8c5b34bf2b854019ffed30427e19b284ea43b5ca806260c88a93158850ef66ca693c3e0118409839b1cb690e00d270276861b0864838ce1f9dd699a6495cbb33ec02ed1a000000000000000000
00000d20825499e1bc8b7dc8c3007319aa5e7921daa4373e1c3087000000000000000000218c7e5194f237f1ca45af3469c8821a32466ba4601c927ec403c27be67196416366ca699b3c01188f9f222cca690e0088e92d7b93386f5c0f0f02d56a8c892377c030528dc75b000000000000000000
00a00a207df9607dbb25ac5ca7f09a2339110d00715a11e761311a000000000000000000fb9ff542d08ddf36c87f3c0a6abfa49227b2864ea50544d2c5925e23cd6523a30e5fca69de3c01186fdc4f7bc9690e00825499e1bc8b7dc8c3007319aa5e7921daa4373e1c3087000000000000000000
00407c280166ab240b83e7ee9a0e1e91ecc5faf7bc22850445c109010000000000000000f2081580d42b52da463cb073d9e3915069e0ae1d43590d66b583a838016b6149845dca69993d01180b3a2cf6c8690e007df9607dbb25ac5ca7f09a2339110d00715a11e761311a000000000000000000
00000032d31f152b4fc0585b7cc7b9560a428603b1491fbcdc7e15010000000000000000805f0aa3fe6721faaa189675ca53e0bbf745aab822b69c0036072bfeb7536463695dca693d3e01185e3861afc7690e000166ab240b83e7ee9a0e1e91ecc5faf7bc22850445c109010000000000000000
00c00a20d0b5121c7116c832dd946c45683c00901779ef936064c1000000000000000000275c33e4bcde3b60acd5ef292c0659ab9a1cd780e4f8753b578d37581a8ad47b085dca693d3e011866ae790bc6690e00d31f152b4fc0585b7cc7b9560a428603b1491fbcdc7e15010000000000000000
00403e281ac4fcf0a82ad0bca236dbf0055e7d0c02f0d4fa56ad930000000000000000003a8ec1b9f0a49677ff43c0f3bc2850b950a5e612ca8b5544ef792b618b436db2ac5aca692c3d0118a02a9905c5690e00d0b5121c7116c832dd946c45683c00901779ef936064c1000000000000000000
0040b425b65671a293c35270171b8882fc35fe9b3b0cb383a0133b010000000000000000b48179d117c56a9e87287de059f305afafde8d57f31fcdac0934bff856f2b5191055ca692d3d0118580eaea4c4690e001ac4fcf0a82ad0bca236dbf0055e7d0c02f0d4fa56ad93000000000000000000
00200424ebf8fb45d71f7ab784946abad759b846d7b2270c6ea7e30000000000000000008d14a8e50c114190df63ce0c6a980cb1d470788c60ffb10ce0cecd0577fa281cbd52ca69563d011828829c5fc3690e00b65671a293c35270171b8882fc35fe9b3b0cb383a0133b010000000000000000
00000022940d862db382954844b135e9393017034c6eec9121bccd000000000000000000aa14be8f01ae2cabd46a72e4de1a989ead54c3b8a9cccbcc963d305b85861607e550ca69b53d011897580fa5c2690e00ebf8fb45d71f7ab784946abad759b846d7b2270c6ea7e3000000000000000000
0000e0208a7d8c042e45c7497ceab01897cb6959a31048236fad2d0000000000000000004aaf2b78fb02228048c1abbdec6a5909986e6296d560cc8e9514c8a881a43d08b04fca69043e011806158bd7c1690e00940d862db382954844b135e9393017034c6eec9121bccd000000000000000000
0040e2220a0ccbd2f534df96bba87a228d85ac982cbf15103f731d000000000000000000a43935a741d1d1e842bc2675873747450c2d84281b70691e2ab17774f33ae5c3464eca69493c0118ffb854e0c0690e008a7d8c042e45c7497ceab01897cb6959a31048236fad2d000000000000000000
002000202865e1158705a133ca83a1f66cc5e64c05e8e8200b1c5100000000000000000098ccc5a4010739feca6d39aee4a6ff8a0e45d9b793eb39345dd8e00c59d2f355a246ca690b3a0118681a78d0bf690e000a0ccbd2f534df96bba87a228d85ac982cbf15103f731d000000000000000000
00e003202563391e02b3cfd63edb8f1aff565a092b6eaf7959c06c0000000000000000004b32b3b28cf7b4c3233c41410f7052cb550b00759e489ac9eff9a174ecd818a5603dca69823a0118348d87f9be690e002865e1158705a133ca83a1f66cc5e64c05e8e8200b1c51000000000000000000
0000003c844d3286406d0f0e5ad3f0bc0f35693a22659e512ca3fe000000000000000000cc153a28df25a39830c6a3d89b2e498462dbcc9e71d56c1370736d84ac321182793cca690d3b011859d13eb4bd690e002563391e02b3cfd63edb8f1aff565a092b6eaf7959c06c000000000000000000
00e0b927eb8a652b62b53c93c114928f643bdf37bbf3aadff1eb390100000000000000002be800a73f1b61437d44629a70f7f6c6aa4d9350173f44c98d1fedc47a4a437bce3bca69523b01187ede799ebc690e00844d3286406d0f0e5ad3f0bc0f35693a22659e512ca3fe000000000000000000
000000346da27058761802db900984ea54de8bc52a64669ba9185c0000000000000000005e5a1790534553e4fcfa41d6ea1485a1d1186b46601ccd0528b055dba651d9be4b3aca69323b0118e7f5c814bb690e00eb8a652b62b53c93c114928f643bdf37bbf3aadff1eb39010000000000000000
008000206d3bd8160d4070d625315d2823c4821ede63caab02eeee000000000000000000f63f29d6ea0d67be48b0186e30c500ed29a1392bdf07dbebcdad0f5a07f3cf2e8f37ca69e83b01180a94e90cba690e006da27058761802db900984ea54de8bc52a64669ba9185c000000000000000000
00006020bef0052eb03f2b68e86b36c5ebb28919b230c2a87ded79000000000000000000d811f1f9815756987d3b8626dc38c23e31ef37ff26fe60284ca4e94523e010e66637ca69173c0118633885c4b9690e006d3bd8160d4070d625315d2823c4821ede63caab02eeee000000000000000000
0020042064e531d38f9b3d84fdb94f667bf906e623aae6b45c6b3401000000000000000084612f7a0aa1b10da4911bf89a5cefbf5c2118e725131dafd9e5b41aeec72319a235ca693b3c0118ee4c27d8b8690e00bef0052eb03f2b68e86b36c5ebb28919b230c2a87ded79000000000000000000
00000032a7e644a5a4c1716917bd1875def3708bb94189b499a6360100000000000000005a749ebfe3e3a5a6b8141c79cc9cb0715ea459463ef4c87aa9e76a03ead4b462b833ca69dd3b0118affce802b7690e0064e531d38f9b3d84fdb94f667bf906e623aae6b45c6b34010000000000000000
008001201400a35e86f66678ccef2effdd88125b58f7e6e9686a04000000000000000000255d2a8fe611ae287fde0a0a3563643a1cca63b0b0f1dc86483d50a8cad7bfde4030ca69953a0118211fbebfb6690e00a7e644a5a4c1716917bd1875def3708bb94189b499a636010000000000000000
00001020b68fee1eff69b26e2b7c707d10216708522f4b45edda090000000000000000007d30bfd8a6c721484bf920a6ed23fd4f2c049b83fd932c06a3d93270f47e9e70f329ca69893a0118c9702d22b5690e001400a35e86f66678ccef2effdd88125b58f7e6e9686a04000000000000000000
0020c0275daa501e42fd71e847333613c0c403e26e38f33fec1700010000000000000000933a29829daaa79d434b632505d20ca710ee28107b2ae9f973b2ce83b2e2cd957627ca69243b01184484bb17b4690e00b68fee1eff69b26e2b7c707d10216708522f4b45edda09000000000000000000
00a0c327ecbc1810334ed7036f39c26a27e84f3c9563d93adc311e000000000000000000e78d2f0d19ffa494fda2384911f2a4f255de7e79c9c378a5436e525575b0aaf3fe26ca69d03901187f9a0d7bb3690e005daa501e42fd71e847333613c0c403e26e38f33fec1700010000000000000000
00000020e871a7b26697a6189b8f6b8ae5a8b1e0b5f6cebc69c6300000000000000000008d8798deb40807821de6083f238c76f479fa9dc475e70e1058bd99d063ef57bc8c20ca69b8370118c9c7170eb2690e00ecbc1810334ed7036f39c26a27e84f3c9563d93adc311e000000000000000000
00600720e17232fcdf784a22acb5ec6cc89255a3452d5571532c2a010000000000000000a9fedb5c358ecc81a37b8b6791294a87f2dfd7c50116c5b16658c4eb69f9fa9eb517ca69453801180c3337eeb1690e00e871a7b26697a6189b8f6b8ae5a8b1e0b5f6cebc69c630000000000000000000
002000206f1b66c37e46a09b151bdb6d897c68e3fab2c371a08fe5000000000000000000b7d22ef099f871af52251659ed12b6c6c135c950054e6c8b1d67b8ad2cd868111017ca69de38011833f51a67b0690e00e17232fcdf784a22acb5ec6cc89255a3452d5571532c2a010000000000000000
0020bf226b96afff8d956e99abed00aaf298508b26008db8ce5d2a000000000000000000c7eb5d8d8579fd379e8ff606e641b386c0622e8ce763bb021a136e527a543a849616ca69023801183e0198dcaf690e006f1b66c37e46a09b151bdb6d897c68e3fab2c371a08fe5000000000000000000
00e0602441c97c78defddb1d384c2abc905be33b386e033bc8ccb2000000000000000000bcd3a5978e5a8d5982058f4d7f886f8b79886fbae2954df2eb4e7101daebef779111ca695e380118f79e4126ae690e006b96afff8d956e99abed00aaf298508b26008db8ce5d2a000000000000000000
0080d7297497e379aab2816bc1e1f7599fe76e7cc0183963c5072700000000000000000013ce2596bb23e5aaeaa32922ded4faff1e70f774a2efafcad112666a22daa0865710ca6940360118ce0012d5ad690e0041c97c78defddb1d384c2abc905be33b386e033bc8ccb2000000000000000000
000000204fc7d2504eaaf9f05d46eb1faf3a3699be630fd2f5dcba000000000000000000217ee68612cca2fedb5dde5ba8e4f56bfabc58fc70db837d4cd4bef8c6e12c9d6207ca69df3601185e6c2d7dac690e007497e379aab2816bc1e1f7599fe76e7cc0183963c50727000000000000000000
0000003478e1973a51be122418de2d46a4f5be3783cb66e7ad2f900000000000000000005205baed23c8242d416e4a1f38b71549fc27d048885d44ba77bc118eb4c75cabff06ca699136011875443141ab690e004fc7d2504eaaf9f05d46eb1faf3a3699be630fd2f5dcba000000000000000000
00207325e2a67d664f2475499dbbf38df7ed443a5fac4d0bbd4bbb00000000000000000037acdde0511767f59194aaffc9f3e7687c3d20052ac06581aa5dbae6d87a5dbab103ca69c8350118207c32afaa690e0078e1973a51be122418de2d46a4f5be3783cb66e7ad2f90000000000000000000
0020152320588b5468bd5fc2754b6bd3d95a847a98aed4aab86443000000000000000000f42a9faf305cee175ee035ab23ac3102fb6ab96431d3a7c2138bf245b1300055e0fec96991340118550285aaa9690e00e2a67d664f2475499dbbf38df7ed443a5fac4d0bbd4bbb000000000000000000
00406e264d8d8f3a9224e348b826637d56978d7929bae8f0a437cd000000000000000000a29dbac9e9e6643479eac198ddc7f07f67d17957f6c083208e05d82a4827c0f0b4f8c9695334011822e72e42a8690e0020588b5468bd5fc2754b6bd3d95a847a98aed4aab86443000000000000000000
0000003eee72bef480ac058b4770af7ee544628ee2bb76d2f76611010000000000000000fa190079d15ec14f916cdd64068aaeb9a684faa6cee2048b394ca649472548a497f5c96935330118eaafecb6a7690e004d8d8f3a9224e348b826637d56978d7929bae8f0a437cd000000000000000000
0040a43fb776eca5021b6441bf01590609fa50a9102c0721cc627a000000000000000000628155c4066d0aff0890ae2f88ced91f307c814e30786b3f0df9d0d353e66cc1b2efc969ca3301185d35ee22a6690e00ee72bef480ac058b4770af7ee544628ee2bb76d2f76611010000000000000000
00a01820fbb0c97c6a98d3df866be54af0418711c47c62685682ef000000000000000000c896dfd18ea1b95ae1bab9d97b3bae7b0b2e8f31bf037e69beb6242173ba06a336efc96945340118074eca97a5690e00b776eca5021b6441bf01590609fa50a9102c0721cc627a000000000000000000
00000024c2717b677ac55230c435ea6726c567fd3a826f124ebcaf00000000000000000021d69f08fcc9ec06b7d994c89f47439f30042d26ef8972e944be9d87aa599e3564eec9697f3401186e11f711a4690e00fbb0c97c6a98d3df866be54af0418711c47c62685682ef000000000000000000
00000028d5abc2080439a604b12de93da57bcb96d70e5c2f83b273000000000000000000d2032ab7fe2b04ee79a6d3db035851da6bb4e5bb837ca691312ddad76303e6b1c1ecc9692f3501182461dbaca3690e00c2717b677ac55230c435ea6726c567fd3a826f124ebcaf000000000000000000
0000002a3b187aac55e6b61ed07d9bb2e0694be23e312066ac364d00000000000000000076a125fadba6fae9ba71f6e8b45c1b97623eab0439a6a1adcf9e059c6911712e97ecc969b235011853a60081a2690e00d5abc2080439a604b12de93da57bcb96d70e5c2f83b273000000000000000000
0000003678b7314b624be44c01e6a082f6b341ea2e8377be9c45b4000000000000000000fbee17d187acc0686ca9d6bc882c1c20070f23ac4ef36bbe0af52e8c00d639a3d9ebc96972350118a4a510a9a1690e003b187aac55e6b61ed07d9bb2e0694be23e312066ac364d000000000000000000
00a03d2865201750790c784bc1e375e44d71874a8973d5c273e235000000000000000000795927e4abe89d27037b78641fb4a344c3289bbef03f65869c306fa559d1b559bde8c9695a3501187f2971f1a0690e0078b7314b624be44c01e6a082f6b341ea2e8377be9c45b4000000000000000000
0000ff3f45bd9c5fb6dca7721e170611785f4a3618fb73b716eae60000000000000000003b2db82dc761bf5bd6e0e62e4131ea15e1b1c2b7a657e9a45be58ac09456a86015e6c969f8320118bbf83e079f690e0065201750790c784bc1e375e44d71874a8973d5c273e235000000000000000000
00a00420b0bf2d9d82bfcec8b5f9a449adb702ef43b07b72ccf444000000000000000000599d1723f71eef8ea1cac5fe73a1a0094d46fde1e2e7e87bffbb4d700d3d70ab2fdcc96953330118a77b76ec9e690e0045bd9c5fb6dca7721e170611785f4a3618fb73b716eae6000000000000000000
00c000208d4dd1744ce7d343180d53fc45a6d739bad0e9a1cce003010000000000000000c987d0b0d6eb630f9a0437405fdffd2993bc0b3e91806f984c595d7221ffdb00fedac969cf3301186aa16c339d690e00b0bf2d9d82bfcec8b5f9a449adb702ef43b07b72ccf444000000000000000000
00c0a4319e6ce868858bd6819e2e522873f561cac73be9c87c30510000000000000000009526e22c47604263d831f2b02c5611596fea6f87aed38696d34eaf3fa2b13a392ddac9693134011842ce249e9c690e008d4dd1744ce7d343180d53fc45a6d739bad0e9a1cce003010000000000000000
0020292955f0e2a015ac25716a3ef05db2ce0a3ce9c0305c014ad8000000000000000000bad5acf66518d6d8d4c172b7c197f8e6167991efb8c1dff1a34dbbef88891b9209d9c9692333011882d2a3c79b690e009e6ce868858bd6819e2e522873f561cac73be9c87c3051000000000000000000
0040ec2b611295edc1175cdf761b4a752d0709089113d9ad619f1f0000000000000000001aec1df0128ccf0848e2b3303770ca1de11ef57b128d3112cbab5a434db3fa4d5ad3c969bc330118415946479a690e0055f0e2a015ac25716a3ef05db2ce0a3ce9c0305c014ad8000000000000000000
00000032dd3c3e0b441307946ca1481034482ecb8da4d76870ceda0000000000000000004655108df8ccaa71bbeffc34ae2d0f40f50fdd7499e614ce905bf51a229eb030ead2c9696b34011859f304e099690e00611295edc1175cdf761b4a752d0709089113d9ad619f1f000000000000000000
0000002055f3c8f435bdb9d4c652920d58c5e30a15fcc628c962200000000000000000006131019d4a61576e51147f5d15f17c7d266e3d9520f505f7798b7fd2e11399dfbcd2c969bf3401183c5c70a398690e00dd3c3e0b441307946ca1481034482ecb8da4d76870ceda000000000000000000
00e00220bcb28b7dab5ed21f2367dd8496906f2244855c60191ee800000000000000000031069b52cc489528fc7ccc2860ced65084eca3937fa22282dbfba5d575a035fb6ed1c9691d3501183e6934c797690e0055f3c8f435bdb9d4c652920d58c5e30a15fcc628c96220000000000000000000
00201520eba19ac7399a362a484a195c7f6088c8152658111b001d010000000000000000f683a15ff8e584c0489580ba3d170568b9026835e258e21bdc69449ebf8588493ed0c9690535011859c6c83396690e00bcb28b7dab5ed21f2367dd8496906f2244855c60191ee8000000000000000000
0020fc284f118fb2f21ae0b387a45f2aa33947f27ffd7f16f54023000000000000000000502ef48430f00a20374fb254d2551d2d1a26922babbb37dfec1fe1f3c414ede999cdc96965330118080c32ed95690e00eba19ac7399a362a484a195c7f6088c8152658111b001d010000000000000000
0000002a59dc25dbde3bdf98e04d558eb8558aec43daf55921e9cb000000000000000000921a0daa5c538f4d2709966affe5c9dafb1569e52d4a528f515d2eac0db1d9051bc6c9696933011813e7893794690e004f118fb2f21ae0b387a45f2aa33947f27ffd7f16f54023000000000000000000
0000003690f3079ead0e11a10465f65c65b32fee868b694cde0c030100000000000000006abe4166dda1adfc3207d83572adb28e70ab22872b79fd986b04b3d6ba18bd62d1c3c969ef33011885f062b193690e0059dc25dbde3bdf98e04d558eb8558aec43daf55921e9cb000000000000000000
00603320da95786d27f9764988f0f12461fa45d4822535cac95a0e0000000000000000003e7ed002a46abfac300d1d4eabd170ba1ddce0963271c3ad0d555e90c7b48f2423c3c969c232011831f1a39092690e0090f3079ead0e11a10465f65c65b32fee868b694cde0c03010000000000000000
00209922989c662610b1c67c35ca3cc4dc2091bfe351dd28e67903010000000000000000303656c085e934687a2076f3d603d09c67a0b02452c95455e86beac09fc43dd00dbdc969f53001183f20a0d591690e00da95786d27f9764988f0f12461fa45d4822535cac95a0e000000000000000000
004009278d217ea8cb11ad32f56ca9031d91ce979efa17ddbeff6c000000000000000000950a478142d5d26f0d6092986489b5f7f2a7b62290d1ba0866ea545fefaf6015f8b4c969083001183d6c077a90690e00989c662610b1c67c35ca3cc4dc2091bfe351dd28e67903010000000000000000
00400b2046ec1cf574ed6b9538b552379e8e28d5af9f638f7f40320000000000000000005320793f292fd57696324a8de1c76794255cbef5fbcf51a82a8b173645113b6aa9afc96985300118a5bf81458f690e008d217ea8cb11ad32f56ca9031d91ce979efa17ddbeff6c000000000000000000
0000003a7cd9e7b4ebc972176b76a38b28fc1945c9bfd9b9a0f8a60000000000000000006820e6e8d6edada9803d3fdf907951fbf67a9355dadb84e181099790773023d4e0aec9696430011849f488b28e690e0046ec1cf574ed6b9538b552379e8e28d5af9f638f7f4032000000000000000000
0040c52a2706913f4cd37b5169f80a551d2170284ea64eae134c6b00000000000000000010306233656ea1701d7e8a4d03d603c392f8f84fca5fc57f84d4e7a9ac3782da20acc9691e3101183975af808d690e007cd9e7b4ebc972176b76a38b28fc1945c9bfd9b9a0f8a6000000000000000000
00a09d2549145736a8cc741491d077615d78a216fd0c8b075cecf7000000000000000000c70f1e9feee885ebf10b4a2fa4d0d913c5f55548c192fecdef8c7e5b8b4269481bacc9695a2f0118311021cc8c690e002706913f4cd37b5169f80a551d2170284ea64eae134c6b000000000000000000
00801c3f97dcac3fa69ce164f4e998612128950e1aec84b2e8664e0000000000000000009dda8283d992bcc827b20a47de72950b801a4ce48ddd0d258b5c883da804e50c1aa4c96905300118b42e96e28b690e0049145736a8cc741491d077615d78a216fd0c8b075cecf7000000000000000000
00400120a19408ef8355f5a39dbd8d365d316fef47b35039260f16000000000000000000f11a1f7f431dbfbdee643a41ebb34e298ec21def3d9c6d0669a3399096ece6b1e6a3c969bf300118696f50bc8a690e0097dcac3fa69ce164f4e998612128950e1aec84b2e8664e000000000000000000
00c0a532f14acf5d67a87fba8dff71bb6f025614c9c74ad49b98d500000000000000000058ec3f19b90e4e895a54b27d3f3d54afb22ab931862c1d8e18be8f32effb9ca8e3a3c9696c31011898c2d43f89690e00a19408ef8355f5a39dbd8d365d316fef47b35039260f16000000000000000000
0000003810119a534645ea403d24fa189ad0073e135927d0fe1d32000000000000000000c740456017c0c62f75466dc989601824e98e79fbc154933ac77e24a0ed9739e4b5a3c969013001183d95858488690e00f14acf5d67a87fba8dff71bb6f025614c9c74ad49b98d5000000000000000000
0000a72b298d8ee76becbc3c24cbb2ec3c1a88ed2ceccf65c0f3550000000000000000005a18932987b5f75e17c85aebcf54a7ac99a290cb21c1b690829401123d063bc2d49cc969563001187009f82987690e0010119a534645ea403d24fa189ad0073e135927d0fe1d32000000000000000000
00e09328e46d392662a6e349fca522519d1134882b22e0bf04ce6e00000000000000000082e781a8a6714f61b00293c8404b1fecde515c78c5ee829013d6862eb20648bf8a9bc969322e011819ebb77586690e00298d8ee76becbc3c24cbb2ec3c1a88ed2ceccf65c0f355000000000000000000
0060a729659e7d24fbe360071dbafe0a10bbed3e05e403cf59717e0000000000000000002cc885078a45b080976deb28507f32173a63ccc7593415e715617c12bc4e094c5092c969982e01183e82180385690e00e46d392662a6e349fca522519d1134882b22e0bf04ce6e000000000000000000
00800020c78b480e811e0db3deab57f8e22aaa6675db5511f6eb67000000000000000000539a9379269665cbf7df3c0b166dbb7f431bcf3acc9c7abb4ed8538cc051e52e4291c969ee2e0118f95f94d484690e00659e7d24fbe360071dbafe0a10bbed3e05e403cf59717e000000000000000000
00e0f6317b2a912870d90483f464c9d7f92cdf5ff5a338fc98076300000000000000000092ebf09709c614ffc53839cc67e82eab962e2caf6871cc28c487c52d6383992dfe8fc969e52d01185af165d383690e00c78b480e811e0db3deab57f8e22aaa6675db5511f6eb67000000000000000000
00000022bb1b22a226eabc79f1f84e3bf1279af0e781bb5e4ab5060000000000000000001d3dba88eec68c923c77b1f03c8b93398170fb15657762ebe328be7a353587d8508ac9698d2e011802c7638b82690e007b2a912870d90483f464c9d7f92cdf5ff5a338fc980763000000000000000000
00000024ba5b4e885880e993bf1d77a72fc3e0b3049fd1c3a94d5e0000000000000000004a03f8bb387fcdde396c525169920dc9fc0e603f7c090623a414c7a799794c1f178ac9690d2f0118ad22da2a81690e00bb1b22a226eabc79f1f84e3bf1279af0e781bb5e4ab506000000000000000000
00404a2509698c5eb294921cc464a7527edac22b40f6e2692e4f6d0000000000000000003b8390081848b739a93b8302ab6a9f2ebce0597016bd94d1f100ddf7ce87851d5b89c969ee2e01189904da8880690e00ba5b4e885880e993bf1d77a72fc3e0b3049fd1c3a94d5e000000000000000000
002068394b8944e32e4b5b3b7e26f71c0852506df4141bae3d3f0a0100000000000000005df1edca40364c9c744f77df634e34917b9be4b216409f695215046f59b25bb39d86c969a22f01180e4209857f690e0009698c5eb294921cc464a7527edac22b40f6e2692e4f6d000000000000000000
0040a4221226fbf4c794f321267d45c4180bfa2bc601cde474d9c000000000000000000075b080ab409de05c5383d2570cab7e0313a76740c9f11c121ad10dc2d87ca1758886c9694430011802387ab87e690e004b8944e32e4b5b3b7e26f71c0852506df4141bae3d3f0a010000000000000000
00808b2672ada654d9ecddcaf97cad308defd1b3cacbbc187850c10000000000000000001665b176f598f8779d506385f33debd843bd32c71eef7d57c4bd6fbce9a3f9913886c9693b30011862bda96b7d690e001226fbf4c794f321267d45c4180bfa2bc601cde474d9c0000000000000000000
00e0772e59c256014e0eb54e812d99167d8d4604aaffe9dd4e2788000000000000000000dd810bee91098cb99151ee3b0acb5ffd1768b9ffced7d481edaa8cefde570739c183c96947300118c8a06f0e7c690e0072ada654d9ecddcaf97cad308defd1b3cacbbc187850c1000000000000000000
000000280c4fc4038bf0dfdd197158c1bcaaceb57c8dd33373e71201000000000000000013b69ba9273d4d3ac4deaae9d041b0707c43fe43c856a318510cb103a364a2b09481c969ca3001181d52a4417b690e0059c256014e0eb54e812d99167d8d4604aaffe9dd4e2788000000000000000000
00000026d5c44c70988a5ee4a4893b27d131eeb73f3ccf9f20b3c2000000000000000000cc04c1db27f90fc57dc5b63c5ce9fc12f802638d17f4af1b59ba33470059814fe080c969822d0118e563d3c27a690e000c4fc4038bf0dfdd197158c1bcaaceb57c8dd33373e712010000000000000000
008005205c0abfa8da79e82052bcaf667e8264bac7e85e99d57f56000000000000000000b3d9b09c5535f3656bf4cb95ecd81d60cafcc03a766dc1626a31a71292b1054af773c969d82d0118191e1f5379690e00d5c44c70988a5ee4a4893b27d131eeb73f3ccf9f20b3c2000000000000000000
00400220a2beec4171580625f043f0322d73d91a076cb1749b5a0e0000000000000000009af6c4eff30c46f921fac97ef6f77ceac4a3b6874e8a0ec9d347fa5c1056b8d3b472c969242e0118c5e029f478690e005c0abfa8da79e82052bcaf667e8264bac7e85e99d57f56000000000000000000
0000c02076375309ea3eb20909854c8ab2c1eb0b0161398b9e7b01010000000000000000c83aef8a5423c364d2b7522caef9a6f2402ff8cee09ca85419e6cc964a4d008b5371c969d92e01188062eb9077690e00a2beec4171580625f043f0322d73d91a076cb1749b5a0e000000000000000000
00c0852f159cdd2ecb6bbae359800ed36fb2b781bd9dc203416b1d000000000000000000920d1f24b5bcd9d7b0498335650cce9e246438fa65474a2a644af1eccbb299124371c969702f0118949913d376690e0076375309ea3eb20909854c8ab2c1eb0b0161398b9e7b01010000000000000000
00600420281100112ac66f09e13111c57ecb3fdce119ba71cc681800000000000000000037dfcb3ec0cc84ff02d21d80af7ecf8222a8ffa879cb7ff11a3b068e70dcde74d070c9695b2f01189ab9962b75690e00159cdd2ecb6bbae359800ed36fb2b781bd9dc203416b1d000000000000000000
00c0382b4859bf626ad11b0520016f0606f2eef4f74e38fc9233bc00000000000000000096a0f424a661e09ab17a65206e768d61cf3e534e24dbcb9f30252196561586e8356ec969fc2b0118493d2eaf74690e00281100112ac66f09e13111c57ecb3fdce119ba71cc6818000000000000000000
00000036e64e683caa90abc10958886acf66a62af808aa5fbd441f010000000000000000caefa7dbcdc27e000aeb69220d992df2981e9ce219d9e182cec39f60e5939bfbf360c969d62b011857cade8c73690e004859bf626ad11b0520016f0606f2eef4f74e38fc9233bc000000000000000000
0040402206dfad96ce566356e639022912f8f49128ffaf0ea209f40000000000000000003b3383a166801f60604f437781c505e0af8e63c9bf53e08bc3e612be03cee5f8225ec9694c2c011872857f7b72690e00e64e683caa90abc10958886acf66a62af808aa5fbd441f010000000000000000
00c0a525e03b36ce20686567a5825d6d1c0ef6efa0dd0f9b95908e00000000000000000027d58b3698e7dd626fe34d23185a6250c2e179af98ac23b8ea6ea0f224736ce94c5dc969222a011844608f4771690e0006dfad96ce566356e639022912f8f49128ffaf0ea209f4000000000000000000
00c00020362929b6e924ee5b9ebb1393c66efb7b044b5ea65266bf000000000000000000fb342452bb7289a3fa6bb96e9934fa90c8b6e74e2673169859d261ee9485bdcee653c9699e290118b180e77270690e00e03b36ce20686567a5825d6d1c0ef6efa0dd0f9b95908e000000000000000000
00008020c6372cb83bcb8897daac37a24c39804fd2965a4a02c2d9000000000000000000ba9e00b06563743c632f6cdee6da2974477615618403bd184dca8230a8ac4b8cdc4fc969ce290118252d533c6f690e00362929b6e924ee5b9ebb1393c66efb7b044b5ea65266bf000000000000000000
0000042093f94fe6f0eb88fa45b77f735c2624c81baf608413bc61000000000000000000cf02559f7433e593f19184819d6da6463c390c9acbe789fd773d3b0ed07bdfa2214ec9693428011814b7b11a6e690e00c6372cb83bcb8897daac37a24c39804fd2965a4a02c2d9000000000000000000
00e0002013eebae45115a4dea63b448a46c0d99bedb645dacd16d0000000000000000000c25bcf961c139082a390fe0b79ff1017cbf82af5a08c743dd8a09e9ca26081298946c969332601181da7c1366d690e0093f94fe6f0eb88fa45b77f735c2624c81baf608413bc61000000000000000000
0000a0205dd158fd0b41905b39c2151309d93e87ef46149e3d9d21010000000000000000bf458e620cd5601a8466b7c9fb45c16ae602cff1cf31f7e58a56ff70402c77c3933dc969ea260118115b740e6c690e0013eebae45115a4dea63b448a46c0d99bedb645dacd16d0000000000000000000
00e0ff3f358b7c781b64532163815b3ffe2e5121492d8ff6ca910901000000000000000024a02b03c64f7deda1761e4d4d93b271f86b5e0f6fc81e8d2a5f0e59ca0d06ef973dc96936260118c261d06b6b690e005dd158fd0b41905b39c2151309d93e87ef46149e3d9d21010000000000000000
00000026698e77fcd1d6a8e8f6f3222f0d6783a11149320aec4a120100000000000000003d8766704d2a7c7f3fb6bce6f3b08400ae87957b1ccf9bc7b0f644c2e8710fe1ef38c969a9260118243491ad6a690e00358b7c781b64532163815b3ffe2e5121492d8ff6ca9109010000000000000000
0000c020dcfb59e8df172c0e3eeea46ec6828576d8e66a37eee3460000000000000000000279ef77cbaa6d7a283273488fa7aaea5ced8fd42d76892ae242d4ba3fe257eb1238c969022601183c40c9db69690e00698e77fcd1d6a8e8f6f3222f0d6783a11149320aec4a12010000000000000000
00a0bd22c8e8d116998a05ac6d44f67b7122b645aadfd9bcb86a5100000000000000000047e20cc7c2a8b4c67ef71657446b5bc6c186a3fe51db16a42786600d653355819133c9691125011888030a1868690e00dcfb59e8df172c0e3eeea46ec6828576d8e66a37eee346000000000000000000
00c08922cff193a8b12d1ac022bf0563968b0cadb59c497079074b00000000000000000054dda700b3a9b054ff265efe064da6fff699df5ecb85822921b895dac8d6faed162ec969ab2501185cc829b467690e00c8e8d116998a05ac6d44f67b7122b645aadfd9bcb86a51000000000000000000
00a07332a7af62d6b31d5d823af3a987229bab602aee5391d7c77300000000000000000021b6d077e1c9c7d9936a02fbfb4e45af3262b8dad7c89cb5a4f3d220206f2b6dc02dc969472601187f38ca1f66690e00cff193a8b12d1ac022bf0563968b0cadb59c497079074b000000000000000000
00808a2822d18ec4d90b2f2265694a95ad96095eebbfa9181b5b930000000000000000000780d943108759b7711b274c7be4c4dbe976fe04dcf6f26fbb78e32a768d38c16d2dc969352601181764300465690e00a7af62d6b31d5d823af3a987229bab602aee5391d7c773000000000000000000
000060204e22c4b7e9d296a4b4d8a25f9992146604027beabddea80000000000000000008a704c9c923d9ebe7382c5ecf588278fe25f51890427063044e7ae7dd6b833ded82ac969b726011847a865f364690e0022d18ec4d90b2f2265694a95ad96095eebbfa9181b5b93000000000000000000
006046224ac4511706718f0424f504bbaaa2664e1f7644b2bc37dd000000000000000000321674d41f623d6e9c3d061390123c55bdbaac9989c1475e89ddbf0329a741682f2ac969402701181ec4786a63690e004e22c4b7e9d296a4b4d8a25f9992146604027beabddea8000000000000000000
0000722a4e4f3e85806f5718ce15fe21df308ca04cb194df47430b000000000000000000e0c24ae528f71b403ec84a66406983b1c09d4223d6e7e2b25b158cd2bfddff969a29c9693b2601185cde395862690e004ac4511706718f0424f504bbaaa2664e1f7644b2bc37dd000000000000000000
0000002a9c5fc862046e9240864276e5994c4deb5fcbe3d2bcaab80000000000000000004c07c4becac0f0e80dd1c178561d0b973687cb827372f5a2d304c5ae7b8c58d8e423c969d32601184d42a89961690e004e4f3e85806f5718ce15fe21df308ca04cb194df47430b000000000000000000
0040af3070e10dd61ef26ab51e8d4bf765f37a64a700459df77c8a000000000000000000dcdc2d7fdfee17504750651a892b0c557c96003c41e4ec06761f2fa56ae7897e8623c9699c2601185a571ae660690e009c5fc862046e9240864276e5994c4deb5fcbe3d2bcaab8000000000000000000
0000003ecc7f23840551f5ab33eddbd230199d9581fe465bdb6c6b00000000000000000013fb1d46d4b683ddf88c40fcb98b5c58e35d76ed6b9daaf725f3b8b21df4d5257420c9691a270118f34ff20c5f690e0070e10dd61ef26ab51e8d4bf765f37a64a700459df77c8a000000000000000000
0060a320eddfe25dcadff05dc2984204c5b28af43234cccdaac611000000000000000000c1740533667c071b9df661ab9bf00afe5306eb434599039dd00389e5254f28ddbd1fc9699d27011800e91e6a5e690e00cc7f23840551f5ab33eddbd230199d9581fe465bdb6c6b000000000000000000
0040e2205b5e54b46bae547776c28dbe7c3ede6cfd91a79b745b8800000000000000000084e31da9613ee7fb3252c6addeac02214ed5248532ac855f5a7f990ad6e2a3ed161fc969da2701183af31cb45d690e00eddfe25dcadff05dc2984204c5b28af43234cccdaac611000000000000000000
00800e20912b0d89ef302b386f5226ffd068171b04d9a19eeab621010000000000000000c3548cbe1edbaeacaaeb87aeb7be46120ca49d8f5967109c51254456d11317f7891dc969842701185d57b0855c690e005b5e54b46bae547776c28dbe7c3ede6cfd91a79b745b88000000000000000000
================================================
FILE: bitcoincashkit/src/main/resources/TestNetBitcoinCash-bip44.checkpoint
================================================
02000000420ad5d432dfa48f61fa5b0b6b65f4587291761d56b8d271cad9bb010000000031d3e2406e954acbf9134d2420ddb8f607cb29dc7cdbd9153af5751ad5c7f8ff444d1153ac02061cb3e8dba3370b03003c0205fa47283109a3272a9c305c28329bc6e7bc12e31598c015d60500000000
02000000bed0b6cb5da8dce215d80720905bbb6cb19b8418f82df68d3bac3803000000002b7f607d44ef06ad1f96c8c042bb4c60694891a6bed5c3a6d708369aa0d3811c3a4d1153ac02061c48168705360b0300420ad5d432dfa48f61fa5b0b6b65f4587291761d56b8d271cad9bb0100000000
02000000af6a359719e05a5715138aa42e6a67aca19c1ae26e6a7c66ce42cb0000000000cebc8e0f1d52ec0e55077decf69ae44dbc65820694d29a7227b17caa9ab5b5ee294d1153ac02061cc2a6875e350b0300bed0b6cb5da8dce215d80720905bbb6cb19b8418f82df68d3bac380300000000
02000000d51bb879dda44622477ffcac907e44f3d09595fac165eb9f056cd903000000007dc5bec62bd9404560a021c5b77ff78178eec09c12da1d226d4ed9e276e25a23244d1153ac02061c3892904e340b0300af6a359719e05a5715138aa42e6a67aca19c1ae26e6a7c66ce42cb0000000000
02000000a46f94687fb64c70e84661a57db04a4e09c32bc555b60e8a145c8f05000000005a4d29814979830a2a40b636c6723796b60b18a232f6c6296f9b6e0b0e2c793e174d1153ac02061ce78fa008330b0300d51bb879dda44622477ffcac907e44f3d09595fac165eb9f056cd90300000000
02000000d4f4c2e43c564cbba9de9abe5b9cde022ac2ee30db331458fc2c9502000000005df7d4998b04d50745ea21eed93901a993e3550809a66a53b5479e9bda7febfa054d1153ac02061c4313b257320b0300a46f94687fb64c70e84661a57db04a4e09c32bc555b60e8a145c8f0500000000
020000002ed46bc395a09a8b034c926950f8679c19338f198203598bd30fdf04000000001abc28e9e4f36ccae15bfd0bad028f145f290dd80bf58b91fbd674bd6357b332fb4c1153ac02061c4742d3ef310b0300d4f4c2e43c564cbba9de9abe5b9cde022ac2ee30db331458fc2c950200000000
020000006cd566a53e2ada5163f46871c6103380512320b905f7363ceb4e9004000000009c371894786679561f6d891b6e725120191d190bd9d1bc59dfbfc1f94189c277f34c1153ac02061ca9af858c300b03002ed46bc395a09a8b034c926950f8679c19338f198203598bd30fdf0400000000
0200000070361e684698c0858b7c2ec5346be8238b66cf7e08ea6bb2fd06a502000000000f0452bf84f8023fee8cda28a06f1edab760ee4fb57ec26b4f344f15c33a77d9ec4c1153ac02061c173f247d2f0b03006cd566a53e2ada5163f46871c6103380512320b905f7363ceb4e900400000000
020000009605e44b7924bc2d3db9e7beff7ed0594d6ee79dfc95d7cc80a1520400000000e0008e3ca601062432b1c9e04930ff8b6c43b6ef38bc9ee3bf021a943ee22a6cde4c1153ac02061c5d11a3b02e0b030070361e684698c0858b7c2ec5346be8238b66cf7e08ea6bb2fd06a50200000000
02000000a462900dc91079e7da04bae7f81f05d36199e548833c306caf31ff0300000000246914c192775e6318b5a578de640b68d43deea82a97db37a11ecac86d221009d84c1153ac02061ca1bb08bd2d0b03009605e44b7924bc2d3db9e7beff7ed0594d6ee79dfc95d7cc80a1520400000000
02000000a266e7267075eda858897c09a1183586bec11526270ade4f4d299002000000008af392f52425c25f7abf8150ed2965f4bec3d3a3cc6c518905d7e8fb09dbf510d34c1153ac02061c4712c7a62c0b0300a462900dc91079e7da04bae7f81f05d36199e548833c306caf31ff0300000000
02000000b2f4e9fff46b4a8d9cfc0ab633a801745c506cafed94a7669773d20000000000b5e18120fa7b2d6d74a7752f4c137651e0a0d9de133a9f07c0719f6e0a9d1949cd4c1153ac02061c574e76e12b0b0300a266e7267075eda858897c09a1183586bec11526270ade4f4d29900200000000
02000000e63b556f7d28ed2b44e3ab175accc1878317c6e98bd8fbff70640e050000000081c1c5a8c313362b8171c0bc13263c30159b54baae97524aa722d21e67162f2fc74c1153ac02061c66935a282a0b0300b2f4e9fff46b4a8d9cfc0ab633a801745c506cafed94a7669773d20000000000
02000000b377dc6ed586b0cb3d0b06c2af258cec7df9e826fb39b6e99f625a0200000000a548db3c14d3eaedf24fbc204b57922ec5274b45a08dbf3a973b15dfddc70af8bb4c1153ac02061c166bfae7290b0300e63b556f7d28ed2b44e3ab175accc1878317c6e98bd8fbff70640e0500000000
020000000f183315940e93ff1476b3fe618cbf48d8f190bc826f3ab3da7a760100000000fccbf3dd196a761d21d0a68e5b41c9afc10604f6b537e93c8ca37238c9f3eae7b44c1153ac02061c7266300d280b0300b377dc6ed586b0cb3d0b06c2af258cec7df9e826fb39b6e99f625a0200000000
0200000099dff232d4ce1de8057f8898bd4b740d3b8d0f77f2fd571c6e334b0500000000a99425697f55c5c114b1eed2452d51646923b01fd313dccd3ec4528001e88b6eaf4c1153ac02061cbf05bf99270b03000f183315940e93ff1476b3fe618cbf48d8f190bc826f3ab3da7a760100000000
02000000fe3f131d633fd10057298eb603607f5ddcf045874afd9e2c75f497020000000089ca2b380865f57e72fe71dcfefbf68565aeef6914b60452f60ddbdf046de25faa4c1153ac02061cf2d85fe9260b030099dff232d4ce1de8057f8898bd4b740d3b8d0f77f2fd571c6e334b0500000000
0200000013e039297871ccaaae40f4cecf8266bb8e9570d4f56864656815b80300000000dd9c94d54ed4e65289a867c129040240e4e2771ae7f8ce13069933a9c2b55ee6a44c1153ac02061cd3739bc9250b0300fe3f131d633fd10057298eb603607f5ddcf045874afd9e2c75f4970200000000
02000000005975c7805234e00a2313e479ac3ca46d7dbac3eb0bc8433df15f01000000009d265c29b1c066d62ebb2147fb019e13a3a4d2786395397385e41c83925556b6a14c1153ac02061c1432e4f4240b030013e039297871ccaaae40f4cecf8266bb8e9570d4f56864656815b80300000000
0200000068f841818be2d3709222b9254c825a79bbad91691dcf9070057bd20100000000c3d70a8ed7cb613e370d3429fd99507d9d197f2f3a167e207d5c47211362e2c09b4c1153ac02061c832ad33a230b0300005975c7805234e00a2313e479ac3ca46d7dbac3eb0bc8433df15f0100000000
020000009557a1d63f67d6babfc253672339d98ea9a472f62672114488c8870500000000e8d58136fd1e6860f09b9297a88c3bd7dbeb1746cee8dfb71c362b9e6ce79138944c1153ac02061cc8158561220b030068f841818be2d3709222b9254c825a79bbad91691dcf9070057bd20100000000
020000003a3c82afa1c0bd0bc05775b578e28f40c6ece502e844706682545b030000000091f371e37146aeaca5a1e0d2a5decbd61f917712ae2a2119fe81c3d3e7425ef1904c1153ac02061c0f00dd01210b03009557a1d63f67d6babfc253672339d98ea9a472f62672114488c8870500000000
02000000e14ef72a8aea472614f3ae1306823cf0b325813f9f95987a47a7680400000000db5ea894cf5eab01dedf900c6b0387de31125fbe57df99c59d02637b71f42ecf8c4c1153ac02061cbaca34d2200b03003a3c82afa1c0bd0bc05775b578e28f40c6ece502e844706682545b0300000000
0200000010ba8a1d57c99940327489d731248ef96850a0e25a6deec897ef7502000000006331673396115467ce6d1c3891c7926c68f70b091e092d24d058143a8d3d7273844c1153ac02061ca4a8d43a1f0b0300e14ef72a8aea472614f3ae1306823cf0b325813f9f95987a47a7680400000000
02000000497def0e8859e314f7d0905fde763ad7f3888aad922d856674d57c05000000005ee1c0ad6dccf278cd96dc2cb3504f785686c1ea2ecca85f273c3b8f7a602c79694c1153ac02061c5cb6363c1e0b030010ba8a1d57c99940327489d731248ef96850a0e25a6deec897ef750200000000
02000000b2665f20f90efeb3aacd2dc1b581fbb1bf7ee9f31590e3b51a6d0c00000000005f83b6a96f27609b6b98c11afbff350f83e533b1964bc70bd14027aab3127834314c1153ac02061cafb7a87d1d0b0300497def0e8859e314f7d0905fde763ad7f3888aad922d856674d57c0500000000
02000000fcd266090fff4266d6e0759b5bacbbf971c07b61ec90d2d72903c60100000000afd22e7737e0eedf237d5e29da7fa8184a9883404a54aa16dc01f6c1d376124d544c1153ac02061cb75bcc9f1c0b0300b2665f20f90efeb3aacd2dc1b581fbb1bf7ee9f31590e3b51a6d0c0000000000
02000000d017b6b0019acccb2102ff9a6cee8977c6989cb42cdabaccc1366403000000008d3f96674b1e20d8067027a71b4c136ba2959ce4bb444ee2d7b2bb8c9110d4e7404c1153ac02061ceba14e841b0b0300fcd266090fff4266d6e0759b5bacbbf971c07b61ec90d2d72903c60100000000
020000004f6c33cae0a3b1aca6fbdb2a03b501dfc806ff072fbd2f65a7fdbd0100000000c098ca28eda4b933b287683ad38673544337837dfc352ef3d3ab72c6e05a75ee234c1153ac02061ca9763c611a0b0300d017b6b0019acccb2102ff9a6cee8977c6989cb42cdabaccc136640300000000
02000000fa4d0441e31932a3ae75334beb88f57dfc269ee838b922d8b9e16d01000000003ce85bdf82f02fb7e851e0b663c1c25df820e05975ae3b5beaf17ab4a9e0e80eef4b1153ac02061ce296a3fa190b030
gitextract_v0r6jup7/
├── .github/
│ └── workflows/
│ └── pull-request-notify.yml
├── .gitignore
├── .gitmodules
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── app/
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src/
│ └── main/
│ ├── AndroidManifest.xml
│ ├── java/
│ │ └── io/
│ │ └── horizontalsystems/
│ │ └── bitcoinkit/
│ │ └── demo/
│ │ ├── App.kt
│ │ ├── BalanceFragment.kt
│ │ ├── FeePriority.kt
│ │ ├── MainActivity.kt
│ │ ├── MainViewModel.kt
│ │ ├── NumberFormatHelper.kt
│ │ ├── SendReceiveFragment.kt
│ │ └── TransactionsFragment.kt
│ └── res/
│ ├── drawable/
│ │ └── ic_launcher_background.xml
│ ├── drawable-v24/
│ │ └── ic_launcher_foreground.xml
│ ├── layout/
│ │ ├── activity_main.xml
│ │ ├── fragment_balance.xml
│ │ ├── fragment_send_receive.xml
│ │ ├── fragment_transactions.xml
│ │ └── view_holder_transaction.xml
│ ├── menu/
│ │ └── navigation.xml
│ ├── mipmap-anydpi-v26/
│ │ ├── ic_launcher.xml
│ │ └── ic_launcher_round.xml
│ └── values/
│ ├── colors.xml
│ ├── strings.xml
│ └── styles.xml
├── bitcoincashkit/
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src/
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── kotlin/
│ │ │ └── io/
│ │ │ └── horizontalsystems/
│ │ │ └── bitcoincash/
│ │ │ ├── BitcoinCashKit.kt
│ │ │ ├── MainNetBitcoinCash.kt
│ │ │ ├── TestNetBitcoinCash.kt
│ │ │ └── blocks/
│ │ │ ├── AsertAlgorithm.java
│ │ │ ├── BitcoinCashBlockValidatorHelper.kt
│ │ │ ├── Utils.java
│ │ │ └── validators/
│ │ │ ├── AsertValidator.kt
│ │ │ ├── DAAValidator.kt
│ │ │ ├── EDAValidator.kt
│ │ │ └── ForkValidator.kt
│ │ └── resources/
│ │ ├── MainNetBitcoinCash-bip44.checkpoint
│ │ ├── MainNetBitcoinCash.checkpoint
│ │ ├── TestNetBitcoinCash-bip44.checkpoint
│ │ └── TestNetBitcoinCash.checkpoint
│ └── test/
│ ├── kotlin/
│ │ └── io/
│ │ └── horizontalsystems/
│ │ ├── Fixtures.kt
│ │ └── bitcoincash/
│ │ └── blocks/
│ │ ├── BitcoinCashBlockValidatorHelperTest.kt
│ │ └── validators/
│ │ ├── DAAValidatorTest.kt
│ │ └── ForkValidatorTest.kt
│ └── resources/
│ └── mockito-extensions/
│ └── org.mockito.plugins.MockMaker
├── bitcoincore/
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src/
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ └── io/
│ │ │ └── horizontalsystems/
│ │ │ └── bitcoincore/
│ │ │ ├── DustCalculator.kt
│ │ │ ├── crypto/
│ │ │ │ ├── Base58.java
│ │ │ │ ├── Bech32.java
│ │ │ │ ├── Bech32Cash.java
│ │ │ │ ├── Bech32Segwit.java
│ │ │ │ ├── CompactBits.java
│ │ │ │ ├── MurmurHash3.java
│ │ │ │ └── schnorr/
│ │ │ │ ├── Pair.java
│ │ │ │ ├── Point.java
│ │ │ │ ├── Schnorr.java
│ │ │ │ ├── SchnorrOld.java
│ │ │ │ └── Util.java
│ │ │ ├── exceptions/
│ │ │ │ ├── AddressFormatException.java
│ │ │ │ └── BitcoinException.java
│ │ │ ├── io/
│ │ │ │ ├── BitcoinInput.java
│ │ │ │ ├── BitcoinInputMarkable.java
│ │ │ │ ├── BitcoinOutput.java
│ │ │ │ └── UnsafeByteArrayOutputStream.java
│ │ │ └── utils/
│ │ │ ├── HashUtils.java
│ │ │ └── Utils.java
│ │ ├── kotlin/
│ │ │ └── io/
│ │ │ └── horizontalsystems/
│ │ │ └── bitcoincore/
│ │ │ ├── AbstractKit.kt
│ │ │ ├── BitcoinCore.kt
│ │ │ ├── BitcoinCoreBuilder.kt
│ │ │ ├── WatchAddressPublicKeyManager.kt
│ │ │ ├── WatchedTransactionManager.kt
│ │ │ ├── apisync/
│ │ │ │ ├── BCoinApi.kt
│ │ │ │ ├── BiApiTransactionProvider.kt
│ │ │ │ ├── BlockHashFetcher.kt
│ │ │ │ ├── BlockchainComApi.kt
│ │ │ │ ├── HsBlockHashFetcher.kt
│ │ │ │ ├── InsightApi.kt
│ │ │ │ ├── blockchair/
│ │ │ │ │ ├── BlockchairApi.kt
│ │ │ │ │ ├── BlockchairApiSyncer.kt
│ │ │ │ │ ├── BlockchairBlockHashFetcher.kt
│ │ │ │ │ ├── BlockchairLastBlockProvider.kt
│ │ │ │ │ └── BlockchairTransactionProvider.kt
│ │ │ │ ├── legacy/
│ │ │ │ │ ├── ApiSyncer.kt
│ │ │ │ │ ├── BlockHashDiscoveryBatch.kt
│ │ │ │ │ ├── BlockHashScanHelper.kt
│ │ │ │ │ ├── BlockHashScanner.kt
│ │ │ │ │ └── PublicKeyFetcher.kt
│ │ │ │ └── model/
│ │ │ │ ├── AddressItem.kt
│ │ │ │ ├── BlockHeaderItem.kt
│ │ │ │ └── TransactionItem.kt
│ │ │ ├── blocks/
│ │ │ │ ├── BlockDownload.kt
│ │ │ │ ├── BlockMedianTimeHelper.kt
│ │ │ │ ├── BlockSyncer.kt
│ │ │ │ ├── Blockchain.kt
│ │ │ │ ├── BloomFilterLoader.kt
│ │ │ │ ├── IBlockchainDataListener.kt
│ │ │ │ ├── IPeerSyncListener.kt
│ │ │ │ ├── InitialBlockDownload.kt
│ │ │ │ ├── MerkleBlockExtractor.kt
│ │ │ │ └── validators/
│ │ │ │ ├── BitsValidator.kt
│ │ │ │ ├── BlockValidatorChain.kt
│ │ │ │ ├── BlockValidatorException.kt
│ │ │ │ ├── BlockValidatorSet.kt
│ │ │ │ ├── IBlockValidator.kt
│ │ │ │ ├── LegacyDifficultyAdjustmentValidator.kt
│ │ │ │ ├── LegacyTestNetDifficultyValidator.kt
│ │ │ │ └── ProofOfWorkValidator.kt
│ │ │ ├── core/
│ │ │ │ ├── AccountWallet.kt
│ │ │ │ ├── BaseTransactionInfoConverter.kt
│ │ │ │ ├── DataProvider.kt
│ │ │ │ ├── DoubleSha256Hasher.kt
│ │ │ │ ├── Extensions.kt
│ │ │ │ ├── HashBytes.kt
│ │ │ │ ├── IHasher.kt
│ │ │ │ ├── Interfaces.kt
│ │ │ │ ├── PluginManager.kt
│ │ │ │ ├── TransactionDataSorterFactory.kt
│ │ │ │ ├── TransactionInfoConverter.kt
│ │ │ │ ├── Wallet.kt
│ │ │ │ └── WatchAccountWallet.kt
│ │ │ ├── crypto/
│ │ │ │ └── BloomFilter.kt
│ │ │ ├── extensions/
│ │ │ │ ├── Array.kt
│ │ │ │ └── String.kt
│ │ │ ├── managers/
│ │ │ │ ├── AccountPublicKeyManager.kt
│ │ │ │ ├── ApiManager.kt
│ │ │ │ ├── ApiSyncStateManager.kt
│ │ │ │ ├── BlockValidatorHelper.kt
│ │ │ │ ├── BloomFilterManager.kt
│ │ │ │ ├── ConnectionManager.kt
│ │ │ │ ├── IUnspentOutputProvider.kt
│ │ │ │ ├── IUnspentOutputSelector.kt
│ │ │ │ ├── IrregularOutputFinder.kt
│ │ │ │ ├── PendingOutpointsProvider.kt
│ │ │ │ ├── PublicKeyManager.kt
│ │ │ │ ├── RestoreKeyConverters.kt
│ │ │ │ ├── SyncManager.kt
│ │ │ │ ├── UnspentOutputProvider.kt
│ │ │ │ ├── UnspentOutputQueue.kt
│ │ │ │ ├── UnspentOutputSelector.kt
│ │ │ │ └── UnspentOutputSelectorSingleNoChange.kt
│ │ │ ├── models/
│ │ │ │ ├── Address.kt
│ │ │ │ ├── BitcoinPaymentData.kt
│ │ │ │ ├── BitcoinSendInfo.kt
│ │ │ │ ├── Block.kt
│ │ │ │ ├── BlockHash.kt
│ │ │ │ ├── BlockHashPublicKey.kt
│ │ │ │ ├── BlockchainState.kt
│ │ │ │ ├── Checkpoint.kt
│ │ │ │ ├── InvalidTransaction.kt
│ │ │ │ ├── InventoryItem.kt
│ │ │ │ ├── MerkleBlock.kt
│ │ │ │ ├── NetworkAddress.kt
│ │ │ │ ├── PeerAddress.kt
│ │ │ │ ├── PublicKey.kt
│ │ │ │ ├── SentTransaction.kt
│ │ │ │ ├── Transaction.kt
│ │ │ │ ├── TransactionDataSortType.kt
│ │ │ │ ├── TransactionInfo.kt
│ │ │ │ ├── TransactionInput.kt
│ │ │ │ ├── TransactionMetadata.kt
│ │ │ │ ├── TransactionOutput.kt
│ │ │ │ ├── UsedAddress.kt
│ │ │ │ └── WatchAddressPublicKey.kt
│ │ │ ├── network/
│ │ │ │ ├── Network.kt
│ │ │ │ ├── messages/
│ │ │ │ │ ├── AddrMessage.kt
│ │ │ │ │ ├── FilterLoadMessage.kt
│ │ │ │ │ ├── GetBlocksMessage.kt
│ │ │ │ │ ├── GetDataMessage.kt
│ │ │ │ │ ├── GetHeadersMessage.kt
│ │ │ │ │ ├── HeadersMessage.kt
│ │ │ │ │ ├── IMessage.kt
│ │ │ │ │ ├── InvMessage.kt
│ │ │ │ │ ├── MempoolMessage.kt
│ │ │ │ │ ├── MerkleBlockMessage.kt
│ │ │ │ │ ├── PingMessage.kt
│ │ │ │ │ ├── PongMessage.kt
│ │ │ │ │ ├── RejectMessage.kt
│ │ │ │ │ ├── TransactionMessage.kt
│ │ │ │ │ ├── UnknownMessage.kt
│ │ │ │ │ ├── VerAckMessage.kt
│ │ │ │ │ └── VersionMessage.kt
│ │ │ │ └── peer/
│ │ │ │ ├── IInventoryItemsHandler.kt
│ │ │ │ ├── IPeerTaskHandler.kt
│ │ │ │ ├── MempoolTransactions.kt
│ │ │ │ ├── Peer.kt
│ │ │ │ ├── PeerAddressManager.kt
│ │ │ │ ├── PeerConnection.kt
│ │ │ │ ├── PeerDiscover.kt
│ │ │ │ ├── PeerGroup.kt
│ │ │ │ ├── PeerManager.kt
│ │ │ │ ├── PeerTimer.kt
│ │ │ │ └── task/
│ │ │ │ ├── GetBlockHashesTask.kt
│ │ │ │ ├── GetBlockHeadersTask.kt
│ │ │ │ ├── GetMerkleBlocksTask.kt
│ │ │ │ ├── PeerTask.kt
│ │ │ │ ├── RequestTransactionsTask.kt
│ │ │ │ └── SendTransactionTask.kt
│ │ │ ├── rbf/
│ │ │ │ ├── ReplacementTransaction.kt
│ │ │ │ ├── ReplacementTransactionBuilder.kt
│ │ │ │ └── ReplacementType.kt
│ │ │ ├── serializers/
│ │ │ │ ├── BlockHeaderParser.kt
│ │ │ │ ├── InputSerializer.kt
│ │ │ │ ├── OutputSerializer.kt
│ │ │ │ └── TransactionSerializer.kt
│ │ │ ├── storage/
│ │ │ │ ├── BlockDao.kt
│ │ │ │ ├── BlockHashDao.kt
│ │ │ │ ├── BlockHashPublicKeyDao.kt
│ │ │ │ ├── BlockchainStateDao.kt
│ │ │ │ ├── CoreDatabase.kt
│ │ │ │ ├── DataObjects.kt
│ │ │ │ ├── DataTypeConverters.kt
│ │ │ │ ├── InvalidTransactionDao.kt
│ │ │ │ ├── PeerAddressDao.kt
│ │ │ │ ├── PublicKeyDao.kt
│ │ │ │ ├── SentTransactionDao.kt
│ │ │ │ ├── Storage.kt
│ │ │ │ ├── TransactionDao.kt
│ │ │ │ ├── TransactionInputDao.kt
│ │ │ │ ├── TransactionMetadataDao.kt
│ │ │ │ ├── TransactionOutputDao.kt
│ │ │ │ └── migrations/
│ │ │ │ ├── Migration_10_11.kt
│ │ │ │ ├── Migration_11_12.kt
│ │ │ │ ├── Migration_12_13.kt
│ │ │ │ ├── Migration_13_14.kt
│ │ │ │ ├── Migration_14_15.kt
│ │ │ │ ├── Migration_15_16.kt
│ │ │ │ ├── Migration_16_17.kt
│ │ │ │ ├── Migration_17_18.kt
│ │ │ │ └── Migration_18_19.kt
│ │ │ ├── transactions/
│ │ │ │ ├── BlockTransactionProcessor.kt
│ │ │ │ ├── PendingTransactionProcessor.kt
│ │ │ │ ├── SendTransactionsOnPeersSynced.kt
│ │ │ │ ├── TransactionConflictsResolver.kt
│ │ │ │ ├── TransactionCreator.kt
│ │ │ │ ├── TransactionFeeCalculator.kt
│ │ │ │ ├── TransactionInvalidator.kt
│ │ │ │ ├── TransactionSendTimer.kt
│ │ │ │ ├── TransactionSender.kt
│ │ │ │ ├── TransactionSizeCalculator.kt
│ │ │ │ ├── TransactionSyncer.kt
│ │ │ │ ├── builder/
│ │ │ │ │ ├── ECKey.kt
│ │ │ │ │ ├── EcdsaInputSigner.kt
│ │ │ │ │ ├── InputSetter.kt
│ │ │ │ │ ├── LockTimeSetter.kt
│ │ │ │ │ ├── MutableTransaction.kt
│ │ │ │ │ ├── OutputSetter.kt
│ │ │ │ │ ├── RecipientSetter.kt
│ │ │ │ │ ├── SchnorrInputSigner.kt
│ │ │ │ │ ├── TransactionBuilder.kt
│ │ │ │ │ └── TransactionSigner.kt
│ │ │ │ ├── extractors/
│ │ │ │ │ ├── MyOutputsCache.kt
│ │ │ │ │ ├── TransactionExtractor.kt
│ │ │ │ │ └── TransactionMetadataExtractor.kt
│ │ │ │ └── scripts/
│ │ │ │ ├── OpCodes.kt
│ │ │ │ └── Script.kt
│ │ │ └── utils/
│ │ │ ├── Base58AddressConverter.kt
│ │ │ ├── Bech32AddressConverter.kt
│ │ │ ├── Bip69.kt
│ │ │ ├── DirectExecutor.kt
│ │ │ ├── IAddressConverter.kt
│ │ │ ├── MainThreadExecutor.kt
│ │ │ ├── MerkleBranch.kt
│ │ │ ├── NetworkUtils.kt
│ │ │ ├── PaymentAddressParser.kt
│ │ │ └── TransactionDataSorters.kt
│ │ └── res/
│ │ └── values/
│ │ └── strings.xml
│ └── test/
│ ├── kotlin/
│ │ └── io/
│ │ └── horizontalsystems/
│ │ └── bitcoincore/
│ │ ├── Fixtures.kt
│ │ ├── RxTestRule.kt
│ │ ├── TestHelpers.kt
│ │ ├── blocks/
│ │ │ ├── BlockSyncerTest.kt
│ │ │ ├── BlockchainTest.kt
│ │ │ └── validators/
│ │ │ ├── BitsValidatorTest.kt
│ │ │ ├── LegacyDifficultyAdjustmentValidatorTest.kt
│ │ │ ├── LegacyTestNetDifficultyValidatorTest.kt
│ │ │ └── ProofOfWorkValidatorTest.kt
│ │ ├── core/
│ │ │ └── DataProviderTest.kt
│ │ ├── managers/
│ │ │ ├── ApiManagerTest.kt
│ │ │ ├── BlockDiscoveryBatchTest.kt
│ │ │ ├── BlockHashFetcherHelperTest.kt
│ │ │ ├── BlockHashFetcherTest.kt
│ │ │ ├── InitialSyncerTest.kt
│ │ │ ├── IrregularOutputFinderTest.kt
│ │ │ ├── StateManagerTest.kt
│ │ │ ├── SyncManagerTest.kt
│ │ │ ├── UnspentOutputProviderTest.kt
│ │ │ ├── UnspentOutputSelectorSingleNoChangeTest.kt
│ │ │ └── UnspentOutputSelectorTest.kt
│ │ ├── message/
│ │ │ ├── MerkleBlockExtractorTest.kt
│ │ │ └── TransactionMessageParserTest.kt
│ │ ├── models/
│ │ │ └── TransactionTest.kt
│ │ ├── network/
│ │ │ ├── PeerGroupTest.kt
│ │ │ ├── PeerManagerTest.kt
│ │ │ ├── PeerTest.kt
│ │ │ └── peer/
│ │ │ ├── PeerHostManagerTest.kt
│ │ │ └── task/
│ │ │ └── SendTransactionTaskTest.kt
│ │ ├── transactions/
│ │ │ ├── TransactionExtractorTest.kt
│ │ │ ├── TransactionProcessorTest.kt
│ │ │ ├── TransactionSenderTest.kt
│ │ │ ├── TransactionSizeCalculatorTest.kt
│ │ │ ├── TransactionSyncerTest.kt
│ │ │ ├── builder/
│ │ │ │ └── InputSignerTest.kt
│ │ │ └── scripts/
│ │ │ └── ScriptTest.kt
│ │ └── utils/
│ │ ├── AddressConverterTest.kt
│ │ ├── Bip69Test.kt
│ │ ├── CashAddressConverterTest.kt
│ │ ├── NetworkUtilsTest.kt
│ │ ├── PaymentAddressParserTest.kt
│ │ └── SegwitAddressConverterTest.kt
│ └── resources/
│ └── mockito-extensions/
│ └── org.mockito.plugins.MockMaker
├── bitcoinkit/
│ ├── .gitignore
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── kotlin/
│ │ │ └── io/
│ │ │ └── horizontalsystems/
│ │ │ └── bitcoinkit/
│ │ │ ├── BitcoinKit.kt
│ │ │ ├── MainNet.kt
│ │ │ ├── RegTest.kt
│ │ │ ├── TestNet.kt
│ │ │ ├── core/
│ │ │ │ └── DataProvider.kt
│ │ │ └── utils/
│ │ │ └── AddressConverter.kt
│ │ └── resources/
│ │ ├── MainNet-bip44.checkpoint
│ │ ├── MainNet.checkpoint
│ │ ├── TestNet-bip44.checkpoint
│ │ └── TestNet.checkpoint
│ └── test/
│ ├── kotlin/
│ │ └── io/
│ │ └── horizontalsystems/
│ │ └── bitcoinkit/
│ │ ├── Fixtures.kt
│ │ └── MainNetTest.kt
│ └── resources/
│ └── mockito-extensions/
│ └── org.mockito.plugins.MockMaker
├── build.gradle
├── dashkit/
│ ├── .gitignore
│ ├── build.gradle
│ ├── cpp/
│ │ ├── CMakeLists.txt
│ │ ├── config.h
│ │ └── dashj-bls/
│ │ ├── CMakeLists.txt
│ │ ├── bls-signatures-src.cmake
│ │ ├── bls-signatures.cmake
│ │ ├── dashj-bls-signature-wrapper.cpp
│ │ ├── pthread.c
│ │ └── stdio.cpp
│ ├── libs/
│ │ └── dashj-bls-0.15.3.jar
│ ├── proguard-rules.pro
│ └── src/
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── kotlin/
│ │ │ └── io/
│ │ │ └── horizontalsystems/
│ │ │ └── dashkit/
│ │ │ ├── DashKit.kt
│ │ │ ├── DashKitErrors.kt
│ │ │ ├── IDashStorage.kt
│ │ │ ├── IInstantTransactionDelegate.kt
│ │ │ ├── IMerkleHasher.kt
│ │ │ ├── InstantSend.kt
│ │ │ ├── InventoryType.kt
│ │ │ ├── MainNetDash.kt
│ │ │ ├── TestNetDash.kt
│ │ │ ├── X11Hasher.kt
│ │ │ ├── core/
│ │ │ │ ├── DashTransactionInfoConverter.kt
│ │ │ │ └── DoubleSha256Hasher.kt
│ │ │ ├── instantsend/
│ │ │ │ ├── BLS.kt
│ │ │ │ ├── InstantSendFactory.kt
│ │ │ │ ├── InstantSendLockValidator.kt
│ │ │ │ ├── InstantTransactionManager.kt
│ │ │ │ ├── QuorumMasternode.kt
│ │ │ │ ├── TransactionLockVoteValidator.kt
│ │ │ │ ├── instantsendlock/
│ │ │ │ │ ├── InstantSendLockHandler.kt
│ │ │ │ │ └── InstantSendLockManager.kt
│ │ │ │ └── transactionlockvote/
│ │ │ │ ├── TransactionLockVoteHandler.kt
│ │ │ │ └── TransactionLockVoteManager.kt
│ │ │ ├── managers/
│ │ │ │ ├── ConfirmedUnspentOutputProvider.kt
│ │ │ │ ├── MasternodeListManager.kt
│ │ │ │ ├── MasternodeListSyncer.kt
│ │ │ │ ├── MasternodeSortedList.kt
│ │ │ │ ├── QuorumListManager.kt
│ │ │ │ └── QuorumSortedList.kt
│ │ │ ├── masternodelist/
│ │ │ │ ├── MasternodeCbTxHasher.kt
│ │ │ │ ├── MasternodeListMerkleRootCalculator.kt
│ │ │ │ ├── MerkleRootCreator.kt
│ │ │ │ ├── MerkleRootHasher.kt
│ │ │ │ └── QuorumListMerkleRootCalculator.kt
│ │ │ ├── messages/
│ │ │ │ ├── GetMasternodeListDiffMessage.kt
│ │ │ │ ├── ISLockMessage.kt
│ │ │ │ ├── MasternodeListDiffMessage.kt
│ │ │ │ ├── TransactionLockMessage.kt
│ │ │ │ ├── TransactionLockVoteMessage.kt
│ │ │ │ └── TransactionMessage.kt
│ │ │ ├── models/
│ │ │ │ ├── CoinbaseTransaction.kt
│ │ │ │ ├── CoinbaseTransactionSerializer.kt
│ │ │ │ ├── DashTransactionInfo.kt
│ │ │ │ ├── InstantTransactionHash.kt
│ │ │ │ ├── InstantTransactionInput.kt
│ │ │ │ ├── InstantTransactionState.kt
│ │ │ │ ├── Masternode.kt
│ │ │ │ ├── MasternodeListState.kt
│ │ │ │ ├── Quorum.kt
│ │ │ │ └── SpecialTransaction.kt
│ │ │ ├── storage/
│ │ │ │ ├── DashKitDatabase.kt
│ │ │ │ └── DashStorage.kt
│ │ │ ├── tasks/
│ │ │ │ ├── PeerTaskFactory.kt
│ │ │ │ ├── RequestInstantSendLocksTask.kt
│ │ │ │ ├── RequestMasternodeListDiffTask.kt
│ │ │ │ ├── RequestTransactionLockRequestsTask.kt
│ │ │ │ └── RequestTransactionLockVotesTask.kt
│ │ │ └── validators/
│ │ │ ├── DarkGravityWaveTestnetValidator.kt
│ │ │ └── DarkGravityWaveValidator.kt
│ │ └── resources/
│ │ ├── MainNetDash-bip44.checkpoint
│ │ ├── MainNetDash.checkpoint
│ │ ├── TestNetDash-bip44.checkpoint
│ │ └── TestNetDash.checkpoint
│ └── test/
│ ├── kotlin/
│ │ └── io/
│ │ └── horizontalsystems/
│ │ └── dashkit/
│ │ ├── messages/
│ │ │ └── MasternodeListDiffMessageParserTest.kt
│ │ └── validators/
│ │ └── DarkGravityWaveValidatorTest.kt
│ └── resources/
│ └── mockito-extensions/
│ └── org.mockito.plugins.MockMaker
├── ecashkit/
│ ├── .gitignore
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── kotlin/
│ │ │ ├── chronik/
│ │ │ │ └── Chronik.java
│ │ │ └── io/
│ │ │ └── horizontalsystems/
│ │ │ └── ecash/
│ │ │ ├── ChronikApi.kt
│ │ │ ├── ECashKit.kt
│ │ │ ├── ECashRestoreKeyConverter.kt
│ │ │ └── MainNetECash.kt
│ │ └── resources/
│ │ ├── MainNetECash-bip44.checkpoint
│ │ └── MainNetECash.checkpoint
│ └── test/
│ └── java/
│ └── io/
│ └── horizontalsystems/
│ └── ecash/
│ └── ExampleUnitTest.kt
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── hodler/
│ ├── .gitignore
│ ├── build.gradle
│ ├── consumer-rules.pro
│ ├── proguard-rules.pro
│ └── src/
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── kotlin/
│ │ │ └── io/
│ │ │ └── horizontalsystems/
│ │ │ └── hodler/
│ │ │ ├── HodlerData.kt
│ │ │ ├── HodlerOutputData.kt
│ │ │ ├── HodlerPlugin.kt
│ │ │ └── LockTimeInterval.kt
│ │ └── res/
│ │ └── values/
│ │ └── strings.xml
│ └── test/
│ ├── java/
│ │ └── io/
│ │ └── horizontalsystems/
│ │ └── hodler/
│ │ └── HodlerPluginTest.kt
│ └── resources/
│ └── mockito-extensions/
│ └── org.mockito.plugins.MockMaker
├── litecoinkit/
│ ├── .gitignore
│ ├── build.gradle
│ ├── consumer-rules.pro
│ ├── proguard-rules.pro
│ └── src/
│ ├── androidTest/
│ │ └── java/
│ │ └── io/
│ │ └── horizontalsystems/
│ │ └── litecoinkit/
│ │ └── ExampleInstrumentedTest.kt
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── kotlin/
│ │ │ └── io/
│ │ │ └── horizontalsystems/
│ │ │ └── litecoinkit/
│ │ │ ├── LitecoinKit.kt
│ │ │ ├── MainNetLitecoin.kt
│ │ │ ├── ScryptHasher.kt
│ │ │ ├── TestNetLitecoin.kt
│ │ │ └── validators/
│ │ │ ├── LegacyDifficultyAdjustmentValidator.kt
│ │ │ └── ProofOfWorkValidator.kt
│ │ └── resources/
│ │ ├── MainNetLitecoin-bip44.checkpoint
│ │ ├── MainNetLitecoin.checkpoint
│ │ ├── TestNetLitecoin-bip44.checkpoint
│ │ └── TestNetLitecoin.checkpoint
│ └── test/
│ └── java/
│ └── io/
│ └── horizontalsystems/
│ └── litecoinkit/
│ ├── ExampleUnitTest.kt
│ └── ScryptHasherTest.kt
├── settings.gradle
└── tools/
├── .gitignore
├── build.gradle
├── consumer-rules.pro
├── proguard-rules.pro
└── src/
└── main/
├── AndroidManifest.xml
├── java/
│ └── io/
│ └── horizontalsystems/
│ └── tools/
│ ├── BuildCheckpoints.kt
│ ├── CheckpointSyncer.kt
│ ├── PeerAddressManager.kt
│ └── Tools.kt
└── res/
└── values/
└── strings.xml
Showing preview only (216K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (2523 symbols across 23 files)
FILE: bitcoincashkit/src/main/kotlin/io/horizontalsystems/bitcoincash/blocks/AsertAlgorithm.java
class AsertAlgorithm (line 5) | public class AsertAlgorithm {
method computeAsertTarget (line 14) | public static BigInteger computeAsertTarget(BigInteger refTarget, BigI...
method computeAsertTarget (line 61) | public static BigInteger computeAsertTarget(int referenceBlockBits, Bi...
FILE: bitcoincashkit/src/main/kotlin/io/horizontalsystems/bitcoincash/blocks/Utils.java
class Utils (line 8) | public class Utils {
method decodeCompactBits (line 22) | public static BigInteger decodeCompactBits(long compact) {
method encodeCompactBits (line 35) | public static long encodeCompactBits(BigInteger value) {
method decodeMPI (line 53) | public static BigInteger decodeMPI(byte[] mpi, boolean hasLength) {
method readUint32BE (line 70) | public static long readUint32BE(byte[] bytes, int offset) {
method checkState (line 77) | public static void checkState(final boolean expression, String message) {
FILE: bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/crypto/Base58.java
class Base58 (line 11) | public class Base58 {
method encode (line 32) | public static String encode(byte[] bytes) {
method decode (line 91) | public static byte[] decode(String string) throws IllegalArgumentExcep...
method decodeChecked (line 150) | public static byte[] decodeChecked(String string) throws IllegalArgume...
method divMod58 (line 179) | private static byte divMod58(byte[] number, int offset) {
method divMod256 (line 198) | private static byte divMod256(byte[] number, int offset) {
FILE: bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/crypto/Bech32.java
class Bech32 (line 5) | public class Bech32 {
class Bech32Data (line 21) | public static class Bech32Data {
method Bech32Data (line 27) | Bech32Data(final String hrp, final byte[] data) {
method Bech32Data (line 33) | public Bech32Data(String hrp, byte[] data, Encoding encoding) {
type Encoding (line 40) | public enum Encoding {
method Encoding (line 45) | Encoding(int checksumConstant) {
FILE: bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/crypto/Bech32Cash.java
class Bech32Cash (line 6) | public class Bech32Cash extends Bech32 {
method polymod (line 13) | private static long polymod(final byte[] v) {
method lowerCase (line 40) | static char lowerCase(char c) {
method expandPrefix (line 46) | static byte[] expandPrefix(String prefix) {
method verifyChecksum (line 59) | static boolean verifyChecksum(String prefix, byte[] payload) {
method createChecksum (line 64) | static byte[] createChecksum(String prefix, final byte[] payload) {
method encode (line 81) | public static String encode(String prefix, byte[] payload) {
method decode (line 95) | public static Bech32Data decode(String str, String defaultPrefix) {
method convertBits (line 178) | public static boolean convertBits(byte[] out, byte[] it, int fromBits,...
method cat (line 209) | private static byte[] cat(final byte[] x, final byte[] y) {
FILE: bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/crypto/Bech32Segwit.java
class Bech32Segwit (line 25) | public class Bech32Segwit extends Bech32 {
method polymod (line 28) | private static int polymod(final byte[] values) {
method expandPrefix (line 43) | private static byte[] expandPrefix(final String prefix) {
method verifyChecksum (line 56) | private static Encoding verifyChecksum(final String prefix, final byte...
method createChecksum (line 71) | private static byte[] createChecksum(final String prefix, Encoding enc...
method encode (line 85) | public static String encode(final Bech32Data bech32) throws AddressFor...
method encode (line 90) | public static String encode(String prefix, Encoding encoding, final by...
method decode (line 108) | public static Bech32Data decode(final String str) throws AddressFormat...
method convertBits (line 137) | public static byte[] convertBits(final byte[] data, final int start, f...
FILE: bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/crypto/CompactBits.java
class CompactBits (line 7) | public class CompactBits {
method decode (line 29) | public static BigInteger decode(long compact) {
method decodeMPI (line 48) | public static BigInteger decodeMPI(byte[] mpi, boolean hasLength) {
method encode (line 68) | public static long encode(BigInteger value) {
FILE: bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/crypto/MurmurHash3.java
class MurmurHash3 (line 7) | public final class MurmurHash3 {
method rotateLeft32 (line 16) | private static int rotateLeft32(int x, int count) {
method hash (line 29) | public static int hash(byte[] filter, long nTweak, int hashNum, byte[]...
FILE: bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/crypto/schnorr/Pair.java
class Pair (line 3) | public class Pair<K, V> {
method Pair (line 8) | protected Pair() {
method of (line 11) | public static <K, V> Pair<K, V> of(K elementLeft, V elementRight) {
method Pair (line 15) | public Pair(K elementLeft, V elementRight) {
method getLeft (line 20) | public K getLeft() {
method getRight (line 24) | public V getRight() {
method equals (line 28) | public boolean equals(Pair<K, V> p) {
FILE: bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/crypto/schnorr/Point.java
class Point (line 6) | public class Point {
method Point (line 18) | public Point(BigInteger x , BigInteger y) {
method Point (line 22) | public Point(byte[] b0, byte[] b1) {
method getp (line 26) | public static BigInteger getp() {
method getn (line 30) | public static BigInteger getn() {
method getG (line 34) | public static Point getG() {
method getX (line 38) | public BigInteger getX() {
method getY (line 42) | public BigInteger getY() {
method getX (line 46) | public static BigInteger getX(Point P) {
method getY (line 50) | public static BigInteger getY(Point P) {
method getPair (line 54) | public Pair<BigInteger,BigInteger> getPair() {
method isInfinite (line 58) | public boolean isInfinite() {
method isInfinite (line 62) | public static boolean isInfinite(Point P) {
method add (line 66) | public Point add(Point P) {
method add (line 70) | public static Point add(Point P1, Point P2) {
method mul (line 99) | public Point mul(BigInteger n) {
method mul (line 103) | public static Point mul(Point P, BigInteger n) {
method hasEvenY (line 117) | public boolean hasEvenY() {
method hasEvenY (line 121) | public static boolean hasEvenY(Point P) {
method isSquare (line 125) | public static boolean isSquare(BigInteger x) {
method hasSquareY (line 129) | public boolean hasSquareY() {
method hasSquareY (line 133) | public static boolean hasSquareY(Point P) {
method taggedHash (line 137) | public static byte[] taggedHash(String tag, byte[] msg) throws NoSuchA...
method genPubKey (line 148) | public static byte[] genPubKey(byte[] secKey) throws Exception {
method toBytes (line 157) | public byte[] toBytes() {
method bytesFromPoint (line 161) | public static byte[] bytesFromPoint(Point P) {
method liftX (line 165) | public static Point liftX(byte[] b) {
method infinityPoint (line 182) | public static Point infinityPoint() {
method equals (line 186) | public boolean equals(Point P) {
FILE: bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/crypto/schnorr/Schnorr.java
class Schnorr (line 6) | public class Schnorr {
method sign (line 8) | public static byte[] sign(byte[] msg, byte[] secKey, byte[] auxRand) t...
method verify (line 56) | public static boolean verify(byte[] msg, byte[] pubkey, byte[] sig) th...
FILE: bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/crypto/schnorr/SchnorrOld.java
class SchnorrOld (line 7) | public class SchnorrOld {
method point_add (line 20) | public static BigInteger[] point_add(BigInteger[] p1, BigInteger[] p2) {
method point_mul (line 41) | public static BigInteger[] point_mul(BigInteger[] P, BigInteger n) {
method jacobi (line 51) | public static BigInteger jacobi(BigInteger x) {
method point_from_bytes (line 55) | public static BigInteger[] point_from_bytes(byte[] b) {
method to32BytesData (line 71) | public static byte[] to32BytesData(BigInteger num) {
method toBigInteger (line 83) | public static BigInteger toBigInteger(byte[] data, int startPos, int l...
method toBigInteger (line 87) | public static BigInteger toBigInteger(byte[] data) {
method bytes_from_point (line 91) | public static byte[] bytes_from_point(BigInteger[] point) {
method schnorr_sign (line 98) | public static byte[] schnorr_sign(byte[] msg, BigInteger seckey) {
method schnorr_verify (line 136) | public static boolean schnorr_verify(byte[] msg, byte[] pubkey, byte[]...
method hexStringToByteArray (line 175) | public static byte[] hexStringToByteArray(String s) {
method bytesToHex (line 185) | public static String bytesToHex(byte[] bytes) {
method bytesToHex (line 195) | public static String bytesToHex(byte[] bytes, int startPos, int len) {
method sha256 (line 205) | public static byte[] sha256(byte[] input) throws NoSuchAlgorithmExcept...
FILE: bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/crypto/schnorr/Util.java
class Util (line 8) | public class Util {
method bytesFromBigInteger (line 12) | public static byte[] bytesFromBigInteger(BigInteger n) {
method bigIntFromBytes (line 29) | public static BigInteger bigIntFromBytes(byte[] b) {
method sha256 (line 33) | public static byte[] sha256(byte[] b) throws NoSuchAlgorithmException {
method xor (line 38) | public static byte[] xor(byte[] b0, byte[] b1) {
FILE: bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/exceptions/AddressFormatException.java
class AddressFormatException (line 23) | public class AddressFormatException extends BitcoinException {
method AddressFormatException (line 25) | public AddressFormatException(String msg) {
FILE: bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/exceptions/BitcoinException.java
class BitcoinException (line 8) | public class BitcoinException extends RuntimeException {
method BitcoinException (line 10) | public BitcoinException() {
method BitcoinException (line 13) | public BitcoinException(String message) {
method BitcoinException (line 17) | public BitcoinException(Throwable cause) {
method BitcoinException (line 21) | public BitcoinException(String message, Throwable cause) {
FILE: bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/io/BitcoinInput.java
class BitcoinInput (line 13) | public class BitcoinInput implements AutoCloseable {
method BitcoinInput (line 19) | public BitcoinInput(InputStream in) {
method readVarInt (line 30) | public long readVarInt() throws IOException {
method read (line 59) | public int read() throws IOException {
method readFully (line 69) | public void readFully(byte b[]) throws IOException {
method readByte (line 87) | public byte readByte() throws IOException {
method readUnsignedByte (line 99) | public int readUnsignedByte() throws IOException {
method readShort (line 112) | public short readShort() throws IOException {
method readUnsignedShort (line 126) | public int readUnsignedShort() throws IOException {
method readChar (line 135) | public char readChar() throws IOException {
method readInt (line 149) | public int readInt() throws IOException {
method readUnsignedInt (line 165) | public long readUnsignedInt() throws IOException {
method readLong (line 182) | public long readLong() throws IOException {
method readString (line 196) | public String readString() throws IOException {
method readBytes (line 213) | public byte[] readBytes(int len) throws IOException {
method close (line 222) | @Override
FILE: bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/io/BitcoinInputMarkable.java
class BitcoinInputMarkable (line 10) | public final class BitcoinInputMarkable extends BitcoinInput {
method BitcoinInputMarkable (line 16) | public BitcoinInputMarkable(byte[] data) {
method mark (line 24) | public void mark() {
method reset (line 31) | public void reset() throws IOException {
FILE: bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/io/BitcoinOutput.java
class BitcoinOutput (line 13) | public final class BitcoinOutput {
method BitcoinOutput (line 20) | public BitcoinOutput() {
method write (line 29) | public BitcoinOutput write(byte[] bytes) {
method writeByte (line 42) | public BitcoinOutput writeByte(int v) {
method writeShort (line 51) | public BitcoinOutput writeShort(short v) {
method writeInt (line 61) | public BitcoinOutput writeInt(int v) {
method writeInt32 (line 73) | public BitcoinOutput writeInt32(long v) {
method writeLong (line 86) | public BitcoinOutput writeLong(long v) {
method writeVarInt (line 103) | public BitcoinOutput writeVarInt(long n) {
method writeUnsignedInt (line 125) | public BitcoinOutput writeUnsignedInt(long ln) {
method writeUnsignedShort (line 136) | public BitcoinOutput writeUnsignedShort(int i) {
method writeString (line 147) | public BitcoinOutput writeString(String str) {
method toByteArray (line 154) | public byte[] toByteArray() {
FILE: bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/io/UnsafeByteArrayOutputStream.java
class UnsafeByteArrayOutputStream (line 7) | public class UnsafeByteArrayOutputStream extends ByteArrayOutputStream {
method UnsafeByteArrayOutputStream (line 9) | public UnsafeByteArrayOutputStream() {
method UnsafeByteArrayOutputStream (line 13) | public UnsafeByteArrayOutputStream(int size) {
method write (line 22) | @Override
method write (line 40) | @Override
method writeTo (line 64) | @Override
method reset (line 77) | @Override
method toByteArray (line 90) | @Override
method size (line 102) | @Override
method copyOf (line 107) | private static byte[] copyOf(byte[] in, int length) {
FILE: bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/utils/HashUtils.java
class HashUtils (line 8) | public class HashUtils {
method sha256 (line 16) | public static byte[] sha256(byte[] input) {
method doubleSha256 (line 28) | public static byte[] doubleSha256(byte[] input) {
method scrypt (line 46) | public static byte[] scrypt(byte[] P, byte[] S, int N, int r, int p, i...
method toHexString (line 55) | public static String toHexString(byte[] b) {
method toHexString (line 64) | public static String toHexString(byte[] b, boolean sep) {
method toHexStringAsLE (line 83) | public static String toHexStringAsLE(byte[] b) {
method toBytesAsLE (line 99) | public static byte[] toBytesAsLE(String hash) {
method toBytes (line 108) | public static byte[] toBytes(String hash) {
method char2int (line 128) | static int char2int(char ch) {
FILE: bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/utils/Utils.java
class Utils (line 34) | public class Utils {
method doubleDigest (line 58) | public static byte[] doubleDigest(byte[] input) {
method doubleDigest (line 70) | public static byte[] doubleDigest(byte[] input, int offset, int length) {
method sha256Hash160 (line 87) | public static byte[] sha256Hash160(byte[] input) {
method hmacSha512 (line 106) | public static byte[] hmacSha512(byte[] key, byte[] input) {
method checkBitLE (line 122) | public static boolean checkBitLE(byte[] data, int index) {
method setBitLE (line 131) | public static void setBitLE(byte[] data, int index) {
method doubleDigestTwoBuffers (line 146) | public static byte[] doubleDigestTwoBuffers(byte[]input1, int offset1,...
method readUint32BE (line 166) | public static long readUint32BE(byte[] bytes, int offset) {
method readUint16FromStream (line 177) | public static int readUint16FromStream(InputStream is) {
method readUint32FromStream (line 190) | public static long readUint32FromStream(InputStream is) {
method intToByteArray (line 206) | public static byte[] intToByteArray(int value) {
method byteArrayToUInt16LE (line 215) | public static int byteArrayToUInt16LE(byte[] data) {
method intFromBytes (line 228) | public static int intFromBytes(byte b1, byte b2, byte b3, byte b4) {
method randomLong (line 233) | public static long randomLong() {
method randomInt (line 238) | public static int randomInt() {
FILE: dashkit/cpp/dashj-bls/dashj-bls-signature-wrapper.cpp
class SwigValueWrapper (line 39) | class SwigValueWrapper {
type SwigMovePointer (line 40) | struct SwigMovePointer {
method SwigMovePointer (line 42) | SwigMovePointer(T *p) : ptr(p) { }
method SwigMovePointer (line 44) | SwigMovePointer& operator=(SwigMovePointer& rhs) { T* oldptr = ptr; ...
method SwigValueWrapper (line 49) | SwigValueWrapper() : pointer(0) { }
method SwigValueWrapper (line 50) | SwigValueWrapper& operator=(const T& t) { SwigMovePointer tmp(new T(t)...
method T (line 52) | T *operator&() { return pointer.ptr; }
function T (line 55) | T SwigValueInit() {
function SWIGINTERN (line 273) | SWIGINTERN std::vector< bls::PublicKey >::const_reference std_vector_Sl_...
function SWIGINTERN (line 276) | SWIGINTERN std::vector< bls::PublicKey >::value_type std_vector_Sl_bls_P...
function SWIGINTERN (line 281) | SWIGINTERN int32_t std_vector_Sl_bls_PublicKey_Sg__size(std::vector< bls...
function SWIGINTERN (line 284) | SWIGINTERN void std_vector_Sl_bls_PublicKey_Sg__removeRange(std::vector<...
function SWIGINTERN (line 287) | SWIGINTERN std::vector< bls::PrivateKey >::const_reference std_vector_Sl...
function SWIGINTERN (line 290) | SWIGINTERN std::vector< bls::PrivateKey >::value_type std_vector_Sl_bls_...
function SWIGINTERN (line 295) | SWIGINTERN int32_t std_vector_Sl_bls_PrivateKey_Sg__size(std::vector< bl...
function SWIGINTERN (line 298) | SWIGINTERN void std_vector_Sl_bls_PrivateKey_Sg__removeRange(std::vector...
function SWIGINTERN (line 301) | SWIGINTERN std::vector< unsigned char * >::const_reference std_vector_Sl...
function SWIGINTERN (line 304) | SWIGINTERN std::vector< unsigned char * >::value_type std_vector_Sl_uint...
function SWIGINTERN (line 309) | SWIGINTERN int32_t std_vector_Sl_uint8_t_Sm__Sg__size(std::vector< uint8...
function SWIGINTERN (line 312) | SWIGINTERN void std_vector_Sl_uint8_t_Sm__Sg__removeRange(std::vector< u...
function SWIGINTERN (line 315) | SWIGINTERN std::vector< bn_t * >::const_reference std_vector_Sl_bn_t_Sm_...
function SWIGINTERN (line 318) | SWIGINTERN std::vector< bn_t * >::value_type std_vector_Sl_bn_t_Sm__Sg__...
function SWIGINTERN (line 323) | SWIGINTERN int32_t std_vector_Sl_bn_t_Sm__Sg__size(std::vector< bn_t * >...
function SWIGINTERN (line 326) | SWIGINTERN void std_vector_Sl_bn_t_Sm__Sg__removeRange(std::vector< bn_t...
function SWIGINTERN (line 329) | SWIGINTERN std::vector< bls::Signature >::const_reference std_vector_Sl_...
function SWIGINTERN (line 332) | SWIGINTERN std::vector< bls::Signature >::value_type std_vector_Sl_bls_S...
function SWIGINTERN (line 337) | SWIGINTERN int32_t std_vector_Sl_bls_Signature_Sg__size(std::vector< bls...
function SWIGINTERN (line 340) | SWIGINTERN void std_vector_Sl_bls_Signature_Sg__removeRange(std::vector<...
function SWIGINTERN (line 344) | SWIGINTERN std::vector< bls::InsecureSignature >::const_reference std_ve...
function SWIGINTERN (line 347) | SWIGINTERN std::vector< bls::InsecureSignature >::value_type std_vector_...
function SWIGINTERN (line 352) | SWIGINTERN int32_t std_vector_Sl_bls_InsecureSignature_Sg__size(std::vec...
function SWIGINTERN (line 355) | SWIGINTERN void std_vector_Sl_bls_InsecureSignature_Sg__removeRange(std:...
function SWIGINTERN (line 358) | SWIGINTERN std::vector< bls::AggregationInfo >::const_reference std_vect...
function SWIGINTERN (line 361) | SWIGINTERN std::vector< bls::AggregationInfo >::value_type std_vector_Sl...
function SWIGINTERN (line 366) | SWIGINTERN int32_t std_vector_Sl_bls_AggregationInfo_Sg__size(std::vecto...
function SWIGINTERN (line 369) | SWIGINTERN void std_vector_Sl_bls_AggregationInfo_Sg__removeRange(std::v...
function SWIGEXPORT (line 377) | SWIGEXPORT jstring JNICALL Java_org_dashj_bls_JNI_BLS_1GROUP_1ORDER_1get...
function SWIGEXPORT (line 389) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_BLS_1MESSAGE_1HASH_1LEN_...
function SWIGEXPORT (line 401) | SWIGEXPORT jboolean JNICALL Java_org_dashj_bls_JNI_BLS_1Init(JNIEnv *jen...
function SWIGEXPORT (line 412) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_BLS_1ID_1SIZE_1get(JNIEn...
function SWIGEXPORT (line 424) | SWIGEXPORT void JNICALL JJava_org_dashj_bls_JNI_BLS_1AssertInitialized(J...
function SWIGEXPORT (line 431) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_BLS_1Clean(JNIEnv *jenv, ...
function SWIGEXPORT (line 438) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_BLS_1SetSecureAllocator(J...
function SWIGEXPORT (line 462) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_BLS_1HashPubKeys(JNIEnv *...
function SWIGEXPORT (line 487) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_BLS_1PrivateKeyShare(JNI...
function SWIGEXPORT (line 513) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_BLS_1RecoverPrivateKey(J...
function SWIGEXPORT (line 536) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_BLS_1PublicKeyShare(JNIE...
function SWIGEXPORT (line 562) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_BLS_1RecoverPublicKey(JN...
function SWIGEXPORT (line 586) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_BLS_1SignatureShare(JNIE...
function SWIGEXPORT (line 612) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_BLS_1RecoverSig(JNIEnv *...
function SWIGEXPORT (line 636) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_BLS_1DHKeyExchange(JNIEn...
function SWIGEXPORT (line 660) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_BLS_1CheckRelicErrors(JNI...
function SWIGEXPORT (line 667) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_new_1BLS(JNIEnv *jenv, j...
function SWIGEXPORT (line 679) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_delete_1BLS(JNIEnv *jenv,...
function SWIGEXPORT (line 689) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_ChainCode_1CHAIN_1CODE_1...
function SWIGEXPORT (line 701) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_ChainCode_1FromBytes(JNI...
function SWIGEXPORT (line 721) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_new_1ChainCode(JNIEnv *j...
function SWIGEXPORT (line 740) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_ChainCode_1Serialize_1_1S...
function SWIGEXPORT (line 759) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_ChainCode_1Serialize_1_1...
function SWIGEXPORT (line 774) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_delete_1ChainCode(JNIEnv ...
function SWIGEXPORT (line 784) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_ExtendedPrivateKey_1EXTE...
function SWIGEXPORT (line 796) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_ExtendedPrivateKey_1From...
function SWIGEXPORT (line 818) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_ExtendedPrivateKey_1From...
function SWIGEXPORT (line 838) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_ExtendedPrivateKey_1Priv...
function SWIGEXPORT (line 855) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_ExtendedPrivateKey_1Publ...
function SWIGEXPORT (line 872) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_ExtendedPrivateKey_1GetV...
function SWIGEXPORT (line 887) | SWIGEXPORT jshort JNICALL Java_org_dashj_bls_JNI_ExtendedPrivateKey_1Get...
function SWIGEXPORT (line 902) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_ExtendedPrivateKey_1GetP...
function SWIGEXPORT (line 917) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_ExtendedPrivateKey_1GetC...
function SWIGEXPORT (line 932) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_ExtendedPrivateKey_1GetC...
function SWIGEXPORT (line 947) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_ExtendedPrivateKey_1GetP...
function SWIGEXPORT (line 962) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_ExtendedPrivateKey_1GetP...
function SWIGEXPORT (line 977) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_ExtendedPrivateKey_1GetE...
function SWIGEXPORT (line 992) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_ExtendedPrivateKey_1Seria...
function SWIGEXPORT (line 1011) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_ExtendedPrivateKey_1Seri...
function SWIGEXPORT (line 1026) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_delete_1ExtendedPrivateKe...
function SWIGEXPORT (line 1036) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_ExtendedPublicKey_1VERSI...
function SWIGEXPORT (line 1048) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_ExtendedPublicKey_1EXTEN...
function SWIGEXPORT (line 1060) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_ExtendedPublicKey_1FromB...
function SWIGEXPORT (line 1080) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_ExtendedPublicKey_1Publi...
function SWIGEXPORT (line 1097) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_ExtendedPublicKey_1GetVe...
function SWIGEXPORT (line 1112) | SWIGEXPORT jshort JNICALL Java_org_dashj_bls_JNI_ExtendedPublicKey_1GetD...
function SWIGEXPORT (line 1127) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_ExtendedPublicKey_1GetPa...
function SWIGEXPORT (line 1142) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_ExtendedPublicKey_1GetCh...
function SWIGEXPORT (line 1157) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_ExtendedPublicKey_1GetCh...
function SWIGEXPORT (line 1172) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_ExtendedPublicKey_1GetPu...
function SWIGEXPORT (line 1187) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_ExtendedPublicKey_1Serial...
function SWIGEXPORT (line 1206) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_ExtendedPublicKey_1Seria...
function SWIGEXPORT (line 1221) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_delete_1ExtendedPublicKey...
function SWIGEXPORT (line 1231) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_PrivateKey_1PRIVATE_1KEY...
function SWIGEXPORT (line 1243) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_PrivateKey_1FromSeed(JNI...
function SWIGEXPORT (line 1265) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_PrivateKey_1FromBytes_1_...
function SWIGEXPORT (line 1287) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_PrivateKey_1FromBytes_1_...
function SWIGEXPORT (line 1307) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_new_1PrivateKey_1_1SWIG_...
function SWIGEXPORT (line 1326) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_delete_1PrivateKey(JNIEnv...
function SWIGEXPORT (line 1336) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_PrivateKey_1GetPublicKey...
function SWIGEXPORT (line 1351) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_PrivateKey_1AggregateIns...
function SWIGEXPORT (line 1370) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_PrivateKey_1Aggregate(JN...
function SWIGEXPORT (line 1395) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_PrivateKey_1Serialize_1_1...
function SWIGEXPORT (line 1414) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_PrivateKey_1Serialize_1_...
function SWIGEXPORT (line 1429) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_PrivateKey_1SignInsecure...
function SWIGEXPORT (line 1454) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_PrivateKey_1SignInsecure...
function SWIGEXPORT (line 1477) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_PrivateKey_1Sign(JNIEnv ...
function SWIGEXPORT (line 1502) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_PrivateKey_1SignPrehashe...
function SWIGEXPORT (line 1525) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_PublicKey_1PUBLIC_1KEY_1...
function SWIGEXPORT (line 1537) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_PublicKey_1FromBytes(JNI...
function SWIGEXPORT (line 1557) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_PublicKey_1FromG1(JNIEnv...
function SWIGEXPORT (line 1571) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_new_1PublicKey(JNIEnv *j...
function SWIGEXPORT (line 1590) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_PublicKey_1AggregateInse...
function SWIGEXPORT (line 1609) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_PublicKey_1Aggregate(JNI...
function SWIGEXPORT (line 1628) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_PublicKey_1Serialize_1_1S...
function SWIGEXPORT (line 1647) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_PublicKey_1Serialize_1_1...
function SWIGEXPORT (line 1662) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_PublicKey_1GetFingerprin...
function SWIGEXPORT (line 1677) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_delete_1PublicKey(JNIEnv ...
function SWIGEXPORT (line 1687) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_InsecureSignature_1SIGNA...
function SWIGEXPORT (line 1699) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_InsecureSignature_1FromB...
function SWIGEXPORT (line 1719) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_InsecureSignature_1FromG...
function SWIGEXPORT (line 1733) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_new_1InsecureSignature(J...
function SWIGEXPORT (line 1752) | SWIGEXPORT jboolean JNICALL Java_org_dashj_bls_JNI_InsecureSignature_1Ve...
function SWIGEXPORT (line 1780) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_InsecureSignature_1Aggre...
function SWIGEXPORT (line 1798) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_InsecureSignature_1Divid...
function SWIGEXPORT (line 1819) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_InsecureSignature_1Serial...
function SWIGEXPORT (line 1838) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_InsecureSignature_1Seria...
function SWIGEXPORT (line 1853) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_delete_1InsecureSignature...
function SWIGEXPORT (line 1863) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_Signature_1SIGNATURE_1SI...
function SWIGEXPORT (line 1875) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_Signature_1FromBytes_1_1...
function SWIGEXPORT (line 1895) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_Signature_1FromBytes_1_1...
function SWIGEXPORT (line 1921) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_Signature_1FromG2_1_1SWI...
function SWIGEXPORT (line 1935) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_Signature_1FromG2_1_1SWI...
function SWIGEXPORT (line 1955) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_Signature_1FromInsecureS...
function SWIGEXPORT (line 1974) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_Signature_1FromInsecureS...
function SWIGEXPORT (line 1999) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_new_1Signature(JNIEnv *j...
function SWIGEXPORT (line 2018) | SWIGEXPORT jboolean JNICALL Java_org_dashj_bls_JNI_Signature_1Verify(JNI...
function SWIGEXPORT (line 2033) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_Signature_1AggregateSigs...
function SWIGEXPORT (line 2051) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_Signature_1DivideBy(JNIE...
function SWIGEXPORT (line 2072) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_Signature_1GetAggregatio...
function SWIGEXPORT (line 2087) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_Signature_1SetAggregation...
function SWIGEXPORT (line 2104) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_Signature_1Serialize_1_1S...
function SWIGEXPORT (line 2123) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_Signature_1Serialize_1_1...
function SWIGEXPORT (line 2138) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_delete_1Signature(JNIEnv ...
function SWIGEXPORT (line 2148) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_AggregationInfo_1FromMsg...
function SWIGEXPORT (line 2175) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_AggregationInfo_1FromMsg...
function SWIGEXPORT (line 2204) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_AggregationInfo_1FromVec...
function SWIGEXPORT (line 2237) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_AggregationInfo_1MergeIn...
function SWIGEXPORT (line 2255) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_new_1AggregationInfo_1_1...
function SWIGEXPORT (line 2274) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_AggregationInfo_1RemoveEn...
function SWIGEXPORT (line 2299) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_AggregationInfo_1GetExpon...
function SWIGEXPORT (line 2327) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_AggregationInfo_1GetPubK...
function SWIGEXPORT (line 2342) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_AggregationInfo_1GetMess...
function SWIGEXPORT (line 2357) | SWIGEXPORT jboolean JNICALL Java_org_dashj_bls_JNI_AggregationInfo_1Empt...
function SWIGEXPORT (line 2372) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_new_1AggregationInfo_1_1...
function SWIGEXPORT (line 2384) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_delete_1AggregationInfo(J...
function SWIGEXPORT (line 2394) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_new_1PublicKeyVec_1_1SWI...
function SWIGEXPORT (line 2406) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_new_1PublicKeyVec_1_1SWI...
function SWIGEXPORT (line 2425) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_PublicKeyVec_1capacity(J...
function SWIGEXPORT (line 2440) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_PublicKeyVec_1reserve(JNI...
function SWIGEXPORT (line 2453) | SWIGEXPORT jboolean JNICALL Java_org_dashj_bls_JNI_PublicKeyVec_1isEmpty...
function SWIGEXPORT (line 2468) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_PublicKeyVec_1clear(JNIEn...
function SWIGEXPORT (line 2479) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_PublicKeyVec_1push_1back(...
function SWIGEXPORT (line 2497) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_PublicKeyVec_1get(JNIEnv...
function SWIGEXPORT (line 2521) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_PublicKeyVec_1set(JNIEnv...
function SWIGEXPORT (line 2552) | SWIGEXPORT jint JNICALL Java_org_dashj_bls_JNI_PublicKeyVec_1size(JNIEnv...
function SWIGEXPORT (line 2567) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_PublicKeyVec_1removeRange...
function SWIGEXPORT (line 2582) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_delete_1PublicKeyVec(JNIE...
function SWIGEXPORT (line 2592) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_new_1PrivateKeyVec_1_1SW...
function SWIGEXPORT (line 2604) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_new_1PrivateKeyVec_1_1SW...
function SWIGEXPORT (line 2623) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_PrivateKeyVec_1capacity(...
function SWIGEXPORT (line 2638) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_PrivateKeyVec_1reserve(JN...
function SWIGEXPORT (line 2651) | SWIGEXPORT jboolean JNICALL Java_org_dashj_bls_JNI_PrivateKeyVec_1isEmpt...
function SWIGEXPORT (line 2666) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_PrivateKeyVec_1clear(JNIE...
function SWIGEXPORT (line 2677) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_PrivateKeyVec_1push_1back...
function SWIGEXPORT (line 2695) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_PrivateKeyVec_1get(JNIEn...
function SWIGEXPORT (line 2719) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_PrivateKeyVec_1set(JNIEn...
function SWIGEXPORT (line 2750) | SWIGEXPORT jint JNICALL Java_org_dashj_bls_JNI_PrivateKeyVec_1size(JNIEn...
function SWIGEXPORT (line 2765) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_PrivateKeyVec_1removeRang...
function SWIGEXPORT (line 2780) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_delete_1PrivateKeyVec(JNI...
function SWIGEXPORT (line 2790) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_new_1ByteArrayVec_1_1SWI...
function SWIGEXPORT (line 2802) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_new_1ByteArrayVec_1_1SWI...
function SWIGEXPORT (line 2816) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_new_1ByteArrayVec_1_1SWI...
function SWIGEXPORT (line 2835) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_ByteArrayVec_1capacity(J...
function SWIGEXPORT (line 2850) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_ByteArrayVec_1reserve(JNI...
function SWIGEXPORT (line 2863) | SWIGEXPORT jboolean JNICALL Java_org_dashj_bls_JNI_ByteArrayVec_1isEmpty...
function SWIGEXPORT (line 2878) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_ByteArrayVec_1clear(JNIEn...
function SWIGEXPORT (line 2891) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_ByteArrayVec_1push_1back(...
function SWIGEXPORT (line 2923) | SWIGEXPORT jbyteArray JNICALL Java_org_dashj_bls_JNI_ByteArrayVec_1get(J...
function SWIGEXPORT (line 2964) | SWIGEXPORT jbyteArray JNICALL Java_org_dashj_bls_JNI_ByteArrayVec_1set(J...
function SWIGEXPORT (line 3021) | SWIGEXPORT jint JNICALL Java_org_dashj_bls_JNI_ByteArrayVec_1size(JNIEnv...
function SWIGEXPORT (line 3036) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_ByteArrayVec_1removeRange...
function SWIGEXPORT (line 3053) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_delete_1ByteArrayVec(JNIE...
function SWIGEXPORT (line 3066) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_new_1BigIntegerVec_1_1SW...
function SWIGEXPORT (line 3078) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_new_1BigIntegerVec_1_1SW...
function SWIGEXPORT (line 3092) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_new_1BigIntegerVec_1_1SW...
function SWIGEXPORT (line 3111) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_BigIntegerVec_1capacity(...
function SWIGEXPORT (line 3126) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_BigIntegerVec_1reserve(JN...
function SWIGEXPORT (line 3139) | SWIGEXPORT jboolean JNICALL Java_org_dashj_bls_JNI_BigIntegerVec_1isEmpt...
function SWIGEXPORT (line 3154) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_BigIntegerVec_1clear(JNIE...
function SWIGEXPORT (line 3165) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_BigIntegerVec_1push_1back...
function SWIGEXPORT (line 3180) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_BigIntegerVec_1get(JNIEn...
function SWIGEXPORT (line 3204) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_BigIntegerVec_1set(JNIEn...
function SWIGEXPORT (line 3232) | SWIGEXPORT jint JNICALL Java_org_dashj_bls_JNI_BigIntegerVec_1size(JNIEn...
function SWIGEXPORT (line 3247) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_BigIntegerVec_1removeRang...
function SWIGEXPORT (line 3262) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_delete_1BigIntegerVec(JNI...
function SWIGEXPORT (line 3272) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_new_1SignatureVector_1_1...
function SWIGEXPORT (line 3283) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_new_1SignatureVector_1_1...
function SWIGEXPORT (line 3302) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_SignatureVector_1capacit...
function SWIGEXPORT (line 3317) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_SignatureVector_1reserve(...
function SWIGEXPORT (line 3330) | SWIGEXPORT jboolean JNICALL Java_org_dashj_bls_JNI_SignatureVector_1isEm...
function SWIGEXPORT (line 3345) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_SignatureVector_1clear(JN...
function SWIGEXPORT (line 3356) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_SignatureVector_1push_1ba...
function SWIGEXPORT (line 3374) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_SignatureVector_1get(JNI...
function SWIGEXPORT (line 3398) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_SignatureVector_1set(JNI...
function SWIGEXPORT (line 3429) | SWIGEXPORT jint JNICALL Java_org_dashj_bls_JNI_SignatureVector_1size(JNI...
function SWIGEXPORT (line 3444) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_SignatureVector_1removeRa...
function SWIGEXPORT (line 3459) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_delete_1SignatureVector(J...
function SWIGEXPORT (line 3468) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_new_1InsecureSignatureVe...
function SWIGEXPORT (line 3479) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_new_1InsecureSignatureVe...
function SWIGEXPORT (line 3498) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_InsecureSignatureVector_...
function SWIGEXPORT (line 3513) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_InsecureSignatureVector_1...
function SWIGEXPORT (line 3526) | SWIGEXPORT jboolean JNICALL Java_org_dashj_bls_JNI_InsecureSignatureVect...
function SWIGEXPORT (line 3541) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_InsecureSignatureVector_1...
function SWIGEXPORT (line 3552) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_InsecureSignatureVector_1...
function SWIGEXPORT (line 3570) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_InsecureSignatureVector_...
function SWIGEXPORT (line 3594) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_InsecureSignatureVector_...
function SWIGEXPORT (line 3625) | SWIGEXPORT jint JNICALL Java_org_dashj_bls_JNI_InsecureSignatureVector_1...
function SWIGEXPORT (line 3640) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_InsecureSignatureVector_1...
function SWIGEXPORT (line 3655) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_delete_1InsecureSignature...
function SWIGEXPORT (line 3664) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_new_1AggregationInfoVect...
function SWIGEXPORT (line 3675) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_AggregationInfoVector_1c...
function SWIGEXPORT (line 3690) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_AggregationInfoVector_1re...
function SWIGEXPORT (line 3703) | SWIGEXPORT jboolean JNICALL Java_org_dashj_bls_JNI_AggregationInfoVector...
function SWIGEXPORT (line 3718) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_AggregationInfoVector_1cl...
function SWIGEXPORT (line 3729) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_AggregationInfoVector_1pu...
function SWIGEXPORT (line 3747) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_AggregationInfoVector_1g...
function SWIGEXPORT (line 3771) | SWIGEXPORT jlong JNICALL Java_org_dashj_bls_JNI_AggregationInfoVector_1s...
function SWIGEXPORT (line 3802) | SWIGEXPORT jint JNICALL Java_org_dashj_bls_JNI_AggregationInfoVector_1si...
function SWIGEXPORT (line 3817) | SWIGEXPORT void JNICALL Java_org_dashj_bls_JNI_AggregationInfoVector_1re...
FILE: ecashkit/src/main/kotlin/chronik/Chronik.java
class Chronik (line 6) | public final class Chronik {
method Chronik (line 7) | private Chronik() {}
method registerAllExtensions (line 8) | public static void registerAllExtensions(
type SlpTokenType (line 14) | public enum SlpTokenType
method getNumber (line 53) | @java.lang.Override
method valueOf (line 67) | @java.lang.Deprecated
method forNumber (line 72) | public static SlpTokenType forNumber(int value) {
method internalGetValueMap (line 82) | public static com.google.protobuf.Internal.EnumLiteMap<SlpTokenType>
method findValueByNumber (line 89) | @java.lang.Override
method internalGetVerifier (line 95) | public static com.google.protobuf.Internal.EnumVerifier
class SlpTokenTypeVerifier (line 100) | private static final class SlpTokenTypeVerifier implements
method isInRange (line 103) | @java.lang.Override
method SlpTokenType (line 111) | private SlpTokenType(int value) {
type SlpTxType (line 121) | public enum SlpTxType
method getNumber (line 168) | @java.lang.Override
method valueOf (line 182) | @java.lang.Deprecated
method forNumber (line 187) | public static SlpTxType forNumber(int value) {
method internalGetValueMap (line 198) | public static com.google.protobuf.Internal.EnumLiteMap<SlpTxType>
method findValueByNumber (line 205) | @java.lang.Override
method internalGetVerifier (line 211) | public static com.google.protobuf.Internal.EnumVerifier
class SlpTxTypeVerifier (line 216) | private static final class SlpTxTypeVerifier implements
method isInRange (line 219) | @java.lang.Override
method SlpTxType (line 227) | private SlpTxType(int value) {
type Network (line 237) | public enum Network
method getNumber (line 276) | @java.lang.Override
method valueOf (line 290) | @java.lang.Deprecated
method forNumber (line 295) | public static Network forNumber(int value) {
method internalGetValueMap (line 305) | public static com.google.protobuf.Internal.EnumLiteMap<Network>
method findValueByNumber (line 312) | @java.lang.Override
method internalGetVerifier (line 318) | public static com.google.protobuf.Internal.EnumVerifier
class NetworkVerifier (line 323) | private static final class NetworkVerifier implements
method isInRange (line 326) | @java.lang.Override
method Network (line 334) | private Network(int value) {
type UtxoStateVariant (line 344) | public enum UtxoStateVariant
method getNumber (line 383) | @java.lang.Override
method valueOf (line 397) | @java.lang.Deprecated
method forNumber (line 402) | public static UtxoStateVariant forNumber(int value) {
method internalGetValueMap (line 412) | public static com.google.protobuf.Internal.EnumLiteMap<UtxoStateVari...
method findValueByNumber (line 419) | @java.lang.Override
method internalGetVerifier (line 425) | public static com.google.protobuf.Internal.EnumVerifier
class UtxoStateVariantVerifier (line 430) | private static final class UtxoStateVariantVerifier implements
method isInRange (line 433) | @java.lang.Override
method UtxoStateVariant (line 441) | private UtxoStateVariant(int value) {
type ValidateUtxoRequestOrBuilder (line 448) | public interface ValidateUtxoRequestOrBuilder extends
method getOutpointsList (line 455) | java.util.List<chronik.Chronik.OutPoint>
method getOutpoints (line 460) | chronik.Chronik.OutPoint getOutpoints(int index);
method getOutpointsCount (line 464) | int getOutpointsCount();
class ValidateUtxoRequest (line 469) | public static final class ValidateUtxoRequest extends
method ValidateUtxoRequest (line 474) | private ValidateUtxoRequest() {
method getOutpointsList (line 482) | @java.lang.Override
method getOutpointsOrBuilderList (line 489) | public java.util.List<? extends chronik.Chronik.OutPointOrBuilder>
method getOutpointsCount (line 496) | @java.lang.Override
method getOutpoints (line 503) | @java.lang.Override
method getOutpointsOrBuilder (line 510) | public chronik.Chronik.OutPointOrBuilder getOutpointsOrBuilder(
method ensureOutpointsIsMutable (line 514) | private void ensureOutpointsIsMutable() {
method setOutpoints (line 525) | private void setOutpoints(
method addOutpoints (line 534) | private void addOutpoints(chronik.Chronik.OutPoint value) {
method addOutpoints (line 542) | private void addOutpoints(
method addAllOutpoints (line 551) | private void addAllOutpoints(
method clearOutpoints (line 560) | private void clearOutpoints() {
method removeOutpoints (line 566) | private void removeOutpoints(int index) {
method parseFrom (line 571) | public static chronik.Chronik.ValidateUtxoRequest parseFrom(
method parseFrom (line 577) | public static chronik.Chronik.ValidateUtxoRequest parseFrom(
method parseFrom (line 584) | public static chronik.Chronik.ValidateUtxoRequest parseFrom(
method parseFrom (line 590) | public static chronik.Chronik.ValidateUtxoRequest parseFrom(
method parseFrom (line 597) | public static chronik.Chronik.ValidateUtxoRequest parseFrom(byte[] d...
method parseFrom (line 602) | public static chronik.Chronik.ValidateUtxoRequest parseFrom(
method parseFrom (line 609) | public static chronik.Chronik.ValidateUtxoRequest parseFrom(java.io....
method parseFrom (line 614) | public static chronik.Chronik.ValidateUtxoRequest parseFrom(
method parseDelimitedFrom (line 621) | public static chronik.Chronik.ValidateUtxoRequest parseDelimitedFrom...
method parseDelimitedFrom (line 625) | public static chronik.Chronik.ValidateUtxoRequest parseDelimitedFrom(
method parseFrom (line 631) | public static chronik.Chronik.ValidateUtxoRequest parseFrom(
method parseFrom (line 637) | public static chronik.Chronik.ValidateUtxoRequest parseFrom(
method newBuilder (line 645) | public static Builder newBuilder() {
method newBuilder (line 648) | public static Builder newBuilder(chronik.Chronik.ValidateUtxoRequest...
class Builder (line 655) | public static final class Builder extends
method Builder (line 661) | private Builder() {
method getOutpointsList (line 669) | @java.lang.Override
method getOutpointsCount (line 677) | @java.lang.Override
method getOutpoints (line 683) | @java.lang.Override
method setOutpoints (line 690) | public Builder setOutpoints(
method setOutpoints (line 699) | public Builder setOutpoints(
method addOutpoints (line 709) | public Builder addOutpoints(chronik.Chronik.OutPoint value) {
method addOutpoints (line 717) | public Builder addOutpoints(
method addOutpoints (line 726) | public Builder addOutpoints(
method addOutpoints (line 735) | public Builder addOutpoints(
method addAllOutpoints (line 745) | public Builder addAllOutpoints(
method clearOutpoints (line 754) | public Builder clearOutpoints() {
method removeOutpoints (line 762) | public Builder removeOutpoints(int index) {
method dynamicMethod (line 770) | @java.lang.Override
method getDefaultInstance (line 832) | public static chronik.Chronik.ValidateUtxoRequest getDefaultInstance...
method parser (line 838) | public static com.google.protobuf.Parser<ValidateUtxoRequest> parser...
type ValidateUtxoResponseOrBuilder (line 843) | public interface ValidateUtxoResponseOrBuilder extends
method getUtxoStatesList (line 850) | java.util.List<chronik.Chronik.UtxoState>
method getUtxoStates (line 855) | chronik.Chronik.UtxoState getUtxoStates(int index);
method getUtxoStatesCount (line 859) | int getUtxoStatesCount();
class ValidateUtxoResponse (line 864) | public static final class ValidateUtxoResponse extends
method ValidateUtxoResponse (line 869) | private ValidateUtxoResponse() {
method getUtxoStatesList (line 877) | @java.lang.Override
method getUtxoStatesOrBuilderList (line 884) | public java.util.List<? extends chronik.Chronik.UtxoStateOrBuilder>
method getUtxoStatesCount (line 891) | @java.lang.Override
method getUtxoStates (line 898) | @java.lang.Override
method getUtxoStatesOrBuilder (line 905) | public chronik.Chronik.UtxoStateOrBuilder getUtxoStatesOrBuilder(
method ensureUtxoStatesIsMutable (line 909) | private void ensureUtxoStatesIsMutable() {
method setUtxoStates (line 920) | private void setUtxoStates(
method addUtxoStates (line 929) | private void addUtxoStates(chronik.Chronik.UtxoState value) {
method addUtxoStates (line 937) | private void addUtxoStates(
method addAllUtxoStates (line 946) | private void addAllUtxoStates(
method clearUtxoStates (line 955) | private void clearUtxoStates() {
method removeUtxoStates (line 961) | private void removeUtxoStates(int index) {
method parseFrom (line 966) | public static chronik.Chronik.ValidateUtxoResponse parseFrom(
method parseFrom (line 972) | public static chronik.Chronik.ValidateUtxoResponse parseFrom(
method parseFrom (line 979) | public static chronik.Chronik.ValidateUtxoResponse parseFrom(
method parseFrom (line 985) | public static chronik.Chronik.ValidateUtxoResponse parseFrom(
method parseFrom (line 992) | public static chronik.Chronik.ValidateUtxoResponse parseFrom(byte[] ...
method parseFrom (line 997) | public static chronik.Chronik.ValidateUtxoResponse parseFrom(
method parseFrom (line 1004) | public static chronik.Chronik.ValidateUtxoResponse parseFrom(java.io...
method parseFrom (line 1009) | public static chronik.Chronik.ValidateUtxoResponse parseFrom(
method parseDelimitedFrom (line 1016) | public static chronik.Chronik.ValidateUtxoResponse parseDelimitedFro...
method parseDelimitedFrom (line 1020) | public static chronik.Chronik.ValidateUtxoResponse parseDelimitedFrom(
method parseFrom (line 1026) | public static chronik.Chronik.ValidateUtxoResponse parseFrom(
method parseFrom (line 1032) | public static chronik.Chronik.ValidateUtxoResponse parseFrom(
method newBuilder (line 1040) | public static Builder newBuilder() {
method newBuilder (line 1043) | public static Builder newBuilder(chronik.Chronik.ValidateUtxoRespons...
class Builder (line 1050) | public static final class Builder extends
method Builder (line 1056) | private Builder() {
method getUtxoStatesList (line 1064) | @java.lang.Override
method getUtxoStatesCount (line 1072) | @java.lang.Override
method getUtxoStates (line 1078) | @java.lang.Override
method setUtxoStates (line 1085) | public Builder setUtxoStates(
method setUtxoStates (line 1094) | public Builder setUtxoStates(
method addUtxoStates (line 1104) | public Builder addUtxoStates(chronik.Chronik.UtxoState value) {
method addUtxoStates (line 1112) | public Builder addUtxoStates(
method addUtxoStates (line 1121) | public Builder addUtxoStates(
method addUtxoStates (line 1130) | public Builder addUtxoStates(
method addAllUtxoStates (line 1140) | public Builder addAllUtxoStates(
method clearUtxoStates (line 1149) | public Builder clearUtxoStates() {
method removeUtxoStates (line 1157) | public Builder removeUtxoStates(int index) {
method dynamicMethod (line 1165) | @java.lang.Override
method getDefaultInstance (line 1227) | public static chronik.Chronik.ValidateUtxoResponse getDefaultInstanc...
method parser (line 1233) | public static com.google.protobuf.Parser<ValidateUtxoResponse> parse...
type BroadcastTxRequestOrBuilder (line 1238) | public interface BroadcastTxRequestOrBuilder extends
method getRawTx (line 1246) | com.google.protobuf.ByteString getRawTx();
method getSkipSlpCheck (line 1252) | boolean getSkipSlpCheck();
class BroadcastTxRequest (line 1257) | public static final class BroadcastTxRequest extends
method BroadcastTxRequest (line 1262) | private BroadcastTxRequest() {
method getRawTx (line 1271) | @java.lang.Override
method setRawTx (line 1279) | private void setRawTx(com.google.protobuf.ByteString value) {
method clearRawTx (line 1287) | private void clearRawTx() {
method getSkipSlpCheck (line 1298) | @java.lang.Override
method setSkipSlpCheck (line 1306) | private void setSkipSlpCheck(boolean value) {
method clearSkipSlpCheck (line 1313) | private void clearSkipSlpCheck() {
method parseFrom (line 1318) | public static chronik.Chronik.BroadcastTxRequest parseFrom(
method parseFrom (line 1324) | public static chronik.Chronik.BroadcastTxRequest parseFrom(
method parseFrom (line 1331) | public static chronik.Chronik.BroadcastTxRequest parseFrom(
method parseFrom (line 1337) | public static chronik.Chronik.BroadcastTxRequest parseFrom(
method parseFrom (line 1344) | public static chronik.Chronik.BroadcastTxRequest parseFrom(byte[] data)
method parseFrom (line 1349) | public static chronik.Chronik.BroadcastTxRequest parseFrom(
method parseFrom (line 1356) | public static chronik.Chronik.BroadcastTxRequest parseFrom(java.io.I...
method parseFrom (line 1361) | public static chronik.Chronik.BroadcastTxRequest parseFrom(
method parseDelimitedFrom (line 1368) | public static chronik.Chronik.BroadcastTxRequest parseDelimitedFrom(...
method parseDelimitedFrom (line 1372) | public static chronik.Chronik.BroadcastTxRequest parseDelimitedFrom(
method parseFrom (line 1378) | public static chronik.Chronik.BroadcastTxRequest parseFrom(
method parseFrom (line 1384) | public static chronik.Chronik.BroadcastTxRequest parseFrom(
method newBuilder (line 1392) | public static Builder newBuilder() {
method newBuilder (line 1395) | public static Builder newBuilder(chronik.Chronik.BroadcastTxRequest ...
class Builder (line 1402) | public static final class Builder extends
method Builder (line 1408) | private Builder() {
method getRawTx (line 1417) | @java.lang.Override
method setRawTx (line 1426) | public Builder setRawTx(com.google.protobuf.ByteString value) {
method clearRawTx (line 1435) | public Builder clearRawTx() {
method getSkipSlpCheck (line 1445) | @java.lang.Override
method setSkipSlpCheck (line 1454) | public Builder setSkipSlpCheck(boolean value) {
method clearSkipSlpCheck (line 1463) | public Builder clearSkipSlpCheck() {
method dynamicMethod (line 1471) | @java.lang.Override
method getDefaultInstance (line 1534) | public static chronik.Chronik.BroadcastTxRequest getDefaultInstance() {
method parser (line 1540) | public static com.google.protobuf.Parser<BroadcastTxRequest> parser() {
type BroadcastTxResponseOrBuilder (line 1545) | public interface BroadcastTxResponseOrBuilder extends
method getTxid (line 1553) | com.google.protobuf.ByteString getTxid();
class BroadcastTxResponse (line 1558) | public static final class BroadcastTxResponse extends
method BroadcastTxResponse (line 1563) | private BroadcastTxResponse() {
method getTxid (line 1572) | @java.lang.Override
method setTxid (line 1580) | private void setTxid(com.google.protobuf.ByteString value) {
method clearTxid (line 1588) | private void clearTxid() {
method parseFrom (line 1593) | public static chronik.Chronik.BroadcastTxResponse parseFrom(
method parseFrom (line 1599) | public static chronik.Chronik.BroadcastTxResponse parseFrom(
method parseFrom (line 1606) | public static chronik.Chronik.BroadcastTxResponse parseFrom(
method parseFrom (line 1612) | public static chronik.Chronik.BroadcastTxResponse parseFrom(
method parseFrom (line 1619) | public static chronik.Chronik.BroadcastTxResponse parseFrom(byte[] d...
method parseFrom (line 1624) | public static chronik.Chronik.BroadcastTxResponse parseFrom(
method parseFrom (line 1631) | public static chronik.Chronik.BroadcastTxResponse parseFrom(java.io....
method parseFrom (line 1636) | public static chronik.Chronik.BroadcastTxResponse parseFrom(
method parseDelimitedFrom (line 1643) | public static chronik.Chronik.BroadcastTxResponse parseDelimitedFrom...
method parseDelimitedFrom (line 1647) | public static chronik.Chronik.BroadcastTxResponse parseDelimitedFrom(
method parseFrom (line 1653) | public static chronik.Chronik.BroadcastTxResponse parseFrom(
method parseFrom (line 1659) | public static chronik.Chronik.BroadcastTxResponse parseFrom(
method newBuilder (line 1667) | public static Builder newBuilder() {
method newBuilder (line 1670) | public static Builder newBuilder(chronik.Chronik.BroadcastTxResponse...
class Builder (line 1677) | public static final class Builder extends
method Builder (line 1683) | private Builder() {
method getTxid (line 1692) | @java.lang.Override
method setTxid (line 1701) | public Builder setTxid(com.google.protobuf.ByteString value) {
method clearTxid (line 1710) | public Builder clearTxid() {
method dynamicMethod (line 1718) | @java.lang.Override
method getDefaultInstance (line 1779) | public static chronik.Chronik.BroadcastTxResponse getDefaultInstance...
method parser (line 1785) | public static com.google.protobuf.Parser<BroadcastTxResponse> parser...
type BroadcastTxsRequestOrBuilder (line 1790) | public interface BroadcastTxsRequestOrBuilder extends
method getRawTxsList (line 1798) | java.util.List<com.google.protobuf.ByteString> getRawTxsList();
method getRawTxsCount (line 1803) | int getRawTxsCount();
method getRawTxs (line 1809) | com.google.protobuf.ByteString getRawTxs(int index);
method getSkipSlpCheck (line 1815) | boolean getSkipSlpCheck();
class BroadcastTxsRequest (line 1820) | public static final class BroadcastTxsRequest extends
method BroadcastTxsRequest (line 1825) | private BroadcastTxsRequest() {
method getRawTxsList (line 1834) | @java.lang.Override
method getRawTxsCount (line 1843) | @java.lang.Override
method getRawTxs (line 1852) | @java.lang.Override
method ensureRawTxsIsMutable (line 1856) | private void ensureRawTxsIsMutable() {
method setRawTxs (line 1868) | private void setRawTxs(
method addRawTxs (line 1878) | private void addRawTxs(com.google.protobuf.ByteString value) {
method addAllRawTxs (line 1887) | private void addAllRawTxs(
method clearRawTxs (line 1896) | private void clearRawTxs() {
method getSkipSlpCheck (line 1906) | @java.lang.Override
method setSkipSlpCheck (line 1914) | private void setSkipSlpCheck(boolean value) {
method clearSkipSlpCheck (line 1921) | private void clearSkipSlpCheck() {
method parseFrom (line 1926) | public static chronik.Chronik.BroadcastTxsRequest parseFrom(
method parseFrom (line 1932) | public static chronik.Chronik.BroadcastTxsRequest parseFrom(
method parseFrom (line 1939) | public static chronik.Chronik.BroadcastTxsRequest parseFrom(
method parseFrom (line 1945) | public static chronik.Chronik.BroadcastTxsRequest parseFrom(
method parseFrom (line 1952) | public static chronik.Chronik.BroadcastTxsRequest parseFrom(byte[] d...
method parseFrom (line 1957) | public static chronik.Chronik.BroadcastTxsRequest parseFrom(
method parseFrom (line 1964) | public static chronik.Chronik.BroadcastTxsRequest parseFrom(java.io....
method parseFrom (line 1969) | public static chronik.Chronik.BroadcastTxsRequest parseFrom(
method parseDelimitedFrom (line 1976) | public static chronik.Chronik.BroadcastTxsRequest parseDelimitedFrom...
method parseDelimitedFrom (line 1980) | public static chronik.Chronik.BroadcastTxsRequest parseDelimitedFrom(
method parseFrom (line 1986) | public static chronik.Chronik.BroadcastTxsRequest parseFrom(
method parseFrom (line 1992) | public static chronik.Chronik.BroadcastTxsRequest parseFrom(
method newBuilder (line 2000) | public static Builder newBuilder() {
method newBuilder (line 2003) | public static Builder newBuilder(chronik.Chronik.BroadcastTxsRequest...
class Builder (line 2010) | public static final class Builder extends
method Builder (line 2016) | private Builder() {
method getRawTxsList (line 2025) | @java.lang.Override
method getRawTxsCount (line 2035) | @java.lang.Override
method getRawTxs (line 2044) | @java.lang.Override
method setRawTxs (line 2053) | public Builder setRawTxs(
method addRawTxs (line 2064) | public Builder addRawTxs(com.google.protobuf.ByteString value) {
method addAllRawTxs (line 2074) | public Builder addAllRawTxs(
method clearRawTxs (line 2084) | public Builder clearRawTxs() {
method getSkipSlpCheck (line 2094) | @java.lang.Override
method setSkipSlpCheck (line 2103) | public Builder setSkipSlpCheck(boolean value) {
method clearSkipSlpCheck (line 2112) | public Builder clearSkipSlpCheck() {
method dynamicMethod (line 2120) | @java.lang.Override
method getDefaultInstance (line 2183) | public static chronik.Chronik.BroadcastTxsRequest getDefaultInstance...
method parser (line 2189) | public static com.google.protobuf.Parser<BroadcastTxsRequest> parser...
type BroadcastTxsResponseOrBuilder (line 2194) | public interface BroadcastTxsResponseOrBuilder extends
method getTxidsList (line 2202) | java.util.List<com.google.protobuf.ByteString> getTxidsList();
method getTxidsCount (line 2207) | int getTxidsCount();
method getTxids (line 2213) | com.google.protobuf.ByteString getTxids(int index);
class BroadcastTxsResponse (line 2218) | public static final class BroadcastTxsResponse extends
method BroadcastTxsResponse (line 2223) | private BroadcastTxsResponse() {
method getTxidsList (line 2232) | @java.lang.Override
method getTxidsCount (line 2241) | @java.lang.Override
method getTxids (line 2250) | @java.lang.Override
method ensureTxidsIsMutable (line 2254) | private void ensureTxidsIsMutable() {
method setTxids (line 2266) | private void setTxids(
method addTxids (line 2276) | private void addTxids(com.google.protobuf.ByteString value) {
method addAllTxids (line 2285) | private void addAllTxids(
method clearTxids (line 2294) | private void clearTxids() {
method parseFrom (line 2298) | public static chronik.Chronik.BroadcastTxsResponse parseFrom(
method parseFrom (line 2304) | public static chronik.Chronik.BroadcastTxsResponse parseFrom(
method parseFrom (line 2311) | public static chronik.Chronik.BroadcastTxsResponse parseFrom(
method parseFrom (line 2317) | public static chronik.Chronik.BroadcastTxsResponse parseFrom(
method parseFrom (line 2324) | public static chronik.Chronik.BroadcastTxsResponse parseFrom(byte[] ...
method parseFrom (line 2329) | public static chronik.Chronik.BroadcastTxsResponse parseFrom(
method parseFrom (line 2336) | public static chronik.Chronik.BroadcastTxsResponse parseFrom(java.io...
method parseFrom (line 2341) | public static chronik.Chronik.BroadcastTxsResponse parseFrom(
method parseDelimitedFrom (line 2348) | public static chronik.Chronik.BroadcastTxsResponse parseDelimitedFro...
method parseDelimitedFrom (line 2352) | public static chronik.Chronik.BroadcastTxsResponse parseDelimitedFrom(
method parseFrom (line 2358) | public static chronik.Chronik.BroadcastTxsResponse parseFrom(
method parseFrom (line 2364) | public static chronik.Chronik.BroadcastTxsResponse parseFrom(
method newBuilder (line 2372) | public static Builder newBuilder() {
method newBuilder (line 2375) | public static Builder newBuilder(chronik.Chronik.BroadcastTxsRespons...
class Builder (line 2382) | public static final class Builder extends
method Builder (line 2388) | private Builder() {
method getTxidsList (line 2397) | @java.lang.Override
method getTxidsCount (line 2407) | @java.lang.Override
method getTxids (line 2416) | @java.lang.Override
method setTxids (line 2425) | public Builder setTxids(
method addTxids (line 2436) | public Builder addTxids(com.google.protobuf.ByteString value) {
method addAllTxids (line 2446) | public Builder addAllTxids(
method clearTxids (line 2456) | public Builder clearTxids() {
method dynamicMethod (line 2464) | @java.lang.Override
method getDefaultInstance (line 2525) | public static chronik.Chronik.BroadcastTxsResponse getDefaultInstanc...
method parser (line 2531) | public static com.google.protobuf.Parser<BroadcastTxsResponse> parse...
type BlockchainInfoOrBuilder (line 2536) | public interface BlockchainInfoOrBuilder extends
method getTipHash (line 2544) | com.google.protobuf.ByteString getTipHash();
method getTipHeight (line 2550) | int getTipHeight();
class BlockchainInfo (line 2555) | public static final class BlockchainInfo extends
method BlockchainInfo (line 2560) | private BlockchainInfo() {
method getTipHash (line 2569) | @java.lang.Override
method setTipHash (line 2577) | private void setTipHash(com.google.protobuf.ByteString value) {
method clearTipHash (line 2585) | private void clearTipHash() {
method getTipHeight (line 2596) | @java.lang.Override
method setTipHeight (line 2604) | private void setTipHeight(int value) {
method clearTipHeight (line 2611) | private void clearTipHeight() {
method parseFrom (line 2616) | public static chronik.Chronik.BlockchainInfo parseFrom(
method parseFrom (line 2622) | public static chronik.Chronik.BlockchainInfo parseFrom(
method parseFrom (line 2629) | public static chronik.Chronik.BlockchainInfo parseFrom(
method parseFrom (line 2635) | public static chronik.Chronik.BlockchainInfo parseFrom(
method parseFrom (line 2642) | public static chronik.Chronik.BlockchainInfo parseFrom(byte[] data)
method parseFrom (line 2647) | public static chronik.Chronik.BlockchainInfo parseFrom(
method parseFrom (line 2654) | public static chronik.Chronik.BlockchainInfo parseFrom(java.io.Input...
method parseFrom (line 2659) | public static chronik.Chronik.BlockchainInfo parseFrom(
method parseDelimitedFrom (line 2666) | public static chronik.Chronik.BlockchainInfo parseDelimitedFrom(java...
method parseDelimitedFrom (line 2670) | public static chronik.Chronik.BlockchainInfo parseDelimitedFrom(
method parseFrom (line 2676) | public static chronik.Chronik.BlockchainInfo parseFrom(
method parseFrom (line 2682) | public static chronik.Chronik.BlockchainInfo parseFrom(
method newBuilder (line 2690) | public static Builder newBuilder() {
method newBuilder (line 2693) | public static Builder newBuilder(chronik.Chronik.BlockchainInfo prot...
class Builder (line 2700) | public static final class Builder extends
method Builder (line 2706) | private Builder() {
method getTipHash (line 2715) | @java.lang.Override
method setTipHash (line 2724) | public Builder setTipHash(com.google.protobuf.ByteString value) {
method clearTipHash (line 2733) | public Builder clearTipHash() {
method getTipHeight (line 2743) | @java.lang.Override
method setTipHeight (line 2752) | public Builder setTipHeight(int value) {
method clearTipHeight (line 2761) | public Builder clearTipHeight() {
method dynamicMethod (line 2769) | @java.lang.Override
method getDefaultInstance (line 2832) | public static chronik.Chronik.BlockchainInfo getDefaultInstance() {
method parser (line 2838) | public static com.google.protobuf.Parser<BlockchainInfo> parser() {
type TxOrBuilder (line 2843) | public interface TxOrBuilder extends
method getTxid (line 2851) | com.google.protobuf.ByteString getTxid();
method getVersion (line 2857) | int getVersion();
method getInputsList (line 2862) | java.util.List<chronik.Chronik.TxInput>
method getInputs (line 2867) | chronik.Chronik.TxInput getInputs(int index);
method getInputsCount (line 2871) | int getInputsCount();
method getOutputsList (line 2876) | java.util.List<chronik.Chronik.TxOutput>
method getOutputs (line 2881) | chronik.Chronik.TxOutput getOutputs(int index);
method getOutputsCount (line 2885) | int getOutputsCount();
method getLockTime (line 2891) | int getLockTime();
method hasSlpTxData (line 2897) | boolean hasSlpTxData();
method getSlpTxData (line 2902) | chronik.Chronik.SlpTxData getSlpTxData();
method getSlpErrorMsg (line 2908) | java.lang.String getSlpErrorMsg();
method getSlpErrorMsgBytes (line 2913) | com.google.protobuf.ByteString
method hasBlock (line 2920) | boolean hasBlock();
method getBlock (line 2925) | chronik.Chronik.BlockMetadata getBlock();
method getTimeFirstSeen (line 2931) | long getTimeFirstSeen();
method getSize (line 2937) | int getSize();
method getIsCoinbase (line 2943) | boolean getIsCoinbase();
method getNetworkValue (line 2949) | int getNetworkValue();
method getNetwork (line 2954) | chronik.Chronik.Network getNetwork();
class Tx (line 2959) | public static final class Tx extends
method Tx (line 2964) | private Tx() {
method getTxid (line 2976) | @java.lang.Override
method setTxid (line 2984) | private void setTxid(com.google.protobuf.ByteString value) {
method clearTxid (line 2992) | private void clearTxid() {
method getVersion (line 3003) | @java.lang.Override
method setVersion (line 3011) | private void setVersion(int value) {
method clearVersion (line 3018) | private void clearVersion() {
method getInputsList (line 3028) | @java.lang.Override
method getInputsOrBuilderList (line 3035) | public java.util.List<? extends chronik.Chronik.TxInputOrBuilder>
method getInputsCount (line 3042) | @java.lang.Override
method getInputs (line 3049) | @java.lang.Override
method getInputsOrBuilder (line 3056) | public chronik.Chronik.TxInputOrBuilder getInputsOrBuilder(
method ensureInputsIsMutable (line 3060) | private void ensureInputsIsMutable() {
method setInputs (line 3071) | private void setInputs(
method addInputs (line 3080) | private void addInputs(chronik.Chronik.TxInput value) {
method addInputs (line 3088) | private void addInputs(
method addAllInputs (line 3097) | private void addAllInputs(
method clearInputs (line 3106) | private void clearInputs() {
method removeInputs (line 3112) | private void removeInputs(int index) {
method getOutputsList (line 3122) | @java.lang.Override
method getOutputsOrBuilderList (line 3129) | public java.util.List<? extends chronik.Chronik.TxOutputOrBuilder>
method getOutputsCount (line 3136) | @java.lang.Override
method getOutputs (line 3143) | @java.lang.Override
method getOutputsOrBuilder (line 3150) | public chronik.Chronik.TxOutputOrBuilder getOutputsOrBuilder(
method ensureOutputsIsMutable (line 3154) | private void ensureOutputsIsMutable() {
method setOutputs (line 3165) | private void setOutputs(
method addOutputs (line 3174) | private void addOutputs(chronik.Chronik.TxOutput value) {
method addOutputs (line 3182) | private void addOutputs(
method addAllOutputs (line 3191) | private void addAllOutputs(
method clearOutputs (line 3200) | private void clearOutputs() {
method removeOutputs (line 3206) | private void removeOutputs(int index) {
method getLockTime (line 3217) | @java.lang.Override
method setLockTime (line 3225) | private void setLockTime(int value) {
method clearLockTime (line 3232) | private void clearLockTime() {
method hasSlpTxData (line 3242) | @java.lang.Override
method getSlpTxData (line 3249) | @java.lang.Override
method setSlpTxData (line 3256) | private void setSlpTxData(chronik.Chronik.SlpTxData value) {
method mergeSlpTxData (line 3264) | @java.lang.SuppressWarnings({"ReferenceEquality"})
method clearSlpTxData (line 3279) | private void clearSlpTxData() { slpTxData_ = null;
method getSlpErrorMsg (line 3289) | @java.lang.Override
method getSlpErrorMsgBytes (line 3297) | @java.lang.Override
method setSlpErrorMsg (line 3306) | private void setSlpErrorMsg(
method clearSlpErrorMsg (line 3315) | private void clearSlpErrorMsg() {
method setSlpErrorMsgBytes (line 3323) | private void setSlpErrorMsgBytes(
method hasBlock (line 3335) | @java.lang.Override
method getBlock (line 3342) | @java.lang.Override
method setBlock (line 3349) | private void setBlock(chronik.Chronik.BlockMetadata value) {
method mergeBlock (line 3357) | @java.lang.SuppressWarnings({"ReferenceEquality"})
method clearBlock (line 3372) | private void clearBlock() { block_ = null;
method getTimeFirstSeen (line 3382) | @java.lang.Override
method setTimeFirstSeen (line 3390) | private void setTimeFirstSeen(long value) {
method clearTimeFirstSeen (line 3397) | private void clearTimeFirstSeen() {
method getSize (line 3408) | @java.lang.Override
method setSize (line 3416) | private void setSize(int value) {
method clearSize (line 3423) | private void clearSize() {
method getIsCoinbase (line 3434) | @java.lang.Override
method setIsCoinbase (line 3442) | private void setIsCoinbase(boolean value) {
method clearIsCoinbase (line 3449) | private void clearIsCoinbase() {
method getNetworkValue (line 3460) | @java.lang.Override
method getNetwork (line 3468) | @java.lang.Override
method setNetworkValue (line 3477) | private void setNetworkValue(int value) {
method setNetwork (line 3484) | private void setNetwork(chronik.Chronik.Network value) {
method clearNetwork (line 3491) | private void clearNetwork() {
method parseFrom (line 3496) | public static chronik.Chronik.Tx parseFrom(
method parseFrom (line 3502) | public static chronik.Chronik.Tx parseFrom(
method parseFrom (line 3509) | public static chronik.Chronik.Tx parseFrom(
method parseFrom (line 3515) | public static chronik.Chronik.Tx parseFrom(
method parseFrom (line 3522) | public static chronik.Chronik.Tx parseFrom(byte[] data)
method parseFrom (line 3527) | public static chronik.Chronik.Tx parseFrom(
method parseFrom (line 3534) | public static chronik.Chronik.Tx parseFrom(java.io.InputStream input)
method parseFrom (line 3539) | public static chronik.Chronik.Tx parseFrom(
method parseDelimitedFrom (line 3546) | public static chronik.Chronik.Tx parseDelimitedFrom(java.io.InputStr...
method parseDelimitedFrom (line 3550) | public static chronik.Chronik.Tx parseDelimitedFrom(
method parseFrom (line 3556) | public static chronik.Chronik.Tx parseFrom(
method parseFrom (line 3562) | public static chronik.Chronik.Tx parseFrom(
method newBuilder (line 3570) | public static Builder newBuilder() {
method newBuilder (line 3573) | public static Builder newBuilder(chronik.Chronik.Tx prototype) {
class Builder (line 3580) | public static final class Builder extends
method Builder (line 3586) | private Builder() {
method getTxid (line 3595) | @java.lang.Override
method setTxid (line 3604) | public Builder setTxid(com.google.protobuf.ByteString value) {
method clearTxid (line 3613) | public Builder clearTxid() {
method getVersion (line 3623) | @java.lang.Override
method setVersion (line 3632) | public Builder setVersion(int value) {
method clearVersion (line 3641) | public Builder clearVersion() {
method getInputsList (line 3650) | @java.lang.Override
method getInputsCount (line 3658) | @java.lang.Override
method getInputs (line 3664) | @java.lang.Override
method setInputs (line 3671) | public Builder setInputs(
method setInputs (line 3680) | public Builder setInputs(
method addInputs (line 3690) | public Builder addInputs(chronik.Chronik.TxInput value) {
method addInputs (line 3698) | public Builder addInputs(
method addInputs (line 3707) | public Builder addInputs(
method addInputs (line 3716) | public Builder addInputs(
method addAllInputs (line 3726) | public Builder addAllInputs(
method clearInputs (line 3735) | public Builder clearInputs() {
method removeInputs (line 3743) | public Builder removeInputs(int index) {
method getOutputsList (line 3752) | @java.lang.Override
method getOutputsCount (line 3760) | @java.lang.Override
method getOutputs (line 3766) | @java.lang.Override
method setOutputs (line 3773) | public Builder setOutputs(
method setOutputs (line 3782) | public Builder setOutputs(
method addOutputs (line 3792) | public Builder addOutputs(chronik.Chronik.TxOutput value) {
method addOutputs (line 3800) | public Builder addOutputs(
method addOutputs (line 3809) | public Builder addOutputs(
method addOutputs (line 3818) | public Builder addOutputs(
method addAllOutputs (line 3828) | public Builder addAllOutputs(
method clearOutputs (line 3837) | public Builder clearOutputs() {
method removeOutputs (line 3845) | public Builder removeOutputs(int index) {
method getLockTime (line 3855) | @java.lang.Override
method setLockTime (line 3864) | public Builder setLockTime(int value) {
method clearLockTime (line 3873) | public Builder clearLockTime() {
method hasSlpTxData (line 3882) | @java.lang.Override
method getSlpTxData (line 3889) | @java.lang.Override
method setSlpTxData (line 3896) | public Builder setSlpTxData(chronik.Chronik.SlpTxData value) {
method setSlpTxData (line 3904) | public Builder setSlpTxData(
method mergeSlpTxData (line 3913) | public Builder mergeSlpTxData(chronik.Chronik.SlpTxData value) {
method clearSlpTxData (line 3921) | public Builder clearSlpTxData() { copyOnWrite();
method getSlpErrorMsg (line 3930) | @java.lang.Override
method getSlpErrorMsgBytes (line 3938) | @java.lang.Override
method setSlpErrorMsg (line 3948) | public Builder setSlpErrorMsg(
method clearSlpErrorMsg (line 3958) | public Builder clearSlpErrorMsg() {
method setSlpErrorMsgBytes (line 3968) | public Builder setSlpErrorMsgBytes(
method hasBlock (line 3978) | @java.lang.Override
method getBlock (line 3985) | @java.lang.Override
method setBlock (line 3992) | public Builder setBlock(chronik.Chronik.BlockMetadata value) {
method setBlock (line 4000) | public Builder setBlock(
method mergeBlock (line 4009) | public Builder mergeBlock(chronik.Chronik.BlockMetadata value) {
method clearBlock (line 4017) | public Builder clearBlock() { copyOnWrite();
method getTimeFirstSeen (line 4026) | @java.lang.Override
method setTimeFirstSeen (line 4035) | public Builder setTimeFirstSeen(long value) {
method clearTimeFirstSeen (line 4044) | public Builder clearTimeFirstSeen() {
method getSize (line 4054) | @java.lang.Override
method setSize (line 4063) | public Builder setSize(int value) {
method clearSize (line 4072) | public Builder clearSize() {
method getIsCoinbase (line 4082) | @java.lang.Override
method setIsCoinbase (line 4091) | public Builder setIsCoinbase(boolean value) {
method clearIsCoinbase (line 4100) | public Builder clearIsCoinbase() {
method getNetworkValue (line 4110) | @java.lang.Override
method setNetworkValue (line 4119) | public Builder setNetworkValue(int value) {
method getNetwork (line 4128) | @java.lang.Override
method setNetwork (line 4137) | public Builder setNetwork(chronik.Chronik.Network value) {
method clearNetwork (line 4146) | public Builder clearNetwork() {
method dynamicMethod (line 4154) | @java.lang.Override
method getDefaultInstance (line 4230) | public static chronik.Chronik.Tx getDefaultInstance() {
method parser (line 4236) | public static com.google.protobuf.Parser<Tx> parser() {
type UtxoOrBuilder (line 4241) | public interface UtxoOrBuilder extends
method hasOutpoint (line 4249) | boolean hasOutpoint();
method getOutpoint (line 4254) | chronik.Chronik.OutPoint getOutpoint();
method getBlockHeight (line 4260) | int getBlockHeight();
method getIsCoinbase (line 4266) | boolean getIsCoinbase();
method getValue (line 4272) | long getValue();
method hasSlpMeta (line 4278) | boolean hasSlpMeta();
method getSlpMeta (line 4283) | chronik.Chronik.SlpMeta getSlpMeta();
method hasSlpToken (line 4289) | boolean hasSlpToken();
method getSlpToken (line 4294) | chronik.Chronik.SlpToken getSlpToken();
method getNetworkValue (line 4300) | int getNetworkValue();
method getNetwork (line 4305) | chronik.Chronik.Network getNetwork();
class Utxo (line 4310) | public static final class Utxo extends
method Utxo (line 4315) | private Utxo() {
method hasOutpoint (line 4322) | @java.lang.Override
method getOutpoint (line 4329) | @java.lang.Override
method setOutpoint (line 4336) | private void setOutpoint(chronik.Chronik.OutPoint value) {
method mergeOutpoint (line 4344) | @java.lang.SuppressWarnings({"ReferenceEquality"})
method clearOutpoint (line 4359) | private void clearOutpoint() { outpoint_ = null;
method getBlockHeight (line 4369) | @java.lang.Override
method setBlockHeight (line 4377) | private void setBlockHeight(int value) {
method clearBlockHeight (line 4384) | private void clearBlockHeight() {
method getIsCoinbase (line 4395) | @java.lang.Override
method setIsCoinbase (line 4403) | private void setIsCoinbase(boolean value) {
method clearIsCoinbase (line 4410) | private void clearIsCoinbase() {
method getValue (line 4421) | @java.lang.Override
method setValue (line 4429) | private void setValue(long value) {
method clearValue (line 4436) | private void clearValue() {
method hasSlpMeta (line 4446) | @java.lang.Override
method getSlpMeta (line 4453) | @java.lang.Override
method setSlpMeta (line 4460) | private void setSlpMeta(chronik.Chronik.SlpMeta value) {
method mergeSlpMeta (line 4468) | @java.lang.SuppressWarnings({"ReferenceEquality"})
method clearSlpMeta (line 4483) | private void clearSlpMeta() { slpMeta_ = null;
method hasSlpToken (line 4492) | @java.lang.Override
method getSlpToken (line 4499) | @java.lang.Override
method setSlpToken (line 4506) | private void setSlpToken(chronik.Chronik.SlpToken value) {
method mergeSlpToken (line 4514) | @java.lang.SuppressWarnings({"ReferenceEquality"})
method clearSlpToken (line 4529) | private void clearSlpToken() { slpToken_ = null;
method getNetworkValue (line 4539) | @java.lang.Override
method getNetwork (line 4547) | @java.lang.Override
method setNetworkValue (line 4556) | private void setNetworkValue(int value) {
method setNetwork (line 4563) | private void setNetwork(chronik.Chronik.Network value) {
method clearNetwork (line 4570) | private void clearNetwork() {
method parseFrom (line 4575) | public static chronik.Chronik.Utxo parseFrom(
method parseFrom (line 4581) | public static chronik.Chronik.Utxo parseFrom(
method parseFrom (line 4588) | public static chronik.Chronik.Utxo parseFrom(
method parseFrom (line 4594) | public static chronik.Chronik.Utxo parseFrom(
method parseFrom (line 4601) | public static chronik.Chronik.Utxo parseFrom(byte[] data)
method parseFrom (line 4606) | public static chronik.Chronik.Utxo parseFrom(
method parseFrom (line 4613) | public static chronik.Chronik.Utxo parseFrom(java.io.InputStream input)
method parseFrom (line 4618) | public static chronik.Chronik.Utxo parseFrom(
method parseDelimitedFrom (line 4625) | public static chronik.Chronik.Utxo parseDelimitedFrom(java.io.InputS...
method parseDelimitedFrom (line 4629) | public static chronik.Chronik.Utxo parseDelimitedFrom(
method parseFrom (line 4635) | public static chronik.Chronik.Utxo parseFrom(
method parseFrom (line 4641) | public static chronik.Chronik.Utxo parseFrom(
method newBuilder (line 4649) | public static Builder newBuilder() {
method newBuilder (line 4652) | public static Builder newBuilder(chronik.Chronik.Utxo prototype) {
class Builder (line 4659) | public static final class Builder extends
method Builder (line 4665) | private Builder() {
method hasOutpoint (line 4673) | @java.lang.Override
method getOutpoint (line 4680) | @java.lang.Override
method setOutpoint (line 4687) | public Builder setOutpoint(chronik.Chronik.OutPoint value) {
method setOutpoint (line 4695) | public Builder setOutpoint(
method mergeOutpoint (line 4704) | public Builder mergeOutpoint(chronik.Chronik.OutPoint value) {
method clearOutpoint (line 4712) | public Builder clearOutpoint() { copyOnWrite();
method getBlockHeight (line 4721) | @java.lang.Override
method setBlockHeight (line 4730) | public Builder setBlockHeight(int value) {
method clearBlockHeight (line 4739) | public Builder clearBlockHeight() {
method getIsCoinbase (line 4749) | @java.lang.Override
method setIsCoinbase (line 4758) | public Builder setIsCoinbase(boolean value) {
method clearIsCoinbase (line 4767) | public Builder clearIsCoinbase() {
method getValue (line 4777) | @java.lang.Override
method setValue (line 4786) | public Builder setValue(long value) {
method clearValue (line 4795) | public Builder clearValue() {
method hasSlpMeta (line 4804) | @java.lang.Override
method getSlpMeta (line 4811) | @java.lang.Override
method setSlpMeta (line 4818) | public Builder setSlpMeta(chronik.Chronik.SlpMeta value) {
method setSlpMeta (line 4826) | public Builder setSlpMeta(
method mergeSlpMeta (line 4835) | public Builder mergeSlpMeta(chronik.Chronik.SlpMeta value) {
method clearSlpMeta (line 4843) | public Builder clearSlpMeta() { copyOnWrite();
method hasSlpToken (line 4851) | @java.lang.Override
method getSlpToken (line 4858) | @java.lang.Override
method setSlpToken (line 4865) | public Builder setSlpToken(chronik.Chronik.SlpToken value) {
method setSlpToken (line 4873) | public Builder setSlpToken(
method mergeSlpToken (line 4882) | public Builder mergeSlpToken(chronik.Chronik.SlpToken value) {
method clearSlpToken (line 4890) | public Builder clearSlpToken() { copyOnWrite();
method getNetworkValue (line 4899) | @java.lang.Override
method setNetworkValue (line 4908) | public Builder setNetworkValue(int value) {
method getNetwork (line 4917) | @java.lang.Override
method setNetwork (line 4926) | public Builder setNetwork(chronik.Chronik.Network value) {
method clearNetwork (line 4935) | public Builder clearNetwork() {
method dynamicMethod (line 4943) | @java.lang.Override
method getDefaultInstance (line 5011) | public static chronik.Chronik.Utxo getDefaultInstance() {
method parser (line 5017) | public static com.google.protobuf.Parser<Utxo> parser() {
type TokenOrBuilder (line 5022) | public interface TokenOrBuilder extends
method hasSlpTxData (line 5030) | boolean hasSlpTxData();
method getSlpTxData (line 5035) | chronik.Chronik.SlpTxData getSlpTxData();
method hasTokenStats (line 5041) | boolean hasTokenStats();
method getTokenStats (line 5046) | chronik.Chronik.TokenStats getTokenStats();
method hasBlock (line 5052) | boolean hasBlock();
method getBlock (line 5057) | chronik.Chronik.BlockMetadata getBlock();
method getTimeFirstSeen (line 5063) | long getTimeFirstSeen();
method getInitialTokenQuantity (line 5069) | long getInitialTokenQuantity();
method getContainsBaton (line 5075) | boolean getContainsBaton();
method getNetworkValue (line 5081) | int getNetworkValue();
method getNetwork (line 5086) | chronik.Chronik.Network getNetwork();
class Token (line 5091) | public static final class Token extends
method Token (line 5096) | private Token() {
method hasSlpTxData (line 5103) | @java.lang.Override
method getSlpTxData (line 5110) | @java.lang.Override
method setSlpTxData (line 5117) | private void setSlpTxData(chronik.Chronik.SlpTxData value) {
method mergeSlpTxData (line 5125) | @java.lang.SuppressWarnings({"ReferenceEquality"})
method clearSlpTxData (line 5140) | private void clearSlpTxData() { slpTxData_ = null;
method hasTokenStats (line 5149) | @java.lang.Override
method getTokenStats (line 5156) | @java.lang.Override
method setTokenStats (line 5163) | private void setTokenStats(chronik.Chronik.TokenStats value) {
method mergeTokenStats (line 5171) | @java.lang.SuppressWarnings({"ReferenceEquality"})
method clearTokenStats (line 5186) | private void clearTokenStats() { tokenStats_ = null;
method hasBlock (line 5195) | @java.lang.Override
method getBlock (line 5202) | @java.lang.Override
method setBlock (line 5209) | private void setBlock(chronik.Chronik.BlockMetadata value) {
method mergeBlock (line 5217) | @java.lang.SuppressWarnings({"ReferenceEquality"})
method clearBlock (line 5232) | private void clearBlock() { block_ = null;
method getTimeFirstSeen (line 5242) | @java.lang.Override
method setTimeFirstSeen (line 5250) | private void setTimeFirstSeen(long value) {
method clearTimeFirstSeen (line 5257) | private void clearTimeFirstSeen() {
method getInitialTokenQuantity (line 5268) | @java.lang.Override
method setInitialTokenQuantity (line 5276) | private void setInitialTokenQuantity(long value) {
method clearInitialTokenQuantity (line 5283) | private void clearInitialTokenQuantity() {
method getContainsBaton (line 5294) | @java.lang.Override
method setContainsBaton (line 5302) | private void setContainsBaton(boolean value) {
method clearContainsBaton (line 5309) | private void clearContainsBaton() {
method getNetworkValue (line 5320) | @java.lang.Override
method getNetwork (line 5328) | @java.lang.Override
method setNetworkValue (line 5337) | private void setNetworkValue(int value) {
method setNetwork (line 5344) | private void setNetwork(chronik.Chronik.Network value) {
method clearNetwork (line 5351) | private void clearNetwork() {
method parseFrom (line 5356) | public static chronik.Chronik.Token parseFrom(
method parseFrom (line 5362) | public static chronik.Chronik.Token parseFrom(
method parseFrom (line 5369) | public static chronik.Chronik.Token parseFrom(
method parseFrom (line 5375) | public static chronik.Chronik.Token parseFrom(
method parseFrom (line 5382) | public static chronik.Chronik.Token parseFrom(byte[] data)
method parseFrom (line 5387) | public static chronik.Chronik.Token parseFrom(
method parseFrom (line 5394) | public static chronik.Chronik.Token parseFrom(java.io.InputStream in...
method parseFrom (line 5399) | public static chronik.Chronik.Token parseFrom(
method parseDelimitedFrom (line 5406) | public static chronik.Chronik.Token parseDelimitedFrom(java.io.Input...
method parseDelimitedFrom (line 5410) | public static chronik.Chronik.Token parseDelimitedFrom(
method parseFrom (line 5416) | public static chronik.Chronik.Token parseFrom(
method parseFrom (line 5422) | public static chronik.Chronik.Token parseFrom(
method newBuilder (line 5430) | public static Builder newBuilder() {
method newBuilder (line 5433) | public static Builder newBuilder(chronik.Chronik.Token prototype) {
class Builder (line 5440) | public static final class Builder extends
method Builder (line 5446) | private Builder() {
method hasSlpTxData (line 5454) | @java.lang.Override
method getSlpTxData (line 5461) | @java.lang.Override
method setSlpTxData (line 5468) | public Builder setSlpTxData(chronik.Chronik.SlpTxData value) {
method setSlpTxData (line 5476) | public Builder setSlpTxData(
method mergeSlpTxData (line 5485) | public Builder mergeSlpTxData(chronik.Chronik.SlpTxData value) {
method clearSlpTxData (line 5493) | public Builder clearSlpTxData() { copyOnWrite();
method hasTokenStats (line 5501) | @java.lang.Override
method getTokenStats (line 5508) | @java.lang.Override
method setTokenStats (line 5515) | public Builder setTokenStats(chronik.Chronik.TokenStats value) {
method setTokenStats (line 5523) | public Builder setTokenStats(
method mergeTokenStats (line 5532) | public Builder mergeTokenStats(chronik.Chronik.TokenStats value) {
method clearTokenStats (line 5540) | public Builder clearTokenStats() { copyOnWrite();
method hasBlock (line 5548) | @java.lang.Override
method getBlock (line 5555) | @java.lang.Override
method setBlock (line 5562) | public Builder setBlock(chronik.Chronik.BlockMetadata value) {
method setBlock (line 5570) | public Builder setBlock(
method mergeBlock (line 5579) | public Builder mergeBlock(chronik.Chronik.BlockMetadata value) {
method clearBlock (line 5587) | public Builder clearBlock() { copyOnWrite();
method getTimeFirstSeen (line 5596) | @java.lang.Override
method setTimeFirstSeen (line 5605) | public Builder setTimeFirstSeen(long value) {
method clearTimeFirstSeen (line 5614) | public Builder clearTimeFirstSeen() {
method getInitialTokenQuantity (line 5624) | @java.lang.Override
method setInitialTokenQuantity (line 5633) | public Builder setInitialTokenQuantity(long value) {
method clearInitialTokenQuantity (line 5642) | public Builder clearInitialTokenQuantity() {
method getContainsBaton (line 5652) | @java.lang.Override
method setContainsBaton (line 5661) | public Builder setContainsBaton(boolean value) {
method clearContainsBaton (line 5670) | public Builder clearContainsBaton() {
method getNetworkValue (line 5680) | @java.lang.Override
method setNetworkValue (line 5689) | public Builder setNetworkValue(int value) {
method getNetwork (line 5698) | @java.lang.Override
method setNetwork (line 5707) | public Builder setNetwork(chronik.Chronik.Network value) {
method clearNetwork (line 5716) | public Builder clearNetwork() {
method dynamicMethod (line 5724) | @java.lang.Override
method getDefaultInstance (line 5792) | public static chronik.Chronik.Token getDefaultInstance() {
method parser (line 5798) | public static com.google.protobuf.Parser<Token> parser() {
type BlockInfoOrBuilder (line 5803) | public interface BlockInfoOrBuilder extends
method getHash (line 5811) | com.google.protobuf.ByteString getHash();
method getPrevHash (line 5817) | com.google.protobuf.ByteString getPrevHash();
method getHeight (line 5823) | int getHeight();
method getNBits (line 5829) | int getNBits();
method getTimestamp (line 5835) | long getTimestamp();
method getBlockSize (line 5845) | long getBlockSize();
method getNumTxs (line 5855) | long getNumTxs();
method getNumInputs (line 5865) | long getNumInputs();
method getNumOutputs (line 5875) | long getNumOutputs();
method getSumInputSats (line 5885) | long getSumInputSats();
method getSumCoinbaseOutputSats (line 5895) | long getSumCoinbaseOutputSats();
method getSumNormalOutputSats (line 5905) | long getSumNormalOutputSats();
method getSumBurnedSats (line 5915) | long getSumBurnedSats();
class BlockInfo (line 5920) | public static final class BlockInfo extends
method BlockInfo (line 5925) | private BlockInfo() {
method getHash (line 5935) | @java.lang.Override
method setHash (line 5943) | private void setHash(com.google.protobuf.ByteString value) {
method clearHash (line 5951) | private void clearHash() {
method getPrevHash (line 5962) | @java.lang.Override
method setPrevHash (line 5970) | private void setPrevHash(com.google.protobuf.ByteString value) {
method clearPrevHash (line 5978) | private void clearPrevHash() {
method getHeight (line 5989) | @java.lang.Override
method setHeight (line 5997) | private void setHeight(int value) {
method clearHeight (line 6004) | private void clearHeight() {
method getNBits (line 6015) | @java.lang.Override
method setNBits (line 6023) | private void setNBits(int value) {
method clearNBits (line 6030) | private void clearNBits() {
method getTimestamp (line 6041) | @java.lang.Override
method setTimestamp (line 6049) | private void setTimestamp(long value) {
method clearTimestamp (line 6056) | private void clearTimestamp() {
method getBlockSize (line 6071) | @java.lang.Override
method setBlockSize (line 6083) | private void setBlockSize(long value) {
method clearBlockSize (line 6094) | private void clearBlockSize() {
method getNumTxs (line 6109) | @java.lang.Override
method setNumTxs (line 6121) | private void setNumTxs(long value) {
method clearNumTxs (line 6132) | private void clearNumTxs() {
method getNumInputs (line 6147) | @java.lang.Override
method setNumInputs (line 6159) | private void setNumInputs(long value) {
method clearNumInputs (line 6170) | private void clearNumInputs() {
method getNumOutputs (line 6185) | @java.lang.Override
method setNumOutputs (line 6197) | private void setNumOutputs(long value) {
method clearNumOutputs (line 6208) | private void clearNumOutputs() {
method getSumInputSats (line 6223) | @java.lang.Override
method setSumInputSats (line 6235) | private void setSumInputSats(long value) {
method clearSumInputSats (line 6246) | private void clearSumInputSats() {
method getSumCoinbaseOutputSats (line 6261) | @java.lang.Override
method setSumCoinbaseOutputSats (line 6273) | private void setSumCoinbaseOutputSats(long value) {
method clearSumCoinbaseOutputSats (line 6284) | private void clearSumCoinbaseOutputSats() {
method getSumNormalOutputSats (line 6299) | @java.lang.Override
method setSumNormalOutputSats (line 6311) | private void setSumNormalOutputSats(long value) {
method clearSumNormalOutputSats (line 6322) | private void clearSumNormalOutputSats() {
method getSumBurnedSats (line 6337) | @java.lang.Override
method setSumBurnedSats (line 6349) | private void setSumBurnedSats(long value) {
method clearSumBurnedSats (line 6360) | private void clearSumBurnedSats() {
method parseFrom (line 6365) | public static chronik.Chronik.BlockInfo parseFrom(
method parseFrom (line 6371) | public static chronik.Chronik.BlockInfo parseFrom(
method parseFrom (line 6378) | public static chronik.Chronik.BlockInfo parseFrom(
method parseFrom (line 6384) | public static chronik.Chronik.BlockInfo parseFrom(
method parseFrom (line 6391) | public static chronik.Chronik.BlockInfo parseFrom(byte[] data)
method parseFrom (line 6396) | public static chronik.Chronik.BlockInfo parseFrom(
method parseFrom (line 6403) | public static chronik.Chronik.BlockInfo parseFrom(java.io.InputStrea...
method parseFrom (line 6408) | public static chronik.Chronik.BlockInfo parseFrom(
method parseDelimitedFrom (line 6415) | public static chronik.Chronik.BlockInfo parseDelimitedFrom(java.io.I...
method parseDelimitedFrom (line 6419) | public static chronik.Chronik.BlockInfo parseDelimitedFrom(
method parseFrom (line 6425) | public static chronik.Chronik.BlockInfo parseFrom(
method parseFrom (line 6431) | public static chronik.Chronik.BlockInfo parseFrom(
method newBuilder (line 6439) | public static Builder newBuilder() {
method newBuilder (line 6442) | public static Builder newBuilder(chronik.Chronik.BlockInfo prototype) {
class Builder (line 6449) | public static final class Builder extends
method Builder (line 6455) | private Builder() {
method getHash (line 6464) | @java.lang.Override
method setHash (line 6473) | public Builder setHash(com.google.protobuf.ByteString value) {
method clearHash (line 6482) | public Builder clearHash() {
method getPrevHash (line 6492) | @java.lang.Override
method setPrevHash (line 6501) | public Builder setPrevHash(com.google.protobuf.ByteString value) {
method clearPrevHash (line 6510) | public Builder clearPrevHash() {
method getHeight (line 6520) | @java.lang.Override
method setHeight (line 6529) | public Builder setHeight(int value) {
method clearHeight (line 6538) | public Builder clearHeight() {
method getNBits (line 6548) | @java.lang.Override
method setNBits (line 6557) | public Builder setNBits(int value) {
method clearNBits (line 6566) | public Builder clearNBits() {
method getTimestamp (line 6576) | @java.lang.Override
method setTimestamp (line 6585) | public Builder setTimestamp(long value) {
method clearTimestamp (line 6594) | public Builder clearTimestamp() {
method getBlockSize (line 6608) | @java.lang.Override
method setBlockSize (line 6621) | public Builder setBlockSize(long value) {
method clearBlockSize (line 6634) | public Builder clearBlockSize() {
method getNumTxs (line 6648) | @java.lang.Override
method setNumTxs (line 6661) | public Builder setNumTxs(long value) {
method clearNumTxs (line 6674) | public Builder clearNumTxs() {
method getNumInputs (line 6688) | @java.lang.Override
method setNumInputs (line 6701) | public Builder setNumInputs(long value) {
method clearNumInputs (line 6714) | public Builder clearNumInputs() {
method getNumOutputs (line 6728) | @java.lang.Override
method setNumOutputs (line 6741) | public Builder setNumOutputs(long value) {
method clearNumOutputs (line 6754) | public Builder clearNumOutputs() {
method getSumInputSats (line 6768) | @java.lang.Override
method setSumInputSats (line 6781) | public Builder setSumInputSats(long value) {
method clearSumInputSats (line 6794) | public Builder clearSumInputSats() {
method getSumCoinbaseOutputSats (line 6808) | @java.lang.Override
method setSumCoinbaseOutputSats (line 6821) | public Builder setSumCoinbaseOutputSats(long value) {
method clearSumCoinbaseOutputSats (line 6834) | public Builder clearSumCoinbaseOutputSats() {
method getSumNormalOutputSats (line 6848) | @java.lang.Override
method setSumNormalOutputSats (line 6861) | public Builder setSumNormalOutputSats(long value) {
method clearSumNormalOutputSats (line 6874) | public Builder clearSumNormalOutputSats() {
method getSumBurnedSats (line 6888) | @java.lang.Override
method setSumBurnedSats (line 6901) | public Builder setSumBurnedSats(long value) {
method clearSumBurnedSats (line 6914) | public Builder clearSumBurnedSats() {
method dynamicMethod (line 6922) | @java.lang.Override
method getDefaultInstance (line 6997) | public static chronik.Chronik.BlockInfo getDefaultInstance() {
method parser (line 7003) | public static com.google.protobuf.Parser<BlockInfo> parser() {
type BlockDetailsOrBuilder (line 7008) | public interface BlockDetailsOrBuilder extends
method getVersion (line 7016) | int getVersion();
method getMerkleRoot (line 7022) | com.google.protobuf.ByteString getMerkleRoot();
method getNonce (line 7028) | long getNonce();
method getMedianTimestamp (line 7034) | long getMedianTimestamp();
class BlockDetails (line 7039) | public static final class BlockDetails extends
method BlockDetails (line 7044) | private BlockDetails() {
method getVersion (line 7053) | @java.lang.Override
method setVersion (line 7061) | private void setVersion(int value) {
method clearVersion (line 7068) | private void clearVersion() {
method getMerkleRoot (line 7079) | @java.lang.Override
method setMerkleRoot (line 7087) | private void setMerkleRoot(com.google.protobuf.ByteString value) {
method clearMerkleRoot (line 7095) | private void clearMerkleRoot() {
method getNonce (line 7106) | @java.lang.Override
method setNonce (line 7114) | private void setNonce(long value) {
method clearNonce (line 7121) | private void clearNonce() {
method getMedianTimestamp (line 7132) | @java.lang.Override
method setMedianTimestamp (line 7140) | private void setMedianTimestamp(long value) {
method clearMedianTimestamp (line 7147) | private void clearMedianTimestamp() {
method parseFrom (line 7152) | public static chronik.Chronik.BlockDetails parseFrom(
method parseFrom (line 7158) | public static chronik.Chronik.BlockDetails parseFrom(
method parseFrom (line 7165) | public static chronik.Chronik.BlockDetails parseFrom(
method parseFrom (line 7171) | public static chronik.Chronik.BlockDetails parseFrom(
method parseFrom (line 7178) | public static chronik.Chronik.BlockDetails parseFrom(byte[] data)
method parseFrom (line 7183) | public static chronik.Chronik.BlockDetails parseFrom(
method parseFrom (line 7190) | public static chronik.Chronik.BlockDetails parseFrom(java.io.InputSt...
method parseFrom (line 7195) | public static chronik.Chronik.BlockDetails parseFrom(
method parseDelimitedFrom (line 7202) | public static chronik.Chronik.BlockDetails parseDelimitedFrom(java.i...
method parseDelimitedFrom (line 7206) | public static chronik.Chronik.BlockDetails parseDelimitedFrom(
method parseFrom (line 7212) | public static chronik.Chronik.BlockDetails parseFrom(
method parseFrom (line 7218) | public static chronik.Chronik.BlockDetails parseFrom(
method newBuilder (line 7226) | public static Builder newBuilder() {
method newBuilder (line 7229) | public static Builder newBuilder(chronik.Chronik.BlockDetails protot...
class Builder (line 7236) | public static final class Builder extends
method Builder (line 7242) | private Builder() {
method getVersion (line 7251) | @java.lang.Override
method setVersion (line 7260) | public Builder setVersion(int value) {
method clearVersion (line 7269) | public Builder clearVersion() {
method getMerkleRoot (line 7279) | @java.lang.Override
method setMerkleRoot (line 7288) | public Builder setMerkleRoot(com.google.protobuf.ByteString value) {
method clearMerkleRoot (line 7297) | public Builder clearMerkleRoot() {
method getNonce (line 7307) | @java.lang.Override
method setNonce (line 7316) | public Builder setNonce(long value) {
method clearNonce (line 7325) | public Builder clearNonce() {
method getMedianTimestamp (line 7335) | @java.lang.Override
method setMedianTimestamp (line 7344) | public Builder setMedianTimestamp(long value) {
method clearMedianTimestamp (line 7353) | public Builder clearMedianTimestamp() {
method dynamicMethod (line 7361) | @java.lang.Override
method getDefaultInstance (line 7426) | public static chronik.Chronik.BlockDetails getDefaultInstance() {
method parser (line 7432) | public static com.google.protobuf.Parser<BlockDetails> parser() {
type BlockOrBuilder (line 7437) | public interface BlockOrBuilder extends
method hasBlockInfo (line 7445) | boolean hasBlockInfo();
method getBlockInfo (line 7450) | chronik.Chronik.BlockInfo getBlockInfo();
method hasBlockDetails (line 7456) | boolean hasBlockDetails();
method getBlockDetails (line 7461) | chronik.Chronik.BlockDetails getBlockDetails();
method getRawHeader (line 7467) | com.google.protobuf.ByteString getRawHeader();
method getTxsList (line 7472) | java.util.List<chronik.Chronik.Tx>
method getTxs (line 7477) | chronik.Chronik.Tx getTxs(int index);
method getTxsCount (line 7481) | int getTxsCount();
class Block (line 7486) | public static final class Block extends
method Block (line 7491) | private Block() {
method hasBlockInfo (line 7500) | @java.lang.Override
method getBlockInfo (line 7507) | @java.lang.Override
method setBlockInfo (line 7514) | private void setBlockInfo(chronik.Chronik.BlockInfo value) {
method mergeBlockInfo (line 7522) | @java.lang.SuppressWarnings({"ReferenceEquality"})
method clearBlockInfo (line 7537) | private void clearBlockInfo() { blockInfo_ = null;
method hasBlockDetails (line 7546) | @java.lang.Override
method getBlockDetails (line 7553) | @java.lang.Override
method setBlockDetails (line 7560) | private void setBlockDetails(chronik.Chronik.BlockDetails value) {
method mergeBlockDetails (line 7568) | @java.lang.SuppressWarnings({"ReferenceEquality"})
method clearBlockDetails (line 7583) | private void clearBlockDetails() { blockDetails_ = null;
method getRawHeader (line 7593) | @java.lang.Override
method setRawHeader (line 7601) | private void setRawHeader(com.google.protobuf.ByteString value) {
method clearRawHeader (line 7609) | private void clearRawHeader() {
method getTxsList (line 7619) | @java.lang.Override
method getTxsOrBuilderList (line 7626) | public java.util.List<? extends chronik.Chronik.TxOrBuilder>
method getTxsCount (line 7633) | @java.lang.Override
method getTxs (line 7640) | @java.lang.Override
method getTxsOrBuilder (line 7647) | public chronik.Chronik.TxOrBuilder getTxsOrBuilder(
method ensureTxsIsMutable (line 7651) | private void ensureTxsIsMutable() {
method setTxs (line 7662) | private void setTxs(
method addTxs (line 7671) | private void addTxs(chronik.Chronik.Tx value) {
method addTxs (line 7679) | private void addTxs(
method addAllTxs (line 7688) | private void addAllTxs(
method clearTxs (line 7697) | private void clearTxs() {
method removeTxs (line 7703) | private void removeTxs(int index) {
method parseFrom (line 7708) | public static chronik.Chronik.Block parseFrom(
method parseFrom (line 7714) | public static chronik.Chronik.Block parseFrom(
method parseFrom (line 7721) | public static chronik.Chronik.Block parseFrom(
method parseFrom (line 7727) | public static chronik.Chronik.Block parseFrom(
method parseFrom (line 7734) | public static chronik.Chronik.Block parseFrom(byte[] data)
method parseFrom (line 7739) | public static chronik.Chronik.Block parseFrom(
method parseFrom (line 7746) | public static chronik.Chronik.Block parseFrom(java.io.InputStream in...
method parseFrom (line 7751) | public static chronik.Chronik.Block parseFrom(
method parseDelimitedFrom (line 7758) | public static chronik.Chronik.Block parseDelimitedFrom(java.io.Input...
method parseDelimitedFrom (line 7762) | public static chronik.Chronik.Block parseDelimitedFrom(
method parseFrom (line 7768) | public static chronik.Chronik.Block parseFrom(
method parseFrom (line 7774) | public static chronik.Chronik.Block parseFrom(
method newBuilder (line 7782) | public static Builder newBuilder() {
method newBuilder (line 7785) | public static Builder newBuilder(chronik.Chronik.Block prototype) {
class Builder (line 7792) | public static final class Builder extends
method Builder (line 7798) | private Builder() {
method hasBlockInfo (line 7806) | @java.lang.Override
method getBlockInfo (line 7813) | @java.lang.Override
method setBlockInfo (line 7820) | public Builder setBlockInfo(chronik.Chronik.BlockInfo value) {
method setBlockInfo (line 7828) | public Builder setBlockInfo(
method mergeBlockInfo (line 7837) | public Builder mergeBlockInfo(chronik.Chronik.BlockInfo value) {
method clearBlockInfo (line 7845) | public Builder clearBlockInfo() { copyOnWrite();
method hasBlockDetails (line 7853) | @java.lang.Override
method getBlockDetails (line 7860) | @java.lang.Override
method setBlockDetails (line 7867) | public Builder setBlockDetails(chronik.Chronik.BlockDetails value) {
method setBlockDetails (line 7875) | public Builder setBlockDetails(
method mergeBlockDetails (line 7884) | public Builder mergeBlockDetails(chronik.Chronik.BlockDetails valu...
method clearBlockDetails (line 7892) | public Builder clearBlockDetails() { copyOnWrite();
method getRawHeader (line 7901) | @java.lang.Override
method setRawHeader (line 7910) | public Builder setRawHeader(com.google.protobuf.ByteString value) {
method clearRawHeader (line 7919) | public Builder clearRawHeader() {
method getTxsList (line 7928) | @java.lang.Override
method getTxsCount (line 7936) | @java.lang.Override
method getTxs (line 7942) | @java.lang.Override
method setTxs (line 7949) | public Builder setTxs(
method setTxs (line 7958) | public Builder setTxs(
method addTxs (line 7968) | public Builder addTxs(chronik.Chronik.Tx value) {
method addTxs (line 7976) | public Builder addTxs(
method addTxs (line 7985) | public Builder addTxs(
method addTxs (line 7994) | public Builder addTxs(
method addAllTxs (line 8004) | public Builder addAllTxs(
method clearTxs (line 8013) | public Builder clearTxs() {
method removeTxs (line 8021) | public Builder removeTxs(int index) {
method dynamicMethod (line 8029) | @java.lang.Override
method getDefaultInstance (line 8095) | public static chronik.Chronik.Block getDefaultInstance() {
method parser (line 8101) | public static com.google.protobuf.Parser<Block> parser() {
type ScriptUtxosOrBuilder (line 8106) | public interface ScriptUtxosOrBuilder extends
method getOutputScript (line 8114) | com.google.protobuf.ByteString getOutputScript();
method getUtxosList (line 8119) | java.util.List<chronik.Chronik.Utxo>
method getUtxos (line 8124) | chronik.Chronik.Utxo getUtxos(int index);
method getUtxosCount (line 8128) | int getUtxosCount();
class ScriptUtxos (line 8133) | public static final class ScriptUtxos extends
method ScriptUtxos (line 8138) | private ScriptUtxos() {
method getOutputScript (line 8148) | @java.lang.Override
method setOutputScript (line 8156) | private void setOutputScript(com.google.protobuf.ByteString value) {
method clearOutputScript (line 8164) | private void clearOutputScript() {
method getUtxosList (line 8174) | @java.lang.Override
method getUtxosOrBuilderList (line 8181) | public java.util.List<? extends chronik.Chronik.UtxoOrBuilder>
method getUtxosCount (line 8188) | @java.lang.Override
method getUtxos (line 8195) | @java.lang.Override
method getUtxosOrBuilder (line 8202) | public chronik.Chronik.UtxoOrBuilder getUtxosOrBuilder(
method ensureUtxosIsMutable (line 8206) | private void ensureUtxosIsMutable() {
method setUtxos (line 8217) | private void setUtxos(
method addUtxos (line 8226) | private void addUtxos(chronik.Chronik.Utxo value) {
method addUtxos (line 8234) | private void addUtxos(
method addAllUtxos (line 8243) | private void addAllUtxos(
method clearUtxos (line 8252) | private void clearUtxos() {
method removeUtxos (line 8258) | private void removeUtxos(int index) {
method parseFrom (line 8263) | public static chronik.Chronik.ScriptUtxos parseFrom(
method parseFrom (line 8269) | public static chronik.Chronik.ScriptUtxos parseFrom(
method parseFrom (line 8276) | public static chronik.Chronik.ScriptUtxos parseFrom(
method parseFrom (line 8282) | public static chronik.Chronik.ScriptUtxos parseFrom(
method parseFrom (line 8289) | public static chronik.Chronik.ScriptUtxos parseFrom(byte[] data)
method parseFrom (line 8294) | public static chronik.Chronik.ScriptUtxos parseFrom(
method parseFrom (line 8301) | public static chronik.Chronik.ScriptUtxos parseFrom(java.io.InputStr...
method parseFrom (line 8306) | public static chronik.Chronik.ScriptUtxos parseFrom(
method parseDelimitedFrom (line 8313) | public static chronik.Chronik.ScriptUtxos parseDelimitedFrom(java.io...
method parseDelimitedFrom (line 8317) | public static chronik.Chronik.ScriptUtxos parseDelimitedFrom(
method parseFrom (line 8323) | public static chronik.Chronik.ScriptUtxos parseFrom(
method parseFrom (line 8329) | public static chronik.Chronik.ScriptUtxos parseFrom(
method newBuilder (line 8337) | public static Builder newBuilder() {
method newBuilder (line 8340) | public static Builder newBuilder(chronik.Chronik.ScriptUtxos prototy...
class Builder (line 8347) | public static final class Builder extends
method Builder (line 8353) | private Builder() {
method getOutputScript (line 8362) | @java.lang.Override
method setOutputScript (line 8371) | public Builder setOutputScript(com.google.protobuf.ByteString valu...
method clearOutputScript (line 8380) | public Builder clearOutputScript() {
method getUtxosList (line 8389) | @java.lang.Override
method getUtxosCount (line 8397) | @java.lang.Override
method getUtxos (line 8403) | @java.lang.Override
method setUtxos (line 8410) | public Builder setUtxos(
method setUtxos (line 8419) | public Builder setUtxos(
method addUtxos (line 8429) | public Builder addUtxos(chronik.Chronik.Utxo value) {
method addUtxos (line 8437) | public Builder addUtxos(
method addUtxos (line 8446) | public Builder addUtxos(
method addUtxos (line 8455) | public Builder addUtxos(
method addAllUtxos (line 8465) | public Builder addAllUtxos(
method clearUtxos (line 8474) | public Builder clearUtxos() {
method removeUtxos (line 8482) | public Builder removeUtxos(int index) {
method dynamicMethod (line 8490) | @java.lang.Override
method getDefaultInstance (line 8554) | public static chronik.Chronik.ScriptUtxos getDefaultInstance() {
method parser (line 8560) | public static com.google.protobuf.Parser<ScriptUtxos> parser() {
type TxHistoryPageOrBuilder (line 8565) | public interface TxHistoryPageOrBuilder extends
method getTxsList (line 8572) | java.util.List<chronik.Chronik.Tx>
method getTxs (line 8577) | chronik.Chronik.Tx getTxs(int index);
method getTxsCount (line 8581) | int getTxsCount();
method getNumPages (line 8587) | int getNumPages();
class TxHistoryPage (line 8592) | public static final class TxHistoryPage extends
method TxHistoryPage (line 8597) | private TxHistoryPage() {
method getTxsList (line 8605) | @java.lang.Override
method getTxsOrBuilderList (line 8612) | public java.util.List<? extends chronik.Chronik.TxOrBuilder>
method getTxsCount (line 8619) | @java.lang.Override
method getTxs (line 8626) | @java.lang.Override
method getTxsOrBuilder (line 8633) | public chronik.Chronik.TxOrBuilder getTxsOrBuilder(
method ensureTxsIsMutable (line 8637) | private void ensureTxsIsMutable() {
method setTxs (line 8648) | private void setTxs(
method addTxs (line 8657) | private void addTxs(chronik.Chronik.Tx value) {
method addTxs (line 8665) | private void addTxs(
method addAllTxs (line 8674) | private void addAllTxs(
method clearTxs (line 8683) | private void clearTxs() {
method removeTxs (line 8689) | private void removeTxs(int index) {
method getNumPages (line 8700) | @java.lang.Override
method setNumPages (line 8708) | private void setNumPages(int value) {
method clearNumPages (line 8715) | private void clearNumPages() {
method parseFrom (line 8720) | public static chronik.Chronik.TxHistoryPage parseFrom(
method parseFrom (line 8726) | public static chronik.Chronik.TxHistoryPage parseFrom(
method parseFrom (line 8733) | public static chronik.Chronik.TxHistoryPage parseFrom(
method parseFrom (line 8739) | public static chronik.Chronik.TxHistoryPage parseFrom(
method parseFrom (line 8746) | public static chronik.Chronik.TxHistoryPage parseFrom(byte[] data)
method parseFrom (line 8751) | public static chronik.Chronik.TxHistoryPage parseFrom(
method parseFrom (line 8758) | public static chronik.Chronik.TxHistoryPage parseFrom(java.io.InputS...
method parseFrom (line 8763) | public static chronik.Chronik.TxHistoryPage parseFrom(
method parseDelimitedFrom (line 8770) | public static chronik.Chronik.TxHistoryPage parseDelimitedFrom(java....
method parseDelimitedFrom (line 8774) | public static chronik.Chronik.TxHistoryPage parseDelimitedFrom(
method parseFrom (line 8780) | public static chronik.Chronik.TxHistoryPage parseFrom(
method parseFrom (line 8786) | public static chronik.Chronik.TxHistoryPage parseFrom(
method newBuilder (line 8794) | public static Builder newBuilder() {
method newBuilder (line 8797) | public static Builder newBuilder(chronik.Chronik.TxHistoryPage proto...
class Builder (line 8804) | public static final class Builder extends
method Builder (line 8810) | private Builder() {
method getTxsList (line 8818) | @java.lang.Override
method getTxsCount (line 8826) | @java.lang.Override
method getTxs (line 8832) | @java.lang.Override
method setTxs (line 8839) | public Builder setTxs(
method setTxs (line 8848) | public Builder setTxs(
method addTxs (line 8858) | public Builder addTxs(chronik.Chronik.Tx value) {
method addTxs (line 8866) | public Builder addTxs(
method addTxs (line 8875) | public Builder addTxs(
method addTxs (line 8884) | public Builder addTxs(
method addAllTxs (line 8894) | public Builder addAllTxs(
method clearTxs (line 8903) | public Builder clearTxs() {
method removeTxs (line 8911) | public Builder removeTxs(int index) {
method getNumPages (line 8921) | @java.lang.Override
method setNumPages (line 8930) | public Builder setNumPages(int value) {
method clearNumPages (line 8939) | public Builder clearNumPages() {
method dynamicMethod (line 8947) | @java.lang.Override
method getDefaultInstance (line 9011) | public static chronik.Chronik.TxHistoryPage getDefaultInstance() {
method parser (line 9017) | public static com.google.protobuf.Parser<TxHistoryPage> parser() {
type UtxosOrBuilder (line 9022) | public interface UtxosOrBuilder extends
method getScriptUtxosList (line 9029) | java.util.List<chronik.Chronik.ScriptUtxos>
method getScriptUtxos (line 9034) | chronik.Chronik.ScriptUtxos getScriptUtxos(int index);
method getScriptUtxosCount (line 9038) | int getScriptUtxosCount();
class Utxos (line 9043) | public static final class Utxos extends
method Utxos (line 9048) | private Utxos() {
method getScriptUtxosList (line 9056) | @java.lang.Override
method getScriptUtxosOrBuilderList (line 9063) | public java.util.List<? extends chronik.Chronik.ScriptUtxosOrBuilder>
method getScriptUtxosCount (line 9070) | @java.lang.Override
method getScriptUtxos (line 9077) | @java.lang.Override
method getScriptUtxosOrBuilder (line 9084) | public chronik.Chronik.ScriptUtxosOrBuilder getScriptUtxosOrBuilder(
method ensureScriptUtxosIsMutable (line 9088) | private void ensureScriptUtxosIsMutable() {
method setScriptUtxos (line 9099) | private void setScriptUtxos(
method addScriptUtxos (line 9108) | private void addScriptUtxos(chronik.Chronik.ScriptUtxos value) {
method addScriptUtxos (line 9116) | private void addScriptUtxos(
method addAllScriptUtxos (line 9125) | private void addAllScriptUtxos(
method clearScriptUtxos (line 9134) | private void clearScriptUtxos() {
method removeScriptUtxos (line 9140) | private void removeScriptUtxos(int index) {
method parseFrom (line 9145) | public static chronik.Chronik.Utxos parseFrom(
method parseFrom (line 9151) | public static chronik.Chronik.Utxos parseFrom(
method parseFrom (line 9158) | public static chronik.Chronik.Utxos parseFrom(
method parseFrom (line 9164) | public static chronik.Chronik.Utxos parseFrom(
method parseFrom (line 9171) | public static chronik.Chronik.Utxos parseFrom(byte[] data)
method parseFrom (line 9176) | public static chronik.Chronik.Utxos parseFrom(
method parseFrom (line 9183) | public static chronik.Chronik.Utxos parseFrom(java.io.InputStream in...
method parseFrom (line 9188) | public static chronik.Chronik.Utxos parseFrom(
method parseDelimitedFrom (line 9195) | public static chronik.Chronik.Utxos parseDelimitedFrom(java.io.Input...
method parseDelimitedFrom (line 9199) | public static chronik.Chronik.Utxos parseDelimitedFrom(
method parseFrom (line 9205) | public static chronik.Chronik.Utxos parseFrom(
method parseFrom (line 9211) | public static chronik.Chronik.Utxos parseFrom(
method newBuilder (line 9219) | public static Builder newBuilder() {
method newBuilder (line 9222) | public static Builder newBuilder(chronik.Chronik.Utxos prototype) {
class Builder (line 9229) | public static final class Builder extends
method Builder (line 9235) | private Builder() {
method getScriptUtxosList (line 9243) | @java.lang.Override
method getScriptUtxosCount (line 9251) | @java.lang.Override
method getScriptUtxos (line 9257) | @java.lang.Override
method setScriptUtxos (line 9264) | public Builder setScriptUtxos(
method setScriptUtxos (line 9273) | public Builder setScriptUtxos(
method addScriptUtxos (line 9283) | public Builder addScriptUtxos(chronik.Chronik.ScriptUtxos value) {
method addScriptUtxos (line 9291) | public Builder addScriptUtxos(
method addScriptUtxos (line 9300) | public Builder addScriptUtxos(
method addScriptUtxos (line 9309) | public Builder addScriptUtxos(
method addAllScriptUtxos (line 9319) | public Builder addAllScriptUtxos(
method clearScriptUtxos (line 9328) | public Builder clearScriptUtxos() {
method removeScriptUtxos (line 9336) | public Builder removeScriptUtxos(int index) {
method dynamicMethod (line 9344) | @java.lang.Override
method getDefaultInstance (line 9406) | public static chronik.Chronik.Utxos getDefaultInstance() {
method parser (line 9412) | public static com.google.protobuf.Parser<Utxos> parser() {
type BlocksOrBuilder (line 9417) | public interface BlocksOrBuilder extends
method getBlocksList (line 9424) | java.util.List<chronik.Chronik.BlockInfo>
method getBlocks (line 9429) | chronik.Chronik.BlockInfo getBlocks(int index);
method getBlocksCount (line 9433) | int getBlocksCount();
class Blocks (line 9438) | public static final class Blocks extends
method Blocks (line 9443) | private Blocks() {
method getBlocksList (line 9451) | @java.lang.Override
method getBlocksOrBuilderList (line 9458) | public java.util.List<? extends chronik.Chronik.BlockInfoOrBuilder>
method getBlocksCount (line 9465) | @java.lang.Override
method getBlocks (line 9472) | @java.lang.Override
method getBlocksOrBuilder (line 9479) | public chronik.Chronik.BlockInfoOrBuilder getBlocksOrBuilder(
method ensureBlocksIsMutable (line 9483) | private void ensureBlocksIsMutable() {
method setBlocks (line 9494) | private void setBlocks(
method addBlocks (line 9503) | private void addBlocks(chronik.Chronik.BlockInfo value) {
method addBlocks (line 9511) | private void addBlocks(
method addAllBlocks (line 9520) | private void addAllBlocks(
method clearBlocks (line 9529) | private void clearBlocks() {
method removeBlocks (line 9535) | private void removeBlocks(int index) {
method parseFrom (line 9540) | public static chronik.Chronik.Blocks parseFrom(
method parseFrom (line 9546) | public static chronik.Chronik.Blocks parseFrom(
method parseFrom (line 9553) | public static chronik.Chronik.Blocks parseFrom(
method parseFrom (line 9559) | public static chronik.Chronik.Blocks parseFrom(
method parseFrom (line 9566) | public static chronik.Chronik.Blocks parseFrom(byte[] data)
method parseFrom (line 9571) | public static chronik.Chronik.Blocks parseFrom(
method parseFrom (line 9578) | public static chronik.Chronik.Blocks parseFrom(java.io.InputStream i...
method parseFrom (line 9583) | public static chronik.Chronik.Blocks parseFrom(
method parseDelimitedFrom (line 9590) | public static chronik.Chronik.Blocks parseDelimitedFrom(java.io.Inpu...
method parseDelimitedFrom (line 9594) | public static chronik.Chronik.Blocks parseDelimitedFrom(
method parseFrom (line 9600) | public static chronik.Chronik.Blocks parseFrom(
method parseFrom (line 9606) | public static chronik.Chronik.Blocks parseFrom(
method newBuilder (line 9614) | public static Builder newBuilder() {
method newBuilder (line 9617) | public static Builder newBuilder(chronik.Chronik.Blocks prototype) {
class Builder (line 9624) | public static final class Builder extends
method Builder (line 9630) | private Builder() {
method getBlocksList (line 9638) | @java.lang.Override
method getBlocksCount (line 9646) | @java.lang.Override
method getBlocks (line 9652) | @java.lang.Override
method setBlocks (line 9659) | public Builder setBlocks(
method setBlocks (line 9668) | public Builder setBlocks(
method addBlocks (line 9678) | public Builder addBlocks(chronik.Chronik.BlockInfo value) {
method addBlocks (line 9686) | public Builder addBlocks(
method addBlocks (line 9695) | public Builder addBlocks(
method addBlocks (line 9704) | public Builder addBlocks(
method addAllBlocks (line 9714) | public Builder addAllBlocks(
method clearBlocks (line 9723) | public Builder clearBlocks() {
method removeBlocks (line 9731) | public Builder removeBlocks(int index) {
method dynamicMethod (line 9739) | @java.lang.Override
method getDefaultInstance (line 9801) | public static chronik.Chronik.Blocks getDefaultInstance() {
method parser (line 9807) | public static com.google.protobuf.Parser<Blocks> parser() {
type SlpTxDataOrBuilder (line 9812) | public interface SlpTxDataOrBuilder extends
method hasSlpMeta (line 9820) | boolean hasSlpMeta();
method getSlpMeta (line 9825) | chronik.Chronik.SlpMeta getSlpMeta();
method hasGenesisInfo (line 9831) | boolean hasGenesisInfo();
method getGenesisInfo (line 9836) | chronik.Chronik.SlpGenesisInfo getGenesisInfo();
class SlpTxData (line 9841) | public static final class SlpTxData extends
method SlpTxData (line 9846) | private SlpTxData() {
method hasSlpMeta (line 9853) | @java.lang.Override
method getSlpMeta (line 9860) | @java.lang.Override
method setSlpMeta (line 9867) | private void setSlpMeta(chronik.Chronik.SlpMeta value) {
method mergeSlpMeta (line 9875) | @java.lang.SuppressWarnings({"ReferenceEquality"})
method clearSlpMeta (line 9890) | private void clearSlpMeta() { slpMeta_ = null;
method hasGenesisInfo (line 9899) | @java.lang.Override
method getGenesisInfo (line 9906) | @java.lang.Override
method setGenesisInfo (line 9913) | private void setGenesisInfo(chronik.Chronik.SlpGenesisInfo value) {
method mergeGenesisInfo (line 9921) | @java.lang.SuppressWarnings({"ReferenceEquality"})
method clearGenesisInfo (line 9936) | private void clearGenesisInfo() { genesisInfo_ = null;
method parseFrom (line 9940) | public static chronik.Chronik.SlpTxData parseFrom(
method parseFrom (line 9946) | public static chronik.Chronik.SlpTxData parseFrom(
method parseFrom (line 9953) | public static chronik.Chronik.SlpTxData parseFrom(
method parseFrom (line 9959) | public static chronik.Chronik.SlpTxData parseFrom(
method parseFrom (line 9966) | public static chronik.Chronik.SlpTxData parseFrom(byte[] data)
method parseFrom (line 9971) | public static chronik.Chronik.SlpTxData parseFrom(
method parseFrom (line 9978) | public static chronik.Chronik.SlpTxData parseFrom(java.io.InputStrea...
method parseFrom (line 9983) | public static chronik.Chronik.SlpTxData parseFrom(
method parseDelimitedFrom (line 9990) | public static chronik.Chronik.SlpTxData parseDelimitedFrom(java.io.I...
method parseDelimitedFrom (line 9994) | public static chronik.Chronik.SlpTxData parseDelimitedFrom(
method parseFrom (line 10000) | public static chronik.Chronik.SlpTxData parseFrom(
method parseFrom (line 10006) | public static chronik.Chronik.SlpTxData parseFrom(
method newBuilder (line 10014) | public static Builder newBuilder() {
method newBuilder (line 10017) | public static Builder newBuilder(chronik.Chronik.SlpTxData prototype) {
class Builder (line 10024) | public static final class Builder extends
method Builder (line 10030) | private Builder() {
method hasSlpMeta (line 10038) | @java.lang.Override
method getSlpMeta (line 10045) | @java.lang.Override
method setSlpMeta (line 10052) | public Builder setSlpMeta(chronik.Chronik.SlpMeta value) {
method setSlpMeta (line 10060) | public Builder setSlpMeta(
method mergeSlpMeta (line 10069) | public Builder mergeSlpMeta(chronik.Chronik.SlpMeta value) {
method clearSlpMeta (line 10077) | public Builder clearSlpMeta() { copyOnWrite();
method hasGenesisInfo (line 10085) | @java.lang.Override
method getGenesisInfo (line 10092) | @java.lang.Override
method setGenesisInfo (line 10099) | public Builder setGenesisInfo(chronik.Chronik.SlpGenesisInfo value) {
method setGenesisInfo (line 10107) | public Builder setGenesisInfo(
method mergeGenesisInfo (line 10116) | public Builder mergeGenesisInfo(chronik.Chronik.SlpGenesisInfo val...
method clearGenesisInfo (line 10124) | public Builder clearGenesisInfo() { copyOnWrite();
method dynamicMethod (line 10131) | @java.lang.Override
method getDefaultInstance (line 10193) | public static chronik.Chronik.SlpTxData getDefaultInstance() {
method parser (line 10199) | public static com.google.protobuf.Parser<SlpTxData> parser() {
type SlpMetaOrBuilder (line 10204) | public interface SlpMetaOrBuilder extends
method getTokenTypeValue (line 10212) | int getTokenTypeValue();
method getTokenType (line 10217) | chronik.Chronik.SlpTokenType getTokenType();
method getTxTypeValue (line 10223) | int getTxTypeValue();
method getTxType (line 10228) | chronik.Chronik.SlpTxType getTxType();
method getTokenId (line 10234) | com.google.protobuf.ByteString getTokenId();
method getGroupTokenId (line 10240) | com.google.protobuf.ByteString getGroupTokenId();
class SlpMeta (line 10245) | public static final class SlpMeta extends
method SlpMeta (line 10250) | private SlpMeta() {
method getTokenTypeValue (line 10260) | @java.lang.Override
method getTokenType (line 10268) | @java.lang.Override
method setTokenTypeValue (line 10277) | private void setTokenTypeValue(int value) {
method setTokenType (line 10284) | private void setTokenType(chronik.Chronik.SlpTokenType value) {
method clearTokenType (line 10291) | private void clearTokenType() {
method getTxTypeValue (line 10302) | @java.lang.Override
method getTxType (line 10310) | @java.lang.Override
method setTxTypeValue (line 10319) | private void setTxTypeValue(int value) {
method setTxType (line 10326) | private void setTxType(chronik.Chronik.SlpTxType value) {
method clearTxType (line 10333) | private void clearTxType() {
method getTokenId (line 10344) | @java.lang.Override
method setTokenId (line 10352) | private void setTokenId(com.google.protobuf.ByteString value) {
method clearTokenId (line 10360) | private void clearTokenId() {
method getGroupTokenId (line 10371) | @java.lang.Override
method setGroupTokenId (line 10379) | private void setGroupTokenId(com.google.protobuf.ByteString value) {
method clearGroupTokenId (line 10387) | private void clearGroupTokenId() {
method parseFrom (line 10392) | public static chronik.Chronik.SlpMeta parseFrom(
method parseFrom (line 10398) | public static chronik.Chronik.SlpMeta parseFrom(
method parseFrom (line 10405) | public static chronik.Chronik.SlpMeta parseFrom(
method parseFrom (line 10411) | public static chronik.Chronik.SlpMeta parseFrom(
method parseFrom (line 10418) | public static chronik.Chronik.SlpMeta parseFrom(byte[] data)
method parseFrom (line 10423) | public static chronik.Chronik.SlpMeta parseFrom(
method parseFrom (line 10430) | public static chronik.Chronik.SlpMeta parseFrom(java.io.InputStream ...
method parseFrom (line 10435) | public static chronik.Chronik.SlpMeta parseFrom(
method parseDelimitedFrom (line 10442) | public static chronik.Chronik.SlpMeta parseDelimitedFrom(java.io.Inp...
method parseDelimitedFrom (line 10446) | public static chronik.Chronik.SlpMeta parseDelimitedFrom(
method parseFrom (line 10452) | public static chronik.Chronik.SlpMeta parseFrom(
method parseFrom (line 10458) | public static chronik.Chronik.SlpMeta parseFrom(
method newBuilder (line 10466) | public static Builder newBuilder() {
method newBuilder (line 10469) | public static Builder newBuilder(chronik.Chronik.SlpMeta prototype) {
class Builder (line 10476) | public static final class Builder extends
method Builder (line 10482) | private Builder() {
method getTokenTypeValue (line 10491) | @java.lang.Override
method setTokenTypeValue (line 10500) | public Builder setTokenTypeValue(int value) {
method getTokenType (line 10509) | @java.lang.Override
method setTokenType (line 10518) | public Builder setTokenType(chronik.Chronik.SlpTokenType value) {
method clearTokenType (line 10527) | public Builder clearTokenType() {
method getTxTypeValue (line 10537) | @java.lang.Override
method setTxTypeValue (line 10546) | public Builder setTxTypeValue(int value) {
method getTxType (line 10555) | @java.lang.Override
method setTxType (line 10564) | public Builder setTxType(chronik.Chronik.SlpTxType value) {
method clearTxType (line 10573) | public Builder clearTxType() {
method getTokenId (line 10583) | @java.lang.Override
method setTokenId (line 10592) | public Builder setTokenId(com.google.protobuf.ByteString value) {
method clearTokenId (line 10601) | public Builder clearTokenId() {
method getGroupTokenId (line 10611) | @java.lang.Override
method setGroupTokenId (line 10620) | public Builder setGroupTokenId(com.google.protobuf.ByteString valu...
method clearGroupTokenId (line 10629) | public Builder clearGroupTokenId() {
method dynamicMethod (line 10637) | @java.lang.Override
method getDefaultInstance (line 10702) | public static chronik.Chronik.SlpMeta getDefaultInstance() {
method parser (line 10708) | public static com.google.protobuf.Parser<SlpMeta> parser() {
type TokenStatsOrBuilder (line 10713) | public interface TokenStatsOrBuilder extends
method getTotalMinted (line 10727) | java.lang.String getTotalMinted();
method getTotalMintedBytes (line 10738) | com.google.protobuf.ByteString
method getTotalBurned (line 10745) | java.lang.String getTotalBurned();
method getTotalBurnedBytes (line 10750) | com.google.protobuf.ByteString
class TokenStats (line 10756) | public static final class TokenStats extends
method TokenStats (line 10761) | private TokenStats() {
method getTotalMinted (line 10777) | @java.lang.Override
method getTotalMintedBytes (line 10791) | @java.lang.Override
method setTotalMinted (line 10806) | private void setTotalMinted(
method clearTotalMinted (line 10821) | private void clearTotalMinted() {
method setTotalMintedBytes (line 10835) | private void setTotalMintedBytes(
method getTotalBurned (line 10848) | @java.lang.Override
method getTotalBurnedBytes (line 10856) | @java.lang.Override
method setTotalBurned (line 10865) | private void setTotalBurned(
method clearTotalBurned (line 10874) | private void clearTotalBurned() {
method setTotalBurnedBytes (line 10882) | private void setTotalBurnedBytes(
method parseFrom (line 10889) | public static chronik.Chronik.TokenStats parseFrom(
method parseFrom (line 10895) | public static chronik.Chronik.TokenStats parseFrom(
method parseFrom (line 10902) | public static chronik.Chronik.TokenStats parseFrom(
method parseFrom (line 10908) | public static chronik.Chronik.TokenStats parseFrom(
method parseFrom (line 10915) | public static chronik.Chronik.TokenStats parseFrom(byte[] data)
method parseFrom (line 10920) | public static chronik.Chronik.TokenStats parseFrom(
method parseFrom (line 10927) | public static chronik.Chronik.TokenStats parseFrom(java.io.InputStre...
method parseFrom (line 10932) | public static chronik.Chronik.TokenStats parseFrom(
method parseDelimitedFrom (line 10939) | public static chronik.Chronik.TokenStats parseDelimitedFrom(java.io....
method parseDelimitedFrom (line 10943) | public static chronik.Chronik.TokenStats parseDelimitedFrom(
method parseFrom (line 10949) | public static chronik.Chronik.TokenStats parseFrom(
method parseFrom (line 10955) | public static chronik.Chronik.TokenStats parseFrom(
method newBuilder (line 10963) | public static Builder newBuilder() {
method newBuilder (line 10966) | public static Builder newBuilder(chronik.Chronik.TokenStats prototyp...
class Builder (line 10973) | public static final class Builder extends
method Builder (line 10979) | private Builder() {
method getTotalMinted (line 10994) | @java.lang.Override
method getTotalMintedBytes (line 11008) | @java.lang.Override
method setTotalMinted (line 11024) | public Builder setTotalMinted(
method clearTotalMinted (line 11040) | public Builder clearTotalMinted() {
method setTotalMintedBytes (line 11056) | public Builder setTotalMintedBytes(
method getTotalBurned (line 11067) | @java.lang.Override
method getTotalBurnedBytes (line 11075) | @java.lang.Override
method setTotalBurned (line 11085) | public Builder setTotalBurned(
method clearTotalBurned (line 11095) | public Builder clearTotalBurned() {
method setTotalBurnedBytes (line 11105) | public Builder setTotalBurnedBytes(
method dynamicMethod (line 11114) | @java.lang.Override
method getDefaultInstance (line 11177) | public static chronik.Chronik.TokenStats getDefaultInstance() {
method parser (line 11183) | public static com.google.protobuf.Parser<TokenStats> parser() {
type TxInputOrBuilder (line 11188) | public interface TxInputOrBuilder extends
method hasPrevOut (line 11196) | boolean hasPrevOut();
method getPrevOut (line 11201) | chronik.Chronik.OutPoint getPrevOut();
method getInputScript (line 11207) | com.google.protobuf.ByteString getInputScript();
method getOutputScript (line 11213) | com.google.protobuf.ByteString getOutputScript();
method getValue (line 11219) | long getValue();
method getSequenceNo (line 11225) | int getSequenceNo();
method hasSlpBurn (line 11231) | boolean hasSlpBurn();
method getSlpBurn (line 11236) | chronik.Chronik.SlpBurn getSlpBurn();
method hasSlpToken (line 11242) | boolean hasSlpToken();
method getSlpToken (line 11247) | chronik.Chronik.SlpToken getSlpToken();
class TxInput (line 11252) | public static final class TxInput extends
method TxInput (line 11257) | private TxInput() {
method hasPrevOut (line 11266) | @java.lang.Override
method getPrevOut (line 11273) | @java.lang.Override
method setPrevOut (line 11280) | private void setPrevOut(chronik.Chronik.OutPoint value) {
method mergePrevOut (line 11288) | @java.lang.SuppressWarnings({"ReferenceEquality"})
method clearPrevOut (line 11303) | private void clearPrevOut() { prevOut_ = null;
method getInputScript (line 11313) | @java.lang.Override
method setInputScript (line 11321) | private void setInputScript(com.google.protobuf.ByteString value) {
method clearInputScript (line 11329) | private void clearInputScript() {
method getOutputScript (line 11340) | @java.lang.Override
method setOutputScript (line 11348) | private void setOutputScript(com.google.protobuf.ByteString value) {
method clearOutputScript (line 11356) | private void clearOutputScript() {
method getValue (line 11367) | @java.lang.Override
method setValue (line 11375) | private void setValue(long value) {
method clearValue (line 11382) | private void clearValue() {
method getSequenceNo (line 11393) | @java.lang.Override
method setSequenceNo (line 11401) | private void setSequenceNo(int value) {
method clearSequenceNo (line 11408) | private void clearSequenceNo() {
method hasSlpBurn (line 11418) | @java.lang.Override
method getSlpBurn (line 11425) | @java.lang.Override
method setSlpBurn (line 11432) | private void setSlpBurn(chronik.Chronik.SlpBurn value) {
method mergeSlpBurn (line 11440) | @java.lang.SuppressWarnings({"ReferenceEquality"})
method clearSlpBurn (line 11455) | private void clearSlpBurn() { slpBurn_ = null;
method hasSlpToken (line 11464) | @java.lang.Override
method getSlpToken (line 11471) | @java.lang.Override
method setSlpToken (line 11478) | private void setSlpToken(chronik.Chronik.SlpToken value) {
method mergeSlpToken (line 11486) | @java.lang.SuppressWarnings({"ReferenceEquality"})
method clearSlpToken (line 11501) | private void clearSlpToken() { slpToken_ = null;
method parseFrom (line 11505) | public static chronik.Chronik.TxInput parseFrom(
method parseFrom (line 11511) | public static chronik.Chronik.TxInput parseFrom(
method parseFrom (line 11518) | public static chronik.Chronik.TxInput parseFrom(
method parseFrom (line 11524) | public static chronik.Chronik.TxInput parseFrom(
method parseFrom (line 11531) | public static chronik.Chronik.TxInput parseFrom(byte[] data)
method parseFrom (line 11536) | public static chronik.Chronik.TxInput parseFrom(
method parseFrom (line 11543) | public static chronik.Chronik.TxInput parseFrom(java.io.InputStream ...
method parseFrom (line 11548) | public static chronik.Chronik.TxInput parseFrom(
method parseDelimitedFrom (line 11555) | public static chronik.Chronik.TxInput parseDelimitedFrom(java.io.Inp...
method parseDelimitedFrom (line 11559) | public static chronik.Chronik.TxInput parseDelimitedFrom(
method parseFrom (line 11565) | public static chronik.Chronik.TxInput parseFrom(
method parseFrom (line 11571) | public static chronik.Chronik.TxInput parseFrom(
method newBuilder (line 11579) | public static Builder newBuilder() {
method newBuilder (line 11582) | public static Builder newBuilder(chronik.Chronik.TxInput prototype) {
class Builder (line 11589) | public static final class Builder extends
method Builder (line 11595) | private Builder() {
method hasPrevOut (line 11603) | @java.lang.Override
method getPrevOut (line 11610) | @java.lang.Override
method setPrevOut (line 11617) | public Builder setPrevOut(chronik.Chronik.OutPoint value) {
method setPrevOut (line 11625) | public Builder setPrevOut(
method mergePrevOut (line 11634) | public Builder mergePrevOut(chronik.Chronik.OutPoint value) {
method clearPrevOut (line 11642) | public Builder clearPrevOut() { copyOnWrite();
method getInputScript (line 11651) | @java.lang.Override
method setInputScript (line 11660) | public Builder setInputScript(com.google.protobuf.ByteString value) {
method clearInputScript (line 11669) | public Builder clearInputScript() {
method getOutputScript (line 11679) | @java.lang.Override
method setOutputScript (line 11688) | public Builder setOutputScript(com.google.protobuf.ByteString valu...
method clearOutputScript (line 11697) | public Builder clearOutputScript() {
method getValue (line 11707) | @java.lang.Override
method setValue (line 11716) | public Builder setValue(long value) {
method clearValue (line 11725) | public Builder clearValue() {
method getSequenceNo (line 11735) | @java.lang.Override
method setSequenceNo (line 11744) | public Builder setSequenceNo(int value) {
method clearSequenceNo (line 11753) | public Builder clearSequenceNo() {
method hasSlpBurn (line 11762) | @java.lang.Override
method getSlpBurn (line 11769) | @java.lang.Override
method setSlpBurn (line 11776) | public Builder setSlpBurn(chronik.Chronik.SlpBurn value) {
method setSlpBurn (line 11784) | public Builder setSlpBurn(
method mergeSlpBurn (line 11793) | public Builder mergeSlpBurn(chronik.Chronik.SlpBurn value) {
method clearSlpBurn (line 11801) | public Builder clearSlpBurn() { copyOnWrite();
method hasSlpToken (line 11809) | @java.lang.Override
method getSlpToken (line 11816) | @java.lang.Override
method setSlpToken (line 11823) | public Builder setSlpToken(chronik.Chronik.SlpToken value) {
method setSlpToken (line 11831) | public Builder setSlpToken(
method mergeSlpToken (line 11840) | public Builder mergeSlpToken(chronik.Chronik.SlpToken value) {
method clearSlpToken (line 11848) | public Builder clearSlpToken() { copyOnWrite();
method dynamicMethod (line 11855) | @java.lang.Override
method getDefaultInstance (line 11923) | public static chronik.Chronik.TxInput getDefaultInstance() {
method parser (line 11929) | public static com.google.protobuf.Parser<TxInput> parser() {
type TxOutputOrBuilder (line 11934) | public interface TxOutputOrBuilder extends
method getValue (line 11942) | long getValue();
method getOutputScript (line 11948) | com.google.protobuf.ByteString getOutputScript();
method hasSlpToken (line 11954) | boolean hasSlpToken();
method getSlpToken (line 11959) | chronik.Chronik.SlpToken getSlpToken();
method hasSpentBy (line 11965) | boolean hasSpentBy();
method getSpentBy (line 11970) | chronik.Chronik.OutPoint getSpentBy();
class TxOutput (line 11975) | public static final class TxOutput extends
method TxOutput (line 11980) | private TxOutput() {
method getValue (line 11989) | @java.lang.Override
method setValue (line 11997) | private void setValue(long value) {
method clearValue (line 12004) | private void clearValue() {
method getOutputScript (line 12015) | @java.lang.Override
method setOutputScript (line 12023) | private void setOutputScript(com.google.protobuf.ByteString value) {
method clearOutputScript (line 12031) | private void clearOutputScript() {
method hasSlpToken (line 12041) | @java.lang.Override
method getSlpToken (line 12048) | @java.lang.Override
method setSlpToken (line 12055) | private void setSlpToken(chronik.Chronik.SlpToken value) {
method mergeSlpToken (line 12063) | @java.lang.SuppressWarnings({"ReferenceEquality"})
method clearSlpToken (line 12078) | private void clearSlpToken() { slpToken_ = null;
method hasSpentBy (line 12087) | @java.lang.Override
method getSpentBy (line 12094) | @java.lang.Override
method setSpentBy (line 12101) | private void setSpentBy(chronik.Chronik.OutPoint value) {
method mergeSpentBy (line 12109) | @java.lang.SuppressWarnings({"ReferenceEquality"})
method clearSpentBy (line 12124) | private void clearSpentBy() { spentBy_ = null;
method parseFrom (line 12128) | public static chronik.Chronik.TxOutput parseFrom(
method parseFrom (line 12134) | public static chronik.Chronik.TxOutput parseFrom(
method parseFrom (line 12141) | public static chronik.Chronik.TxOutput parseFrom(
method parseFrom (line 12147) | public static chronik.Chronik.TxOutput parseFrom(
method parseFrom (line 12154) | public static chronik.Chronik.TxOutput parseFrom(byte[] data)
method parseFrom (line 12159) | public static chronik.Chronik.TxOutput parseFrom(
method parseFrom (line 12166) | public static chronik.Chronik.TxOutput parseFrom(java.io.InputStream...
method parseFrom (line 12171) | public static chronik.Chronik.TxOutput parseFrom(
method parseDelimitedFrom (line 12178) | public static chronik.Chronik.TxOutput parseDelimitedFrom(java.io.In...
method parseDelimitedFrom (line 12182) | public static chronik.Chronik.TxOutput parseDelimitedFrom(
method parseFrom (line 12188) | public static chronik.Chronik.TxOutput parseFrom(
method parseFrom (line 12194) | public static chronik.Chronik.TxOutput parseFrom(
method newBuilder (line 12202) | public static Builder newBuilder() {
method newBuilder (line 12205) | public static Builder newBuilder(chronik.Chronik.TxOutput prototype) {
class Builder (line 12212) | public static final class Builder extends
method Builder (line 12218) | private Builder() {
method getValue (line 12227) | @java.lang.Override
method setValue (line 12236) | public Builder setValue(long value) {
method clearValue (line 12245) | public Builder clearValue() {
method getOutputScript (line 12255) | @java.lang.Override
method setOutputScript (line 12264) | public Builder setOutputScript(com.google.protobuf.ByteString valu...
method clearOutputScript (line 12273) | public Builder clearOutputScript() {
method hasSlpToken (line 12282) | @java.lang.Override
method getSlpToken (line 12289) | @java.lang.Override
method setSlpToken (line 12296) | public Builder setSlpToken(chronik.Chronik.SlpToken value) {
method setSlpToken (line 12304) | public Builder setSlpToken(
method mergeSlpToken (line 12313) | public Builder mergeSlpToken(chronik.Chronik.SlpToken value) {
method clearSlpToken (line 12321) | public Builder clearSlpToken() { copyOnWrite();
method hasSpentBy (line 12329) | @java.lang.Override
method getSpentBy (line 12336) | @java.lang.Override
method setSpentBy (line 12343) | public Builder setSpentBy(chronik.Chronik.OutPoint value) {
method setSpentBy (line 12351) | public Builder setSpentBy(
method mergeSpentBy (line 12360) | public Builder mergeSpentBy(chronik.Chronik.OutPoint value) {
method clearSpentBy (line 12368) | public Builder clearSpentBy() { copyOnWrite();
method dynamicMethod (line 12375) | @java.lang.Override
method getDefaultInstance (line 12440) | public static chronik.Chronik.TxOutput getDefaultInstance() {
method parser (line 12446) | public static com.google.protobuf.Parser<TxOutput> parser() {
type BlockMetadataOrBuilder (line 12451) | public interface BlockMetadataOrBuilder extends
method getHeight (line 12459) | int getHeight();
method getHash (line 12465) | com.google.protobuf.ByteString getHash();
method getTimestamp (line 12471) | long getTimestamp();
class BlockMetadata (line 12476) | public static final class BlockMetadata extends
method BlockMetadata (line 12481) | private BlockMetadata() {
method getHeight (line 12490) | @java.lang.Override
method setHeight (line 12498) | private void setHeight(int value) {
method clearHeight (line 12505) | private void clearHeight() {
method getHash (line 12516) | @java.lang.Override
method setHash (line 12524) | private void setHash(com.google.protobuf.ByteString value) {
method clearHash (line 12532) | private void clearHash() {
method getTimestamp (line 12543) | @java.lang.Override
method setTimestamp (line 12551) | private void setTimestamp(long value) {
method clearTimestamp (line 12558) | private void clearTimestamp() {
method parseFrom (line 12563) | public static chronik.Chronik.BlockMetadata parseFrom(
method parseFrom (line 12569) | public static chronik.Chronik.BlockMetadata parseFrom(
method parseFrom (line 12576) | public static chronik.Chronik.BlockMetadata parseFrom(
method parseFrom (line 12582) | public static chronik.Chronik.BlockMetadata parseFrom(
method parseFrom (line 12589) | public static chronik.Chronik.BlockMetadata parseFrom(byte[] data)
method parseFrom (line 12594) | public static chronik.Chronik.BlockMetadata parseFrom(
method parseFrom (line 12601) | public static chronik.Chronik.BlockMetadata parseFrom(java.io.InputS...
method parseFrom (line 12606) | public static chronik.Chronik.BlockMetadata parseFrom(
method parseDelimitedFrom (line 12613) | public static chronik.Chronik.BlockMetadata parseDelimitedFrom(java....
method parseDelimitedFrom (line 12617) | public static chronik.Chronik.BlockMetadata parseDelimitedFrom(
method parseFrom (line 12623) | public static chronik.Chronik.BlockMetadata parseFrom(
method parseFrom (line 12629) | public static chronik.Chronik.BlockMetadata parseFrom(
method newBuilder (line 12637) | public static Builder newBuilder() {
method newBuilder (line 12640) | public static Builder newBuilder(chronik.Chronik.BlockMetadata proto...
class Builder (line 12647) | public static final class Builder extends
method Builder (line 12653) | private Builder() {
method getHeight (line 12662) | @java.lang.Override
method setHeight (line 12671) | public Builder setHeight(int value) {
method clearHeight (line 12680) | public Builder clearHeight() {
method getHash (line 12690) | @java.lang.Override
method setHash (line 12699) | public Builder setHash(com.google.protobuf.ByteString value) {
method clearHash (line 12708) | public Builder clearHash() {
method getTimestamp (line 12718) | @java.lang.Override
method setTimestamp (line 12727) | public Builder setTimestamp(long value) {
method clearTimestamp (line 12736) | public Builder clearTimestamp() {
method dynamicMethod (line 12744) | @java.lang.Override
method getDefaultInstance (line 12808) | public static chronik.Chronik.BlockMetadata getDefaultInstance() {
method parser (line 12814) | public static com.google.protobuf.Parser<BlockMetadata> parser() {
type OutPointOrBuilder (line 12819) | public interface OutPointOrBuilder extends
method getTxid (line 12827) | com.google.protobuf.ByteString getTxid();
method getOutIdx (line 12833) | int getOutIdx();
class OutPoint (line 12838) | public static final class OutPoint extends
method OutPoint (line 12843) | private OutPoint() {
method getTxid (line 12852) | @java.lang.Override
method setTxid (line 12860) | private void setTxid(com.google.protobuf.ByteString value) {
method clearTxid (line 12868) | private void clearTxid() {
method getOutIdx (line 12879) | @java.lang.Override
method setOutIdx (line 12887) | private void setOutIdx(int value) {
method clearOutIdx (line 12894) | private void clearOutIdx() {
method parseFrom (line 12899) | public static chronik.Chronik.OutPoint parseFrom(
method parseFrom (line 12905) | public static chronik.Chronik.OutPoint parseFrom(
method parseFrom (line 12912) | public static chronik.Chronik.OutPoint parseFrom(
method parseFrom (line 12918) | public static chronik.Chronik.OutPoint parseFrom(
method parseFrom (line 12925) | public static chronik.Chronik.OutPoint parseFrom(byte[] data)
method parseFrom (line 12930) | public static chronik.Chronik.OutPoint parseFrom(
method parseFrom (line 12937) | public static chronik.Chronik.OutPoint parseFrom(java.io.InputStream...
method parseFrom (line 12942) | public static chronik.Chronik.OutPoint parseFrom(
method parseDelimitedFrom (line 12949) | public static chronik.Chronik.OutPoint parseDelimitedFrom(java.io.In...
method parseDelimitedFrom (line 12953) | public static chronik.Chronik.OutPoint parseDelimitedFrom(
method parseFrom (line 12959) | public static chronik.Chronik.OutPoint parseFrom(
method parseFrom (line 12965) | public static chronik.Chronik.OutPoint parseFrom(
method newBuilder (line 12973) | public static Builder newBuilder() {
method newBuilder (line 12976) | public static Builder newBuilder(chronik.Chronik.OutPoint prototype) {
class Builder (line 12983) | public static final class Builder extends
method Builder (line 12989) | private Builder() {
method getTxid (line 12998) | @java.lang.Override
method setTxid (line 13007) | public Builder setTxid(com.google.protobuf.ByteString value) {
method clearTxid (line 13016) | public Builder clearTxid() {
method getOutIdx (line 13026) | @java.lang.Override
method setOutIdx (line 13035) | public Builder setOutIdx(int value) {
method clearOutIdx (line 13044) | public Builder clearOutIdx() {
method dynamicMethod (line 13052) | @java.lang.Override
method getDefaultInstance (line 13115) | public static chronik.Chronik.OutPoint getDefaultInstance() {
method parser (line 13121) | public static com.google.protobuf.Parser<OutPoint> parser() {
type SlpTokenOrBuilder (line 13126) | public interface SlpTokenOrBuilder extends
method getAmount (line 13134) | long getAmount();
method getIsMintBaton (line 13140) | boolean getIsMintBaton();
class SlpToken (line 13145) | public static final class SlpToken extends
method SlpToken (line 13150) | private SlpToken() {
method getAmount (line 13158) | @java.lang.Override
method setAmount (line 13166) | private void setAmount(long value) {
method clearAmount (line 13173) | private void clearAmount() {
method getIsMintBaton (line 13184) | @java.lang.Override
method setIsMintBaton (line 13192) | private void setIsMintBaton(boolean value) {
method clearIsMintBaton (line 13199) | private void clearIsMintBaton() {
method parseFrom (line 13204) | public static chronik.Chronik.SlpToken parseFrom(
method parseFrom (line 13210) | public static chronik.Chronik.SlpToken parseFrom(
method parseFrom (line 13217) | public static chronik.Chronik.SlpToken parseFrom(
method parseFrom (line 13223) | public static chronik.Chronik.SlpToken parseFrom(
method parseFrom (line 13230) | public static chronik.Chronik.SlpToken parseFrom(byte[] data)
method parseFrom (line 13235) | public static chronik.Chronik.SlpToken parseFrom(
method parseFrom (line 13242) | public static chronik.Chronik.SlpToken parseFrom(java.io.InputStream...
method parseFrom (line 13247) | public static chronik.Chronik.SlpToken parseFrom(
method parseDelimitedFrom (line 13254) | public static chronik.Chronik.SlpToken parseDelimitedFrom(java.io.In...
method parseDelimitedFrom (line 13258) | public static chronik.Chronik.SlpToken parseDelimitedFrom(
method parseFrom (line 13264) | public static chronik.Chronik.SlpToken parseFrom(
method parseFrom (line 13270) | public static chronik.Chronik.SlpToken parseFrom(
method newBuilder (line 13278) | public static Builder newBuilder() {
method newBuilder (line 13281) | public static Builder newBuilder(chronik.Chronik.SlpToken prototype) {
class Builder (line 13288) | public static final class Builder extends
method Builder (line 13294) | private Builder() {
method getAmount (line 13303) | @java.lang.Override
method setAmount (line 13312) | public Builder setAmount(long value) {
method clearAmount (line 13321) | public Builder clearAmount() {
method getIsMintBaton (line 13331) | @java.lang.Override
method setIsMintBaton (line 13340) | public Builder setIsMintBaton(boolean value) {
method clearIsMintBaton (line 13349) | public Builder clearIsMintBaton() {
method dynamicMethod (line 13357) | @java.lang.Override
method getDefaultInstance (line 13420) | public static chronik.Chronik.SlpToken getDefaultInstance() {
method parser (line 13426) | public static com.google.protobuf.Parser<SlpToken> parser() {
type SlpBurnOrBuilder (line 13431) | public interface SlpBurnOrBuilder extends
method hasToken (line 13439) | boolean hasToken();
method getToken (line 13444) | chronik.Chronik.SlpToken getToken();
method getTokenId (line 13450) | com.google.protobuf.ByteString getTokenId();
class SlpBurn (line 13455) | public static final class SlpBurn extends
method SlpBurn (line 13460) | private SlpBurn() {
method hasToken (line 13468) | @java.lang.Override
method getToken (line 13475) | @java.lang.Override
method setToken (line 13482) | private void setToken(chronik.Chronik.SlpToken value) {
method mergeToken (line 13490) | @java.lang.SuppressWarnings({"ReferenceEquality"})
method clearToken (line 13505) | private void clearToken() { token_ = null;
method getTokenId (line 13515) | @java.lang.Override
method setTokenId (line 13523) | private void setTokenId(com.google.protobuf.ByteString value) {
method clearTokenId (line 13531) | private void clearTokenId() {
method parseFrom (line 13536) | public static chronik.Chronik.SlpBurn parseFrom(
method parseFrom (line 13542) | public static chronik.Chronik.SlpBurn parseFrom(
method parseFrom (line 13549) | public static chronik.Chronik.SlpBurn parseFrom(
method parseFrom (line 13555) | public static chronik.Chronik.SlpBurn parseFrom(
method parseFrom (line 13562) | public static chronik.Chronik.SlpBurn parseFrom(byte[] data)
method parseFrom (line 13567) | public static chronik.Chronik.SlpBurn parseFrom(
method parseFrom (line 13574) | public static chronik.Chronik.SlpBurn parseFrom(java.io.InputStream ...
method parseFrom (line 13579) | public static chronik.Chronik.SlpBurn parseFrom(
method parseDelimitedFrom (line 13586) | public static chronik.Chronik.SlpBurn parseDelimitedFrom(java.io.Inp...
method parseDelimitedFrom (line 13590) | public static chronik.Chronik.SlpBurn parseDelimitedFrom(
method parseFrom (line 13596) | public static chronik.Chronik.SlpBurn parseFrom(
method parseFrom (line 13602) | public static chronik.Chronik.SlpBurn parseFrom(
method newBuilder (line 13610) | public static Builder newBuilder() {
method newBuilder (line 13613) | public static Builder newBuilder(chronik.Chronik.SlpBurn prototype) {
class Builder (line 13620) | public static final class Builder extends
method Builder (line 13626) | private Builder() {
method hasToken (line 13634) | @java.lang.Override
method getToken (line 13641) | @java.lang.Override
method setToken (line 13648) | public Builder setToken(chronik.Chronik.SlpToken value) {
method setToken (line 13656) | public Builder setToken(
method mergeToken (line 13665) | public Builder mergeToken(chronik.Chronik.SlpToken value) {
method clearToken (line 13673) | public Builder clearToken() { copyOnWrite();
method getTokenId (line 13682) | @java.lang.Override
method setTokenId (line 13691) | public Builder setTokenId(com.google.protobuf.ByteString value) {
method clearTokenId (line 13700) | public Builder clearTokenId() {
method dynamicMethod (line 13708) | @java.lang.Override
method getDefaultInstance (line 13770) | public static chronik.Chronik.SlpBurn getDefaultInstance() {
method parser (line 13776) | public static com.google.protobuf.Parser<SlpBurn> parser() {
type SlpGenesisInfoOrBuilder (line 13781) | public interface SlpGenesisInfoOrBuilder extends
method getTokenTicker (line 13789) | com.google.protobuf.ByteString getTokenTicker();
method getTokenName (line 13795) | com.google.protobuf.ByteString getTokenName();
method getTokenDocumentUrl (line 13801) | com.google.protobuf.ByteString getTokenDocumentUrl();
method getTokenDocumentHash (line 13807) | com.google.protobuf.ByteString getTokenDocumentHash();
method getDecimals (line 13813) | int getDecimals();
class SlpGenesisInfo (line 13818) | public static final class SlpGenesisInfo extends
method SlpGenesisInfo (line 13823) | private SlpGenesisInfo() {
method getTokenTicker (line 13835) | @java.lang.Override
method setTokenTicker (line 13843) | private void setTokenTicker(com.google.protobuf.ByteString value) {
method clearTokenTicker (line 13851) | private void clearTokenTicker() {
method getTokenName (line 13862) | @java.lang.Override
method setTokenName (line 13870) | private void setTokenName(com.google.protobuf.ByteString value) {
method clearTokenName (line 13878) | private void clearTokenName() {
method getTokenDocumentUrl (line 13889) | @java.lang.Override
method setTokenDocumentUrl (line 13897) | private void setTokenDocumentUrl(com.google.protobuf.ByteString valu...
method clearTokenDocumentUrl (line 13905) | private void clearTokenDocumentUrl() {
method getTokenDocumentHash (line 13916) | @java.lang.Override
method setTokenDocumentHash (line 13924) | private void setTokenDocumentHash(com.google.protobuf.ByteString val...
method clearTokenDocumentHash (line 13932) | private void clearTokenDocumentHash() {
method getDecimals (line 13943) | @java.lang.Override
method setDecimals (line 13951) | private void setDecimals(int value) {
method clearDecimals (line 13958) | private void clearDecimals() {
method parseFrom (line 13963) | public static chronik.Chronik.SlpGenesisInfo parseFrom(
method parseFrom (line 13969) | public static chronik.Chronik.SlpGenesisInfo parseFrom(
method parseFrom (line 13976) | public static chronik.Chronik.SlpGenesisInfo parseFrom(
method parseFrom (line 13982) | public static chronik.Chronik.SlpGenesisInfo parseFrom(
method parseFrom (line 13989) | public static chronik.Chronik.SlpGenesisInfo parseFrom(byte[] data)
method parseFrom (line 13994) | public static chronik.Chronik.SlpGenesisInfo parseFrom(
method parseFrom (line 14001) | public static chronik.Chronik.SlpGenesisInfo parseFrom(java.io.Input...
method parseFrom (line 14006) | public static chronik.Chronik.SlpGenesisInfo parseFrom(
method parseDelimitedFrom (line 14013) | public static chronik.Chronik.SlpGenesisInfo parseDelimitedFrom(java...
method parseDelimitedFrom (line 14017) | public static chronik.Chronik.SlpGenesisInfo parseDelimitedFrom(
method parseFrom (line 14023) | public static chronik.Chronik.SlpGenesisInfo parseFrom(
method parseFrom (line 14029) | public static chronik.Chronik.SlpGenesisInfo parseFrom(
method newBuilder (line 14037) | public static Builder newBuilder() {
method newBuilder (line 14040) | public static Builder newBuilder(chronik.Chronik.SlpGenesisInfo prot...
class Builder (line 14047) | public static final class Builder extends
method Builder (line 14053) | private Builder() {
method getTokenTicker (line 14062) | @java.lang.Override
method setTokenTicker (line 14071) | public Builder setTokenTicker(com.google.protobuf.ByteString value) {
method clearTokenTicker (line 14080) | public Builder clearTokenTicker() {
method getTokenName (line 14090) | @java.lang.Override
method setTokenName (line 14099) | public Builder setTokenName(com.google.protobuf.ByteString value) {
method clearTokenName (line 14108) | public Builder clearTokenName() {
method getTokenDocumentUrl (line 14118) | @java.lang.Override
method setTokenDocumentUrl (line 14127) | public Builder setTokenDocumentUrl(com.google.protobuf.ByteString ...
method clearTokenDocumentUrl (line 14136) | public Builder clearTokenDocumentUrl() {
method getTokenDocumentHash (line 14146) | @java.lang.Override
method setTokenDocumentHash (line 14155) | public Builder setTokenDocumentHash(com.google.protobuf.ByteString...
method clearTokenDocumentHash (line 14164) | public Builder clearTokenDocumentHash() {
method getDecimals (line 14174) | @java.lang.Override
method setDecimals (line 14183) | public Builder setDecimals(int value) {
method clearDecimals (line 14192) | public Builder clearDecimals() {
method dynamicMethod (line 14200) | @java.lang.Override
method getDefaultInstance (line 14266) | public static chronik.Chronik.SlpGenesisInfo getDefaultInstance() {
method parser (line 14272) | public static com.google.protobuf.Parser<SlpGenesisInfo> parser() {
type UtxoStateOrBuilder (line 14277) | public interface UtxoStateOrBuilder extends
method getHeight (line 14285) | int getHeight();
method getIsConfirmed (line 14291) | boolean getIsConfirmed();
method getStateValue (line 14297) | int getStateValue();
method getState (line 14302) | chronik.Chronik.UtxoStateVariant getState();
class UtxoState (line 14307) | public static final class UtxoState extends
method UtxoState (line 14312) | private UtxoState() {
method getHeight (line 14320) | @java.lang.Override
method setHeight (line 14328) | private void setHeight(int value) {
method clearHeight (line 14335) | private void clearHeight() {
method getIsConfirmed (line 14346) | @java.lang.Override
method setIsConfirmed (line 14354) | private void setIsConfirmed(boolean value) {
method clearIsConfirmed (line 14361) | private void clearIsConfirmed() {
method getStateValue (line 14372) | @java.lang.Override
method getState (line 14380) | @java.lang.Override
method setStateValue (line 14389) | private void setStateValue(int value) {
method setState (line 14396) | private void setState(chronik.Chronik.UtxoStateVariant value) {
method clearState (line 14403) | private void clearState() {
method parseFrom (line 14408) | public static chronik.Chronik.UtxoState parseFrom(
method parseFrom (line 14414) | public static chronik.Chronik.UtxoState parseFrom(
method parseFrom (line 14421) | public static chronik.Chronik.UtxoState parseFrom(
method parseFrom (line 14427) | public static chronik.Chronik.UtxoState parseFrom(
method parseFrom (line 14434) | public static chronik.Chronik.UtxoState parseFrom(byte[] data)
method parseFrom (line 14439) | public static chronik.Chronik.UtxoState parseFrom(
method parseFrom (line 14446) | public static chronik.Chronik.UtxoState parseFrom(java.io.InputStrea...
method parseFrom (line 14451) | public static chronik.Chronik.UtxoState parseFrom(
method parseDelimitedFrom (line 14458) | public static chronik.Chronik.UtxoState parseDelimitedFrom(java.io.I...
method parseDelimitedFrom (line 14462) | public static chronik.Chronik.UtxoState parseDelimitedFrom(
method parseFrom (line 14468) | public static chronik.Chronik.UtxoState parseFrom(
method parseFrom (line 14474) | public static chronik.Chronik.UtxoState parseFrom(
method newBuilder (line 14482) | public static Builder newBuilder() {
method newBuilder (line 14485) | public static Builder newBuilder(chronik.Chronik.UtxoState prototype) {
class Builder (line 14492) | public static final class Builder extends
method Builder (line 14498) | private Builder() {
method getHeight (line 14507) | @java.lang.Override
method setHeight (line 14516) | public Builder setHeight(int value) {
method clearHeight (line 14525) | public Builder clearHeight() {
method getIsConfirmed (line 14535) | @java.lang.Override
method setIsConfirmed (line 14544) | public Builder setIsConfirmed(boolean value) {
method clearIsConfirmed (line 14553) | public Builder clearIsConfirmed() {
method getStateValue (line 14563) | @java.lang.Override
method setStateValue (line 14572) | public Builder setStateValue(int value) {
method getState (line 14581) | @java.lang.Override
method setState (line 14590) | public Builder setState(chronik.Chronik.UtxoStateVariant value) {
method clearState (line 14599) | public Builder clearState() {
method dynamicMethod (line 14607) | @java.lang.Override
method getDefaultInstance (line 14671) | public static chronik.Chronik.UtxoState getDefaultInstance() {
method parser (line 14677) | public static com.google.protobuf.Parser<UtxoState> parser() {
type SubscriptionOrBuilder (line 14682) | public interface SubscriptionOrBuilder extends
method getScriptType (line 14690) | java.lang.String getScriptType();
method getScriptTypeBytes (line 14695) | com.google.protobuf.ByteString
method getPayload (line 14702) | com.google.protobuf.ByteString getPayload();
method getIsSubscribe (line 14708) | boolean getIsSubscribe();
class Subscription (line 14713) | public static final class Subscription extends
method Subscription (line 14718) | private Subscription() {
method getScriptType (line 14728) | @java.lang.Override
method getScriptTypeBytes (line 14736) | @java.lang.Override
method setScriptType (line 14745) | private void setScriptType(
method clearScriptType (line 14754) | private void clearScriptType() {
method setScriptTypeBytes (line 14762) | private void setScriptTypeBytes(
method getPayload (line 14775) | @java.lang.Override
method setPayload (line 14783) | private void setPayload(com.google.protobuf.ByteString value) {
method clearPayload (line 14791) | private void clearPayload() {
method getIsSubscribe (line 14802) | @java.lang.Override
method setIsSubscribe (line 14810) | private void setIsSubscribe(boolean value) {
method clearIsSubscribe (line 14817) | private void clearIsSubscribe() {
method parseFrom (line 14822) | public static chronik.Chronik.Subscription parseFrom(
method parseFrom (line 14828) | public static chronik.Chronik.Subscription parseFrom(
method parseFrom (line 14835) | public static chronik.Chronik.Subscription parseFrom(
method parseFrom (line 14841) | public static chronik.Chronik.Subscription parseFrom(
method parseFrom (line 14848) | public static chronik.Chronik.Subscription parseFrom(byte[] data)
method parseFrom (line 14853) | public static chronik.Chronik.Subscription parseFrom(
method parseFrom (line 14860) | public static chronik.Chronik.Subscription parseFrom(java.io.InputSt...
method parseFrom (line 14865) | public static chronik.Chronik.Subscription parseFrom(
method parseDelimitedFrom (line 14872) | public static chronik.Chronik.Subscription parseDelimitedFrom(java.i...
method parseDelimitedFrom (line 14876) | public static chronik.Chronik.Subscription parseDelimitedFrom(
method parseFrom (line 14882) | public static chronik.Chronik.Subscription parseFrom(
method parseFrom (line 14888) | public static chronik.Chronik.Subscription parseFrom(
method newBuilder (line 14896) | public static Builder newBuilder() {
method newBuilder (line 14899) | public static Builder newBuilder(chronik.Chronik.Subscription protot...
class Builder (line 14906) | public static final class Builder extends
method Builder (line 14912) | private Builder() {
method getScriptType (line 14921) | @java.lang.Override
method getScriptTypeBytes (line 14929) | @java.lang.Override
method setScriptType (line 14939) | public Builder setScriptType(
method clearScriptType (line 14949) | public Builder clearScriptType() {
method setScriptTypeBytes (line 14959) | public Builder setScriptTypeBytes(
method getPayload (line 14970) | @java.lang.Override
method setPayload (line 14979) | public Builder setPayload(com.google.protobuf.ByteString value) {
method clearPayload (line 14988) | public Builder clearPayload() {
method getIsSubscribe (line 14998) | @java.lang.Override
method setIsSubscribe (line 15007) | public Builder setIsSubscribe(boolean value) {
method clearIsSubscribe (line 15016) | public Builder clearIsSubscribe() {
method dynamicMethod (line 15024) | @java.lang.Override
method getDefaultInstance (line 15088) | public static chronik.Chronik.Subscription getDefaultInstance() {
method parser (line 15094) | public static com.google.protobuf.Parser<Subscription> parser() {
type SubscribeMsgOrBuilder (line 15099) | public interface SubscribeMsgOrBuilder extends
method hasError (line 15107) | boolean hasError();
method getError (line 15112) | chronik.Chronik.Error getError();
method hasAddedToMempool (line 15118) | boolean hasAddedToMempool();
method getAddedToMempool (line 15123) | chronik.Chronik.MsgAddedToMempool getAddedToMempool();
method hasRemovedFromMempool (line 15129) | boolean hasRemovedFromMempool();
method getRemovedFromMempool (line 15134) | chronik.Chronik.MsgRemovedFromMempool getRemovedFromMempool();
method hasConfirmed (line 15140) | boolean hasConfirmed();
method getConfirmed (line 15145) | chronik.Chronik.MsgConfirmed getConfirmed();
method hasReorg (line 15151) | boolean hasReorg();
method getReorg (line 15156) | chronik.Chronik.MsgReorg getReorg();
method hasBlockConnected (line 15162) | boolean hasBlockConnected();
method getBlockConnected (line 15167) | chronik.Chronik.MsgBlockConnected getBlockConnected();
method hasBlockDisconnected (line 15173) | boolean hasBlockDisconnected();
method getBlockDisconnected (line 15178) | chronik.Chronik.MsgBlockDisconnected getBlockDisconnected();
method getMsgTypeCase (line 15180) | public chronik.Chronik.SubscribeMsg.MsgTypeCase getMsgTypeCase();
class SubscribeMsg (line 15185) | public static final class SubscribeMsg extends
method SubscribeMsg (line 15190) | private SubscribeMsg() {
type MsgTypeCase (line 15194) | public enum MsgTypeCase {
method MsgTypeCase (line 15204) | private MsgTypeCase(int value) {
method valueOf (line 15210) | @java.lang.Deprecated
method forNumber (line 15215) | public static MsgTypeCase forNumber(int value) {
method getNumber (line 15228) | public int getNumber() {
method getMsgTypeCase (line 15233) | @java.lang.Override
method clearMsgType (line 15240) | private void clearMsgType() {
method hasError (line 15249) | @java.lang.Override
method getError (line 15256) | @java.lang.Override
method setError (line 15266) | private void setError(chronik.Chronik.Error value) {
method mergeError (line 15274) | private void mergeError(chronik.Chronik.Error value) {
method clearError (line 15288) | private void clearError() {
method hasAddedToMempool (line 15299) | @java.lang.Override
method getAddedToMempool (line 15306) | @java.lang.Override
method setAddedToMempool (line 15316) | private void setAddedToMempool(chronik.Chronik.MsgAddedToMempool val...
method mergeAddedToMempool (line 15324) | private void mergeAddedToMempool(chronik.Chronik.MsgAddedToMempool v...
method clearAddedToMempool (line 15338) | private void clearAddedToMempool() {
method hasRemovedFromMempool (line 15349) | @java.lang.Override
method getRemovedFromMempool (line 15356) | @java.lang.Override
method setRemovedFromMempool (line 15366) | private void setRemovedFromMempool(chronik.Chronik.MsgRemovedFromMem...
method mergeRemovedFromMempool (line 15374) | private void mergeRemovedFromMempool(chronik.Chronik.MsgRemovedFromM...
method clearRemovedFromMempool (line 15388) | private void clearRemovedFromMempool() {
method hasConfirmed (line 15399) | @java.lang.Override
method getConfirmed (line 15406) | @java.lang.Override
method setConfirmed (line 15416) | private void setConfirmed(chronik.Chronik.MsgConfirmed value) {
method mergeConfirmed (line 15424) | private void mergeConfirmed(chronik.Chronik.MsgConfirmed value) {
method clearConfirmed (line 15438) | private void clearConfirmed() {
method hasReorg (line 15449) | @java.lang.Override
method getReorg (line 15456) | @java.lang.Override
method setReorg (line 15466) | private void setReorg(chronik.Chronik.MsgReorg value) {
method mergeReorg (line 15474) | private void mergeReorg(chronik.Chronik.MsgReorg value) {
method clearReorg (line 15488) | private void clearReorg() {
method hasBlockConnected (line 15499) | @java.lang.Override
method getBlockConnected (line 15506) | @java.lang.Override
method setBlockConnected (line 15516) | private void setBlockConnected(chronik.Chronik.MsgBlockConnected val...
method mergeBlockConnected (line 15524) | private void mergeBlockConnected(chronik.Chronik.MsgBlockConnected v...
method clearBlockConnected (line 15538) | private void clearBlockConnected() {
method hasBlockDisconnected (line 15549) | @java.lang.Override
method getBlockDisconnected (line 15556) | @java.lang.Override
method setBlockDisconnected (line 15566) | private void setBlockDisconnected(chronik.Chronik.MsgBlockDisconnect...
method mergeBlockDisconnected (line 15574) | private void mergeBlockDisconnected(chronik.Chronik.MsgBlockDisconne...
method clearBlockDisconnected (line 15588) | private void clearBlockDisconnected() {
method parseFrom (line 15595) | public static chronik.Chronik.SubscribeMsg parseFrom(
method parseFrom (line 15601) | public static chronik.Chronik.SubscribeMsg parseFrom(
method parseFrom (line 15608) | public static chronik.Chronik.SubscribeMsg parseFrom(
method parseFrom (line 15614) | public static chronik.Chronik.SubscribeMsg parseFrom(
method parseFrom (line 15621) | public static chronik.Chronik.SubscribeMsg parseFrom(byte[] data)
method parseFrom (line 15626) | public static chronik.Chronik.SubscribeMsg parseFrom(
method parseFrom (line 15633) | public static chronik.Chronik.SubscribeMsg parseFrom(java.io.InputSt...
method parseFrom (line 15638) | public static chronik.Chronik.SubscribeMsg parseFrom(
method parseDelimitedFrom (line 15645) | public static chronik.Chronik.SubscribeMsg parseDelimitedFrom(java.i...
method parseDelimitedFrom (line 15649) | public static chronik.Chronik.SubscribeMsg parseDelimitedFrom(
method parseFrom (line 15655) | public static chronik.Chronik.SubscribeMsg parseFrom(
method parseFrom (line 15661) | public static chronik.Chronik.SubscribeMsg parseFrom(
method newBuilder (line 15669) | public static Builder newBuilder() {
method newBuilder (line 15672) | public static Builder newBuilder(chronik.Chronik.SubscribeMsg protot...
class Builder (line 15679) | public static final class Builder extends
method Builder (line 15685) | private Builder() {
method getMsgTypeCase (line 15689) | @java.lang.Override
method clearMsgType (line 15695) | public Builder clearMsgType() {
method hasError (line 15705) | @java.lang.Override
method getError (line 15712) | @java.lang.Override
method setError (line 15719) | public Builder setError(chronik.Chronik.Error value) {
method setError (line 15727) | public Builder setError(
method mergeError (line 15736) | public Builder mergeError(chronik.Chronik.Error value) {
method clearError (line 15744) | public Builder clearError() {
method hasAddedToMempool (line 15753) | @java.lang.Override
method getAddedToMempool (line 15760) | @java.lang.Override
method setAddedToMempool (line 15767) | public Builder setAddedToMempool(chronik.Chronik.MsgAddedToMempool...
method setAddedToMempool (line 15775) | public Builder setAddedToMempool(
method mergeAddedToMempool (line 15784) | public Builder mergeAddedToMempool(chronik.Chronik.MsgAddedToMempo...
method clearAddedToMempool (line 15792) | public Builder clearAddedToMempool() {
method hasRemovedFromMempool (line 15801) | @java.lang.Override
method getRemovedFromMempool (line 15808) | @java.lang.Override
method setRemovedFromMempool (line 15815) | public Builder setRemovedFromMempool(chronik.Chronik.MsgRemovedFro...
method setRemovedFromMempool (line 15823) | public Builder setRemovedFromMempool(
method mergeRemovedFromMempool (line 15832) | public Builder mergeRemovedFromMempool(chronik.Chronik.MsgRemovedF...
method clearRemovedFromMempool (line 15840) | public Builder clearRemovedFromMempool() {
method hasConfirmed (line 15849) | @java.lang.Override
method getConfirmed (line 15856) | @java.lang.Override
method setConfirmed (line 15863) | public Builder setConfirmed(chronik.Chronik.MsgConfirmed value) {
method setConfirmed (line 15871) | public Builder setConfirmed(
method mergeConfirmed (line 15880) | public Builder mergeConfirmed(chronik.Chronik.MsgConfirmed value) {
method clearConfirmed (line 15888) | public Builder clearConfirmed() {
method hasReorg (line 15897) | @java.lang.Override
method getReorg (line 15904) | @java.lang.Override
method setReorg (line 15911) | public Builder setReorg(chronik.Chronik.MsgReorg value) {
method setReorg (line 15919) | public Builder setReorg(
method mergeReorg (line 15928) | public Builder mergeReorg(chronik.Chronik.MsgReorg value) {
method clearReorg (line 15936) | public Builder clearReorg() {
method hasBlockConnected (line 15945) | @java.lang.Override
method getBlockConnected (line 15952) | @java.lang.Override
method setBlockConnected (line 15959) | public Builder setBlockConnected(chronik.Chronik.MsgBlockConnected...
method setBlockConnected (line 15967) | public Builder setBlockConnected(
method mergeBlockConnected (line 15976) | public Builder mergeBlockConnected(chronik.Chronik.MsgBlockConnect...
method clearBlockConnected (line 15984) | public Builder clearBlockConnected() {
method hasBlockDisconnected (line 15993) | @java.lang.Override
method getBlockDisconnected (line 16000) | @java.lang.Override
method setBlockDisconnected (line 16007) | public Builder setBlockDisconnected(chronik.Chronik.MsgBlockDiscon...
method setBlockDisconnected (line 16015) | public Builder setBlockDisconnected(
method mergeBlockDisconnected (line 16024) | public Builder mergeBlockDisconnected(chronik.Chronik.MsgBlockDisc...
method clearBlockDisconnected (line 16032) | public Builder clearBlockDisconnected() {
method dynamicMethod (line 16040) | @java.lang.Override
method getDefaultInstance (line 16110) | public static chronik.Chronik.SubscribeMsg getDefaultInstance() {
method parser (line 16116) | public static com.google.protobuf.Parser<SubscribeMsg> parser() {
type MsgAddedToMempoolOrBuilder (line 16121) | public interface MsgAddedToMempoolOrBuilder extends
method getTxid (line 16129) | com.google.protobuf.ByteString getTxid();
class MsgAddedToMempool (line 16134) | public static final class MsgAddedToMempool extends
method MsgAddedToMempool (line 16139) | private MsgAddedToMempool() {
method getTxid (line 16148) | @java.lang.Override
method setTxid (line 16156) | private void setTxid(com.google.protobuf.ByteString value) {
method clearTxid (line 16164) | private void clearTxid() {
method parseFrom (line 16169) | public static chronik.Chronik.MsgAddedToMempool parseFrom(
method parseFrom (line 16175) | public static chronik.Chronik.MsgAddedToMempool parseFrom(
method parseFrom (line 16182) | public static chronik.Chronik.MsgAddedToMempool parseFrom(
method parseFrom (line 16188) | public static chronik.Chronik.MsgAddedToMempool parseFrom(
method parseFrom (line 16195) | public static chronik.Chronik.MsgAddedToMempool parseFrom(byte[] data)
method parseFrom (line 16200) | public static chronik.Chronik.MsgAddedToMempool parseFrom(
method parseFrom (line 16207) | public static chronik.Chronik.MsgAddedToMempool parseFrom(java.io.In...
method parseFrom (line 16212) | public static chronik.Chronik.MsgAddedToMempool parseFrom(
method parseDelimitedFrom (line 16219) | public static chronik.Chronik.MsgAddedToMempool parseDelimitedFrom(j...
method parseDelimitedFrom (line 16223) | public static chronik.Chronik.MsgAddedToMempool parseDelimitedFrom(
method parseFrom (line 16229) | public static chronik.Chronik.MsgAddedToMempool parseFrom(
method parseFrom (line 16235) | public static chronik.Chronik.MsgAddedToMempool parseFrom(
method newBuilder (line 16243) | public static Builder newBuilder() {
method newBuilder (line 16246) | public static Builder newBuilder(chronik.Chronik.MsgAddedToMempool p...
class Builder (line 16253) | public static final class Builder extends
method Builder (line 16259) | private Builder() {
method getTxid (line 16268) | @java.lang.Override
method setTxid (line 16277) | public Builder setTxid(com.google.protobuf.ByteString value) {
method clearTxid (line 16286) | public Builder clearTxid() {
method dynamicMethod (line 16294) | @java.lang.Override
method getDefaultInstance (line 16355) | public static chronik.Chronik.MsgAddedToMempool getDefaultInstance() {
method parser (line 16361) | public static com.google.protobuf.Parser<MsgAddedToMempool> parser() {
type MsgRemovedFromMempoolOrBuilder (line 16366) | public interface MsgRemovedFromMempoolOrBuilder extends
method getTxid (line 16374) | com.google.protobuf.ByteString getTxid();
class MsgRemovedFromMempool (line 16379) | public static final class MsgRemovedFromMempool extends
method MsgRemovedFromMempool (line 16384) | private MsgRemovedFromMempool() {
method getTxid (line 16393) | @java.lang.Override
method setTxid (line 16401) | private void setTxid(com.google.protobuf.ByteString value) {
method clearTxid (line 16409) | private void clearTxid() {
method parseFrom (line 16414) | public static chronik.Chronik.MsgRemovedFromMempool parseFrom(
method parseFrom (line 16420) | public static chronik.Chronik.MsgRemovedFromMempool parseFrom(
method parseFrom (line 16427) | public static chronik.Chronik.MsgRemovedFromMempool parseFrom(
method parseFrom (line 16433) | public static chronik.Chronik.MsgRemovedFromMempool parseFrom(
method parseFrom (line 16440) | public static chronik.Chronik.MsgRemovedFromMempool parseFrom(byte[]...
method p
Condensed preview — 473 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,218K chars).
[
{
"path": ".github/workflows/pull-request-notify.yml",
"chars": 521,
"preview": "name: Notify PR events\n\non:\n pull_request:\n\njobs:\n build:\n runs-on: ubuntu-latest\n\n steps:\n - uses: actions"
},
{
"path": ".gitignore",
"chars": 86,
"preview": "*.iml\n.gradle\n.idea\n.DS_Store\n/build\n/captures\n/local.properties\n.externalNativeBuild\n"
},
{
"path": ".gitmodules",
"chars": 150,
"preview": "[submodule \"dashkit/cpp/dashj-bls/bls-signatures\"]\n\tpath = dashkit/cpp/dashj-bls/bls-signatures\n\turl = https://github.co"
},
{
"path": "CONTRIBUTING.md",
"chars": 1360,
"preview": "## Implementing support for a new coin for external developers\n\nSupport for coin is implemented as a separate module tha"
},
{
"path": "LICENSE",
"chars": 1075,
"preview": "MIT License\n\nCopyright (c) 2018 Horizontal Systems\n\nPermission is hereby granted, free of charge, to any person obtainin"
},
{
"path": "README.md",
"chars": 16615,
"preview": "# BitcoinKit\n\n`bitcoin-kit-android` is a Bitcoin wallet toolkit implemented in Kotlin. It consists of following librarie"
},
{
"path": "app/.gitignore",
"chars": 7,
"preview": "/build\n"
},
{
"path": "app/build.gradle",
"chars": 1947,
"preview": "plugins {\n id 'com.android.application'\n id 'org.jetbrains.kotlin.android'\n}\n\nandroid {\n namespace 'io.horizont"
},
{
"path": "app/proguard-rules.pro",
"chars": 751,
"preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
},
{
"path": "app/src/main/AndroidManifest.xml",
"chars": 824,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n <uses-"
},
{
"path": "app/src/main/java/io/horizontalsystems/bitcoinkit/demo/App.kt",
"chars": 285,
"preview": "package io.horizontalsystems.bitcoinkit.demo\n\nimport android.app.Application\n\nclass App : Application() {\n\n override "
},
{
"path": "app/src/main/java/io/horizontalsystems/bitcoinkit/demo/BalanceFragment.kt",
"chars": 5772,
"preview": "package io.horizontalsystems.bitcoinkit.demo\n\nimport androidx.lifecycle.Observer\nimport android.os.Bundle\nimport android"
},
{
"path": "app/src/main/java/io/horizontalsystems/bitcoinkit/demo/FeePriority.kt",
"chars": 195,
"preview": "package io.horizontalsystems.bitcoinkit.demo\n\nsealed class FeePriority(val feeRate: Int) {\n object Low : FeePriority("
},
{
"path": "app/src/main/java/io/horizontalsystems/bitcoinkit/demo/MainActivity.kt",
"chars": 2077,
"preview": "package io.horizontalsystems.bitcoinkit.demo\n\nimport android.os.Bundle\nimport com.google.android.material.bottomnavigati"
},
{
"path": "app/src/main/java/io/horizontalsystems/bitcoinkit/demo/MainViewModel.kt",
"chars": 8455,
"preview": "package io.horizontalsystems.bitcoinkit.demo\n\nimport androidx.lifecycle.MutableLiveData\nimport androidx.lifecycle.ViewMo"
},
{
"path": "app/src/main/java/io/horizontalsystems/bitcoinkit/demo/NumberFormatHelper.kt",
"chars": 627,
"preview": "package io.horizontalsystems.bitcoinkit.demo\n\nimport java.text.NumberFormat\n\nobject NumberFormatHelper {\n\n val fiatAm"
},
{
"path": "app/src/main/java/io/horizontalsystems/bitcoinkit/demo/SendReceiveFragment.kt",
"chars": 5443,
"preview": "package io.horizontalsystems.bitcoinkit.demo\n\nimport android.os.Bundle\nimport android.text.Editable\nimport android.text."
},
{
"path": "app/src/main/java/io/horizontalsystems/bitcoinkit/demo/TransactionsFragment.kt",
"chars": 7785,
"preview": "package io.horizontalsystems.bitcoinkit.demo\n\nimport android.annotation.SuppressLint\nimport android.graphics.Color\nimpor"
},
{
"path": "app/src/main/res/drawable/ic_launcher_background.xml",
"chars": 5606,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:wi"
},
{
"path": "app/src/main/res/drawable-v24/ic_launcher_foreground.xml",
"chars": 1880,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns:aapt=\"http://schemas.android.com/aapt\"\n "
},
{
"path": "app/src/main/res/layout/activity_main.xml",
"chars": 1137,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n android:id=\"@+id/container"
},
{
"path": "app/src/main/res/layout/fragment_balance.xml",
"chars": 6783,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas."
},
{
"path": "app/src/main/res/layout/fragment_send_receive.xml",
"chars": 8525,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.core.widget.NestedScrollView xmlns:android=\"http://schemas.android.com/"
},
{
"path": "app/src/main/res/layout/fragment_transactions.xml",
"chars": 1106,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas."
},
{
"path": "app/src/main/res/layout/view_holder_transaction.xml",
"chars": 1124,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas."
},
{
"path": "app/src/main/res/menu/navigation.xml",
"chars": 403,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n <item\n "
},
{
"path": "app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
"chars": 272,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <b"
},
{
"path": "app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
"chars": 272,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <b"
},
{
"path": "app/src/main/res/values/colors.xml",
"chars": 208,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <color name=\"colorPrimary\">#3F51B5</color>\n <color name=\"color"
},
{
"path": "app/src/main/res/values/strings.xml",
"chars": 73,
"preview": "<resources>\n <string name=\"app_name\">BitcoinKit</string>\n</resources>\n"
},
{
"path": "app/src/main/res/values/styles.xml",
"chars": 159,
"preview": "<resources>\n\n <!-- Base application theme. -->\n <style name=\"AppTheme\" parent=\"Theme.MaterialComponents.Light.Dark"
},
{
"path": "bitcoincashkit/.gitignore",
"chars": 7,
"preview": "/build\n"
},
{
"path": "bitcoincashkit/build.gradle",
"chars": 2265,
"preview": "plugins {\n id 'com.android.library'\n id 'kotlin-android'\n id 'kotlin-kapt'\n id 'maven-publish'\n}\n\nafterEvalu"
},
{
"path": "bitcoincashkit/proguard-rules.pro",
"chars": 751,
"preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
},
{
"path": "bitcoincashkit/src/main/AndroidManifest.xml",
"chars": 72,
"preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\" />\n"
},
{
"path": "bitcoincashkit/src/main/kotlin/io/horizontalsystems/bitcoincash/BitcoinCashKit.kt",
"chars": 15076,
"preview": "package io.horizontalsystems.bitcoincash\n\nimport android.content.Context\nimport android.database.sqlite.SQLiteDatabase\ni"
},
{
"path": "bitcoincashkit/src/main/kotlin/io/horizontalsystems/bitcoincash/MainNetBitcoinCash.kt",
"chars": 1475,
"preview": "package io.horizontalsystems.bitcoincash\n\nimport io.horizontalsystems.bitcoincore.network.Network\nimport io.horizontalsy"
},
{
"path": "bitcoincashkit/src/main/kotlin/io/horizontalsystems/bitcoincash/TestNetBitcoinCash.kt",
"chars": 1315,
"preview": "package io.horizontalsystems.bitcoincash\n\nimport io.horizontalsystems.bitcoincore.network.Network\nimport io.horizontalsy"
},
{
"path": "bitcoincashkit/src/main/kotlin/io/horizontalsystems/bitcoincash/blocks/AsertAlgorithm.java",
"chars": 3301,
"preview": "package io.horizontalsystems.bitcoincash.blocks;\n\nimport java.math.BigInteger;\n\npublic class AsertAlgorithm {\n public"
},
{
"path": "bitcoincashkit/src/main/kotlin/io/horizontalsystems/bitcoincash/blocks/BitcoinCashBlockValidatorHelper.kt",
"chars": 933,
"preview": "package io.horizontalsystems.bitcoincash.blocks\n\nimport io.horizontalsystems.bitcoincore.core.IStorage\nimport io.horizon"
},
{
"path": "bitcoincashkit/src/main/kotlin/io/horizontalsystems/bitcoincash/blocks/Utils.java",
"chars": 3274,
"preview": "package io.horizontalsystems.bitcoincash.blocks;\n\nimport java.math.BigInteger;\n\n/*\nExtracted from bitcoincashj\n */\npubli"
},
{
"path": "bitcoincashkit/src/main/kotlin/io/horizontalsystems/bitcoincash/blocks/validators/AsertValidator.kt",
"chars": 1112,
"preview": "package io.horizontalsystems.bitcoincash.blocks.validators\n\nimport io.horizontalsystems.bitcoincash.blocks.AsertAlgorith"
},
{
"path": "bitcoincashkit/src/main/kotlin/io/horizontalsystems/bitcoincash/blocks/validators/DAAValidator.kt",
"chars": 2469,
"preview": "package io.horizontalsystems.bitcoincash.blocks.validators\n\nimport io.horizontalsystems.bitcoincash.blocks.BitcoinCashBl"
},
{
"path": "bitcoincashkit/src/main/kotlin/io/horizontalsystems/bitcoincash/blocks/validators/EDAValidator.kt",
"chars": 2062,
"preview": "package io.horizontalsystems.bitcoincash.blocks.validators\n\nimport io.horizontalsystems.bitcoincash.blocks.BitcoinCashBl"
},
{
"path": "bitcoincashkit/src/main/kotlin/io/horizontalsystems/bitcoincash/blocks/validators/ForkValidator.kt",
"chars": 986,
"preview": "package io.horizontalsystems.bitcoincash.blocks.validators\n\nimport io.horizontalsystems.bitcoincore.blocks.validators.Bl"
},
{
"path": "bitcoincashkit/src/main/resources/MainNetBitcoinCash-bip44.checkpoint",
"chars": 34251,
"preview": "02000000ba3f2b4208ec0495b2e3743465cae2b44d8f1c778b44cf6b0000000000000000d287e52e8045c060c1cee47d1cc7559c7b8ab8db580539fb"
},
{
"path": "bitcoincashkit/src/main/resources/MainNetBitcoinCash.checkpoint",
"chars": 34251,
"preview": "0000fa272fd14221bb34078aa748fa05c33ede7b7dbb380e4f6a7e000000000000000000c99855609b8d0e0f8ba9114eaa0885f384fa9c15e436e2ee"
},
{
"path": "bitcoincashkit/src/main/resources/TestNetBitcoinCash-bip44.checkpoint",
"chars": 10019,
"preview": "02000000420ad5d432dfa48f61fa5b0b6b65f4587291761d56b8d271cad9bb010000000031d3e2406e954acbf9134d2420ddb8f607cb29dc7cdbd915"
},
{
"path": "bitcoincashkit/src/main/resources/TestNetBitcoinCash.checkpoint",
"chars": 34251,
"preview": "004093243e7e074cda6e106eb27af345c7a6da4bedb1d9d7d7e9f2631ba301000000000071b0865b1bd59a7eda02e2ad2926db5f90a077e34896c46d"
},
{
"path": "bitcoincashkit/src/test/kotlin/io/horizontalsystems/Fixtures.kt",
"chars": 9809,
"preview": "package io.horizontalsystems\n\nimport io.horizontalsystems.bitcoincore.extensions.hexToByteArray\nimport io.horizontalsyst"
},
{
"path": "bitcoincashkit/src/test/kotlin/io/horizontalsystems/bitcoincash/blocks/BitcoinCashBlockValidatorHelperTest.kt",
"chars": 3350,
"preview": "package io.horizontalsystems.bitcoincash.blocks\n\nimport com.nhaarman.mockito_kotlin.mock\nimport com.nhaarman.mockito_kot"
},
{
"path": "bitcoincashkit/src/test/kotlin/io/horizontalsystems/bitcoincash/blocks/validators/DAAValidatorTest.kt",
"chars": 8141,
"preview": "package io.horizontalsystems.bitcoincash.blocks.validators\n\nimport com.nhaarman.mockito_kotlin.any\nimport com.nhaarman.m"
},
{
"path": "bitcoincashkit/src/test/kotlin/io/horizontalsystems/bitcoincash/blocks/validators/ForkValidatorTest.kt",
"chars": 1975,
"preview": "package io.horizontalsystems.bitcoincash.blocks.validators\n\nimport com.nhaarman.mockito_kotlin.mock\nimport com.nhaarman."
},
{
"path": "bitcoincashkit/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker",
"chars": 17,
"preview": "mock-maker-inline"
},
{
"path": "bitcoincore/.gitignore",
"chars": 7,
"preview": "/build\n"
},
{
"path": "bitcoincore/build.gradle",
"chars": 2844,
"preview": "plugins {\n id 'com.android.library'\n id 'kotlin-android'\n id 'kotlin-kapt'\n id 'maven-publish'\n}\n\nafterEvalu"
},
{
"path": "bitcoincore/proguard-rules.pro",
"chars": 751,
"preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
},
{
"path": "bitcoincore/src/main/AndroidManifest.xml",
"chars": 162,
"preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n <uses-permission android:name=\"android.permis"
},
{
"path": "bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/DustCalculator.kt",
"chars": 1405,
"preview": "package io.horizontalsystems.bitcoincore\n\nimport io.horizontalsystems.bitcoincore.transactions.TransactionSizeCalculator"
},
{
"path": "bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/crypto/Base58.java",
"chars": 7391,
"preview": "package io.horizontalsystems.bitcoincore.crypto;\n\nimport java.io.UnsupportedEncodingException;\nimport java.util.Arrays;\n"
},
{
"path": "bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/crypto/Bech32.java",
"chars": 1709,
"preview": "package io.horizontalsystems.bitcoincore.crypto;\n\nimport androidx.annotation.NonNull;\n\npublic class Bech32 {\n /** The"
},
{
"path": "bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/crypto/Bech32Cash.java",
"chars": 7565,
"preview": "\npackage io.horizontalsystems.bitcoincore.crypto;\n\nimport io.horizontalsystems.bitcoincore.exceptions.AddressFormatExcep"
},
{
"path": "bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/crypto/Bech32Segwit.java",
"chars": 7265,
"preview": "/*\n * Copyright 2018 Coinomi Ltd\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not us"
},
{
"path": "bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/crypto/CompactBits.java",
"chars": 3173,
"preview": "package io.horizontalsystems.bitcoincore.crypto;\n\nimport java.math.BigInteger;\n\nimport io.horizontalsystems.bitcoincore."
},
{
"path": "bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/crypto/MurmurHash3.java",
"chars": 2525,
"preview": "package io.horizontalsystems.bitcoincore.crypto;\n\n/**\n * Applies the MurmurHash3 (x86_32) algorithm to the given data.\n "
},
{
"path": "bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/crypto/schnorr/Pair.java",
"chars": 732,
"preview": "package io.horizontalsystems.bitcoincore.crypto.schnorr;\n\npublic class Pair<K, V> {\n\n private K elementLeft = null;\n "
},
{
"path": "bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/crypto/schnorr/Point.java",
"chars": 5695,
"preview": "package io.horizontalsystems.bitcoincore.crypto.schnorr;\n\nimport java.math.BigInteger;\nimport java.security.NoSuchAlgori"
},
{
"path": "bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/crypto/schnorr/Schnorr.java",
"chars": 4149,
"preview": "package io.horizontalsystems.bitcoincore.crypto.schnorr;\n\nimport java.math.BigInteger;\nimport java.util.Arrays;\n\npublic "
},
{
"path": "bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/crypto/schnorr/SchnorrOld.java",
"chars": 8248,
"preview": "package io.horizontalsystems.bitcoincore.crypto.schnorr;\n\nimport java.math.BigInteger;\nimport java.security.MessageDiges"
},
{
"path": "bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/crypto/schnorr/Util.java",
"chars": 1342,
"preview": "package io.horizontalsystems.bitcoincore.crypto.schnorr;\n\nimport java.math.BigInteger;\nimport java.security.MessageDiges"
},
{
"path": "bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/exceptions/AddressFormatException.java",
"chars": 1005,
"preview": "/**\n * Copyright 2013-2014 Ronald W Hoffman\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
},
{
"path": "bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/exceptions/BitcoinException.java",
"chars": 477,
"preview": "package io.horizontalsystems.bitcoincore.exceptions;\n\n/**\n * Base exception for bitcoin app.\n *\n * @author liaoxuefeng\n "
},
{
"path": "bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/io/BitcoinInput.java",
"chars": 6001,
"preview": "package io.horizontalsystems.bitcoincore.io;\n\nimport java.io.EOFException;\nimport java.io.IOException;\nimport java.io.In"
},
{
"path": "bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/io/BitcoinInputMarkable.java",
"chars": 855,
"preview": "package io.horizontalsystems.bitcoincore.io;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.IOException;\n\n/**\n * A"
},
{
"path": "bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/io/BitcoinOutput.java",
"chars": 4362,
"preview": "package io.horizontalsystems.bitcoincore.io;\n\nimport java.io.ByteArrayOutputStream;\nimport java.io.IOException;\nimport j"
},
{
"path": "bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/io/UnsafeByteArrayOutputStream.java",
"chars": 3377,
"preview": "package io.horizontalsystems.bitcoincore.io;\n\nimport java.io.ByteArrayOutputStream;\nimport java.io.IOException;\nimport j"
},
{
"path": "bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/utils/HashUtils.java",
"chars": 4363,
"preview": "package io.horizontalsystems.bitcoincore.utils;\n\nimport org.bouncycastle.crypto.Digest;\nimport org.bouncycastle.crypto.d"
},
{
"path": "bitcoincore/src/main/java/io/horizontalsystems/bitcoincore/utils/Utils.java",
"chars": 8388,
"preview": "/**\n * Copyright 2011 Google Inc.\n * Copyright 2013-2016 Ronald W Hoffman\n *\n * Licensed under the Apache License, Versi"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/AbstractKit.kt",
"chars": 9449,
"preview": "package io.horizontalsystems.bitcoincore\n\nimport io.horizontalsystems.bitcoincore.core.IPluginData\nimport io.horizontals"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/BitcoinCore.kt",
"chars": 25319,
"preview": "package io.horizontalsystems.bitcoincore\n\nimport io.horizontalsystems.bitcoincore.apisync.blockchair.BlockchairApi\nimpor"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/BitcoinCoreBuilder.kt",
"chars": 29509,
"preview": "package io.horizontalsystems.bitcoincore\n\nimport android.content.Context\nimport io.horizontalsystems.bitcoincore.apisync"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/WatchAddressPublicKeyManager.kt",
"chars": 1562,
"preview": "package io.horizontalsystems.bitcoincore\n\nimport io.horizontalsystems.bitcoincore.apisync.legacy.IPublicKeyFetcher\nimpor"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/WatchedTransactionManager.kt",
"chars": 3219,
"preview": "package io.horizontalsystems.bitcoincore\n\nimport io.horizontalsystems.bitcoincore.extensions.toHexString\nimport io.horiz"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/apisync/BCoinApi.kt",
"chars": 1971,
"preview": "package io.horizontalsystems.bitcoincore.apisync\n\nimport com.eclipsesource.json.Json\nimport com.eclipsesource.json.JsonO"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/apisync/BiApiTransactionProvider.kt",
"chars": 782,
"preview": "package io.horizontalsystems.bitcoincore.apisync\n\nimport io.horizontalsystems.bitcoincore.apisync.model.TransactionItem\n"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/apisync/BlockHashFetcher.kt",
"chars": 984,
"preview": "package io.horizontalsystems.bitcoincore.apisync\n\nimport io.horizontalsystems.bitcoincore.apisync.blockchair.BlockchairB"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/apisync/BlockchainComApi.kt",
"chars": 4355,
"preview": "package io.horizontalsystems.bitcoincore.apisync\n\nimport com.eclipsesource.json.JsonValue\nimport io.horizontalsystems.bi"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/apisync/HsBlockHashFetcher.kt",
"chars": 750,
"preview": "package io.horizontalsystems.bitcoincore.apisync\n\nimport io.horizontalsystems.bitcoincore.apisync.blockchair.IBlockHashF"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/apisync/InsightApi.kt",
"chars": 2299,
"preview": "package io.horizontalsystems.bitcoincore.apisync\n\nimport io.horizontalsystems.bitcoincore.apisync.model.AddressItem\nimpo"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/apisync/blockchair/BlockchairApi.kt",
"chars": 6747,
"preview": "package io.horizontalsystems.bitcoincore.apisync.blockchair\n\nimport com.eclipsesource.json.Json\nimport com.eclipsesource"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/apisync/blockchair/BlockchairApiSyncer.kt",
"chars": 4749,
"preview": "package io.horizontalsystems.bitcoincore.apisync.blockchair\n\nimport io.horizontalsystems.bitcoincore.blocks.Blockchain\ni"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/apisync/blockchair/BlockchairBlockHashFetcher.kt",
"chars": 371,
"preview": "package io.horizontalsystems.bitcoincore.apisync.blockchair\n\n\ninterface IBlockHashFetcher {\n fun fetch(heights: List<"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/apisync/blockchair/BlockchairLastBlockProvider.kt",
"chars": 316,
"preview": "package io.horizontalsystems.bitcoincore.apisync.blockchair\n\nimport io.horizontalsystems.bitcoincore.apisync.model.Block"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/apisync/blockchair/BlockchairTransactionProvider.kt",
"chars": 911,
"preview": "package io.horizontalsystems.bitcoincore.apisync.blockchair\n\nimport io.horizontalsystems.bitcoincore.apisync.model.Trans"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/apisync/legacy/ApiSyncer.kt",
"chars": 2595,
"preview": "package io.horizontalsystems.bitcoincore.apisync.legacy\n\nimport io.horizontalsystems.bitcoincore.core.IApiSyncer\nimport "
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/apisync/legacy/BlockHashDiscoveryBatch.kt",
"chars": 3036,
"preview": "package io.horizontalsystems.bitcoincore.apisync.legacy\n\nimport io.horizontalsystems.bitcoincore.models.BlockHash\nimport"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/apisync/legacy/BlockHashScanHelper.kt",
"chars": 1033,
"preview": "package io.horizontalsystems.bitcoincore.apisync.legacy\n\nimport io.horizontalsystems.bitcoincore.apisync.model.AddressIt"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/apisync/legacy/BlockHashScanner.kt",
"chars": 2004,
"preview": "package io.horizontalsystems.bitcoincore.apisync.legacy\n\nimport io.horizontalsystems.bitcoincore.core.IApiSyncerListener"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/apisync/legacy/PublicKeyFetcher.kt",
"chars": 1422,
"preview": "package io.horizontalsystems.bitcoincore.apisync.legacy\n\nimport io.horizontalsystems.bitcoincore.core.AccountWallet\nimpo"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/apisync/model/AddressItem.kt",
"chars": 131,
"preview": "package io.horizontalsystems.bitcoincore.apisync.model\n\ndata class AddressItem(\n val script: String,\n val address:"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/apisync/model/BlockHeaderItem.kt",
"chars": 156,
"preview": "package io.horizontalsystems.bitcoincore.apisync.model\n\ndata class BlockHeaderItem(\n val hash: ByteArray,\n val hei"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/apisync/model/TransactionItem.kt",
"chars": 186,
"preview": "package io.horizontalsystems.bitcoincore.apisync.model\n\ndata class TransactionItem(\n val blockHash: String,\n val b"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/blocks/BlockDownload.kt",
"chars": 5600,
"preview": "package io.horizontalsystems.bitcoincore.blocks\n\nimport io.horizontalsystems.bitcoincore.core.IBlockSyncListener\nimport "
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/blocks/BlockMedianTimeHelper.kt",
"chars": 1148,
"preview": "package io.horizontalsystems.bitcoincore.blocks\n\nimport io.horizontalsystems.bitcoincore.core.IStorage\nimport io.horizon"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/blocks/BlockSyncer.kt",
"chars": 5112,
"preview": "package io.horizontalsystems.bitcoincore.blocks\n\nimport io.horizontalsystems.bitcoincore.core.IBlockSyncListener\nimport "
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/blocks/Blockchain.kt",
"chars": 3201,
"preview": "package io.horizontalsystems.bitcoincore.blocks\n\nimport io.horizontalsystems.bitcoincore.blocks.validators.BlockValidato"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/blocks/BloomFilterLoader.kt",
"chars": 834,
"preview": "package io.horizontalsystems.bitcoincore.blocks\n\nimport io.horizontalsystems.bitcoincore.crypto.BloomFilter\nimport io.ho"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/blocks/IBlockchainDataListener.kt",
"chars": 388,
"preview": "package io.horizontalsystems.bitcoincore.blocks\n\nimport io.horizontalsystems.bitcoincore.models.Block\nimport io.horizont"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/blocks/IPeerSyncListener.kt",
"chars": 214,
"preview": "package io.horizontalsystems.bitcoincore.blocks\n\nimport io.horizontalsystems.bitcoincore.network.peer.Peer\n\ninterface IP"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/blocks/InitialBlockDownload.kt",
"chars": 6519,
"preview": "package io.horizontalsystems.bitcoincore.blocks\n\nimport io.horizontalsystems.bitcoincore.core.IBlockSyncListener\nimport "
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/blocks/MerkleBlockExtractor.kt",
"chars": 1458,
"preview": "package io.horizontalsystems.bitcoincore.blocks\n\nimport io.horizontalsystems.bitcoincore.core.HashBytes\nimport io.horizo"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/blocks/validators/BitsValidator.kt",
"chars": 460,
"preview": "package io.horizontalsystems.bitcoincore.blocks.validators\n\nimport io.horizontalsystems.bitcoincore.models.Block\n\nclass "
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/blocks/validators/BlockValidatorChain.kt",
"chars": 685,
"preview": "package io.horizontalsystems.bitcoincore.blocks.validators\n\nimport io.horizontalsystems.bitcoincore.models.Block\n\nclass "
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/blocks/validators/BlockValidatorException.kt",
"chars": 928,
"preview": "package io.horizontalsystems.bitcoincore.blocks.validators\n\nimport io.horizontalsystems.bitcoincore.extensions.toReverse"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/blocks/validators/BlockValidatorSet.kt",
"chars": 486,
"preview": "package io.horizontalsystems.bitcoincore.blocks.validators\n\nimport io.horizontalsystems.bitcoincore.models.Block\n\nclass "
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/blocks/validators/IBlockValidator.kt",
"chars": 325,
"preview": "package io.horizontalsystems.bitcoincore.blocks.validators\n\nimport io.horizontalsystems.bitcoincore.models.Block\n\ninterf"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/blocks/validators/LegacyDifficultyAdjustmentValidator.kt",
"chars": 1713,
"preview": "package io.horizontalsystems.bitcoincore.blocks.validators\n\nimport io.horizontalsystems.bitcoincore.crypto.CompactBits\ni"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/blocks/validators/LegacyTestNetDifficultyValidator.kt",
"chars": 1264,
"preview": "package io.horizontalsystems.bitcoincore.blocks.validators\n\nimport io.horizontalsystems.bitcoincore.core.IStorage\nimport"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/blocks/validators/ProofOfWorkValidator.kt",
"chars": 675,
"preview": "package io.horizontalsystems.bitcoincore.blocks.validators\n\nimport io.horizontalsystems.bitcoincore.crypto.CompactBits\ni"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/core/AccountWallet.kt",
"chars": 1361,
"preview": "package io.horizontalsystems.bitcoincore.core\n\nimport io.horizontalsystems.bitcoincore.models.PublicKey\nimport io.horizo"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/core/BaseTransactionInfoConverter.kt",
"chars": 4598,
"preview": "package io.horizontalsystems.bitcoincore.core\n\nimport io.horizontalsystems.bitcoincore.extensions.toReversedHex\nimport i"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/core/DataProvider.kt",
"chars": 4907,
"preview": "package io.horizontalsystems.bitcoincore.core\n\nimport io.horizontalsystems.bitcoincore.blocks.IBlockchainDataListener\nim"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/core/DoubleSha256Hasher.kt",
"chars": 245,
"preview": "package io.horizontalsystems.bitcoincore.core\n\nimport io.horizontalsystems.bitcoincore.utils.HashUtils\n\nclass DoubleSha2"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/core/Extensions.kt",
"chars": 2047,
"preview": "package io.horizontalsystems.bitcoincore.core\n\nimport io.horizontalsystems.bitcoincore.storage.FullTransaction\nimport io"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/core/HashBytes.kt",
"chars": 1179,
"preview": "package io.horizontalsystems.bitcoincore.core\n\nimport io.horizontalsystems.bitcoincore.extensions.toHexString\nimport io."
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/core/IHasher.kt",
"chars": 111,
"preview": "package io.horizontalsystems.bitcoincore.core\n\ninterface IHasher {\n fun hash(data: ByteArray) : ByteArray\n}\n"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/core/Interfaces.kt",
"chars": 10275,
"preview": "package io.horizontalsystems.bitcoincore.core\n\nimport io.horizontalsystems.bitcoincore.BitcoinCore\nimport io.horizontals"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/core/PluginManager.kt",
"chars": 4004,
"preview": "package io.horizontalsystems.bitcoincore.core\n\nimport io.horizontalsystems.bitcoincore.managers.IRestoreKeyConverter\nimp"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/core/TransactionDataSorterFactory.kt",
"chars": 678,
"preview": "package io.horizontalsystems.bitcoincore.core\n\nimport io.horizontalsystems.bitcoincore.models.TransactionDataSortType\nim"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/core/TransactionInfoConverter.kt",
"chars": 479,
"preview": "package io.horizontalsystems.bitcoincore.core\n\nimport io.horizontalsystems.bitcoincore.models.TransactionInfo\nimport io."
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/core/Wallet.kt",
"chars": 1336,
"preview": "package io.horizontalsystems.bitcoincore.core\n\nimport io.horizontalsystems.bitcoincore.models.PublicKey\nimport io.horizo"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/core/WatchAccountWallet.kt",
"chars": 1168,
"preview": "package io.horizontalsystems.bitcoincore.core\n\nimport io.horizontalsystems.bitcoincore.models.PublicKey\nimport io.horizo"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/crypto/BloomFilter.kt",
"chars": 3323,
"preview": "package io.horizontalsystems.bitcoincore.crypto\n\nimport io.horizontalsystems.bitcoincore.io.BitcoinOutput\nimport io.hori"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/extensions/Array.kt",
"chars": 289,
"preview": "package io.horizontalsystems.bitcoincore.extensions\n\nfun ByteArray.toHexString(): String {\n return this.joinToString("
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/extensions/String.kt",
"chars": 298,
"preview": "package io.horizontalsystems.bitcoincore.extensions\n\nfun String.hexToByteArray(): ByteArray {\n return ByteArray(this."
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/managers/AccountPublicKeyManager.kt",
"chars": 3996,
"preview": "package io.horizontalsystems.bitcoincore.managers\n\nimport io.horizontalsystems.bitcoincore.core.IAccountWallet\nimport io"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/managers/ApiManager.kt",
"chars": 3516,
"preview": "package io.horizontalsystems.bitcoincore.managers\n\nimport com.eclipsesource.json.Json\nimport com.eclipsesource.json.Json"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/managers/ApiSyncStateManager.kt",
"chars": 482,
"preview": "package io.horizontalsystems.bitcoincore.managers\n\nimport io.horizontalsystems.bitcoincore.core.IStorage\n\nclass ApiSyncS"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/managers/BlockValidatorHelper.kt",
"chars": 1232,
"preview": "package io.horizontalsystems.bitcoincore.managers\n\nimport io.horizontalsystems.bitcoincore.core.IStorage\nimport io.horiz"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/managers/BloomFilterManager.kt",
"chars": 1148,
"preview": "package io.horizontalsystems.bitcoincore.managers\n\nimport io.horizontalsystems.bitcoincore.crypto.BloomFilter\n\nclass Blo"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/managers/ConnectionManager.kt",
"chars": 3489,
"preview": "package io.horizontalsystems.bitcoincore.managers\n\nimport android.content.Context\nimport android.net.ConnectivityManager"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/managers/IUnspentOutputProvider.kt",
"chars": 279,
"preview": "package io.horizontalsystems.bitcoincore.managers\n\nimport io.horizontalsystems.bitcoincore.storage.UnspentOutput\nimport "
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/managers/IUnspentOutputSelector.kt",
"chars": 2470,
"preview": "package io.horizontalsystems.bitcoincore.managers\n\nimport io.horizontalsystems.bitcoincore.storage.UnspentOutput\nimport "
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/managers/IrregularOutputFinder.kt",
"chars": 1648,
"preview": "package io.horizontalsystems.bitcoincore.managers\n\nimport io.horizontalsystems.bitcoincore.core.IStorage\nimport io.horiz"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/managers/PendingOutpointsProvider.kt",
"chars": 672,
"preview": "package io.horizontalsystems.bitcoincore.managers\n\nimport io.horizontalsystems.bitcoincore.core.IStorage\nimport io.horiz"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/managers/PublicKeyManager.kt",
"chars": 4715,
"preview": "package io.horizontalsystems.bitcoincore.managers\n\nimport io.horizontalsystems.bitcoincore.core.IPublicKeyManager\nimport"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/managers/RestoreKeyConverters.kt",
"chars": 4187,
"preview": "package io.horizontalsystems.bitcoincore.managers\n\nimport io.horizontalsystems.bitcoincore.extensions.toHexString\nimport"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/managers/SyncManager.kt",
"chars": 5617,
"preview": "package io.horizontalsystems.bitcoincore.managers\n\nimport io.horizontalsystems.bitcoincore.BitcoinCore\nimport io.horizon"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/managers/UnspentOutputProvider.kt",
"chars": 2986,
"preview": "package io.horizontalsystems.bitcoincore.managers\n\nimport io.horizontalsystems.bitcoincore.core.IStorage\nimport io.horiz"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/managers/UnspentOutputQueue.kt",
"chars": 3583,
"preview": "package io.horizontalsystems.bitcoincore.managers\n\nimport io.horizontalsystems.bitcoincore.DustCalculator\nimport io.hori"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/managers/UnspentOutputSelector.kt",
"chars": 2525,
"preview": "package io.horizontalsystems.bitcoincore.managers\n\nimport io.horizontalsystems.bitcoincore.DustCalculator\nimport io.hori"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/managers/UnspentOutputSelectorSingleNoChange.kt",
"chars": 2507,
"preview": "package io.horizontalsystems.bitcoincore.managers\n\nimport io.horizontalsystems.bitcoincore.DustCalculator\nimport io.hori"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/models/Address.kt",
"chars": 2509,
"preview": "package io.horizontalsystems.bitcoincore.models\n\nimport io.horizontalsystems.bitcoincore.transactions.scripts.OpCodes\nim"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/models/BitcoinPaymentData.kt",
"chars": 969,
"preview": "package io.horizontalsystems.bitcoincore.models\n\ndata class BitcoinPaymentData(\n val address: String,\n val"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/models/BitcoinSendInfo.kt",
"chars": 265,
"preview": "package io.horizontalsystems.bitcoincore.models\n\nimport io.horizontalsystems.bitcoincore.storage.UnspentOutput\n\ndata cla"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/models/Block.kt",
"chars": 1721,
"preview": "package io.horizontalsystems.bitcoincore.models\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport andr"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/models/BlockHash.kt",
"chars": 246,
"preview": "package io.horizontalsystems.bitcoincore.models\n\nimport androidx.room.Entity\nimport androidx.room.PrimaryKey\n\n@Entity\ncl"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/models/BlockHashPublicKey.kt",
"chars": 822,
"preview": "package io.horizontalsystems.bitcoincore.models\n\nimport androidx.room.Entity\nimport androidx.room.ForeignKey\n\n@Entity(\n "
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/models/BlockchainState.kt",
"chars": 241,
"preview": "package io.horizontalsystems.bitcoincore.models\n\nimport androidx.room.Entity\nimport androidx.room.PrimaryKey\n\n@Entity\nda"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/models/Checkpoint.kt",
"chars": 3073,
"preview": "package io.horizontalsystems.bitcoincore.models\n\nimport io.horizontalsystems.bitcoincore.BitcoinCore\nimport io.horizonta"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/models/InvalidTransaction.kt",
"chars": 804,
"preview": "package io.horizontalsystems.bitcoincore.models\n\nimport androidx.room.Entity\n\n@Entity\nclass InvalidTransaction() : Trans"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/models/InventoryItem.kt",
"chars": 1853,
"preview": "package io.horizontalsystems.bitcoincore.models\n\nimport io.horizontalsystems.bitcoincore.io.BitcoinInputMarkable\nimport "
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/models/MerkleBlock.kt",
"chars": 569,
"preview": "package io.horizontalsystems.bitcoincore.models\n\nimport io.horizontalsystems.bitcoincore.core.HashBytes\nimport io.horizo"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/models/NetworkAddress.kt",
"chars": 2552,
"preview": "package io.horizontalsystems.bitcoincore.models\n\nimport io.horizontalsystems.bitcoincore.io.BitcoinInputMarkable\nimport "
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/models/PeerAddress.kt",
"chars": 223,
"preview": "package io.horizontalsystems.bitcoincore.models\n\nimport androidx.room.Entity\nimport androidx.room.PrimaryKey\n\n@Entity\nda"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/models/PublicKey.kt",
"chars": 1773,
"preview": "package io.horizontalsystems.bitcoincore.models\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport andr"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/models/SentTransaction.kt",
"chars": 448,
"preview": "package io.horizontalsystems.bitcoincore.models\n\nimport androidx.room.Entity\nimport androidx.room.PrimaryKey\n\n@Entity\ncl"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/models/Transaction.kt",
"chars": 1649,
"preview": "package io.horizontalsystems.bitcoincore.models\n\nimport androidx.room.Entity\nimport androidx.room.ForeignKey\nimport java"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/models/TransactionDataSortType.kt",
"chars": 113,
"preview": "package io.horizontalsystems.bitcoincore.models\n\nenum class TransactionDataSortType {\n None, Shuffle, Bip69\n}\n"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/models/TransactionInfo.kt",
"chars": 7317,
"preview": "package io.horizontalsystems.bitcoincore.models\n\nimport com.eclipsesource.json.Json\nimport com.eclipsesource.json.JsonAr"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/models/TransactionInput.kt",
"chars": 1688,
"preview": "package io.horizontalsystems.bitcoincore.models\n\nimport androidx.room.Entity\nimport androidx.room.ForeignKey\nimport andr"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/models/TransactionMetadata.kt",
"chars": 1086,
"preview": "package io.horizontalsystems.bitcoincore.models\n\nimport androidx.room.Entity\nimport androidx.room.PrimaryKey\nimport andr"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/models/TransactionOutput.kt",
"chars": 3332,
"preview": "package io.horizontalsystems.bitcoincore.models\n\nimport androidx.room.Entity\nimport androidx.room.ForeignKey\nimport andr"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/models/UsedAddress.kt",
"chars": 119,
"preview": "package io.horizontalsystems.bitcoincore.models\n\ndata class UsedAddress(\n val index: Int,\n val address: String\n)\n"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/models/WatchAddressPublicKey.kt",
"chars": 876,
"preview": "package io.horizontalsystems.bitcoincore.models\n\nimport io.horizontalsystems.bitcoincore.transactions.scripts.ScriptType"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/network/Network.kt",
"chars": 1303,
"preview": "package io.horizontalsystems.bitcoincore.network\n\nimport io.horizontalsystems.bitcoincore.models.Checkpoint\nimport io.ho"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/network/messages/AddrMessage.kt",
"chars": 710,
"preview": "package io.horizontalsystems.bitcoincore.network.messages\n\nimport io.horizontalsystems.bitcoincore.io.BitcoinInputMarkab"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/network/messages/FilterLoadMessage.kt",
"chars": 614,
"preview": "package io.horizontalsystems.bitcoincore.network.messages\n\nimport io.horizontalsystems.bitcoincore.crypto.BloomFilter\n\nc"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/network/messages/GetBlocksMessage.kt",
"chars": 1110,
"preview": "package io.horizontalsystems.bitcoincore.network.messages\n\nimport io.horizontalsystems.bitcoincore.extensions.toReversed"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/network/messages/GetDataMessage.kt",
"chars": 1484,
"preview": "package io.horizontalsystems.bitcoincore.network.messages\n\nimport io.horizontalsystems.bitcoincore.extensions.toReversed"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/network/messages/GetHeadersMessage.kt",
"chars": 985,
"preview": "package io.horizontalsystems.bitcoincore.network.messages\n\nimport io.horizontalsystems.bitcoincore.extensions.toReversed"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/network/messages/HeadersMessage.kt",
"chars": 2386,
"preview": "package io.horizontalsystems.bitcoincore.network.messages\n\nimport io.horizontalsystems.bitcoincore.core.IHasher\nimport i"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/network/messages/IMessage.kt",
"chars": 4244,
"preview": "package io.horizontalsystems.bitcoincore.network.messages\n\nimport io.horizontalsystems.bitcoincore.exceptions.BitcoinExc"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/network/messages/InvMessage.kt",
"chars": 1755,
"preview": "package io.horizontalsystems.bitcoincore.network.messages\n\nimport io.horizontalsystems.bitcoincore.extensions.toReversed"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/network/messages/MempoolMessage.kt",
"chars": 447,
"preview": "package io.horizontalsystems.bitcoincore.network.messages\n\nclass MempoolMessage : IMessage {\n override fun toString()"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/network/messages/MerkleBlockMessage.kt",
"chars": 1936,
"preview": "package io.horizontalsystems.bitcoincore.network.messages\n\nimport io.horizontalsystems.bitcoincore.extensions.toReversed"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/network/messages/PingMessage.kt",
"chars": 870,
"preview": "package io.horizontalsystems.bitcoincore.network.messages\n\nimport io.horizontalsystems.bitcoincore.io.BitcoinInputMarkab"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/network/messages/PongMessage.kt",
"chars": 870,
"preview": "package io.horizontalsystems.bitcoincore.network.messages\n\nimport io.horizontalsystems.bitcoincore.io.BitcoinInputMarkab"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/network/messages/RejectMessage.kt",
"chars": 817,
"preview": "package io.horizontalsystems.bitcoincore.network.messages\n\nimport io.horizontalsystems.bitcoincore.io.BitcoinInputMarkab"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/network/messages/TransactionMessage.kt",
"chars": 1155,
"preview": "package io.horizontalsystems.bitcoincore.network.messages\n\nimport io.horizontalsystems.bitcoincore.extensions.toReversed"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/network/messages/UnknownMessage.kt",
"chars": 210,
"preview": "package io.horizontalsystems.bitcoincore.network.messages\n\nclass UnknownMessage(val command: String) : IMessage {\n ov"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/network/messages/VerAckMessage.kt",
"chars": 708,
"preview": "package io.horizontalsystems.bitcoincore.network.messages\n\nimport io.horizontalsystems.bitcoincore.io.BitcoinInputMarkab"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/network/messages/VersionMessage.kt",
"chars": 4098,
"preview": "package io.horizontalsystems.bitcoincore.network.messages\n\nimport io.horizontalsystems.bitcoincore.io.BitcoinInputMarkab"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/network/peer/IInventoryItemsHandler.kt",
"chars": 658,
"preview": "package io.horizontalsystems.bitcoincore.network.peer\n\nimport io.horizontalsystems.bitcoincore.models.InventoryItem\n\nint"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/network/peer/IPeerTaskHandler.kt",
"chars": 600,
"preview": "package io.horizontalsystems.bitcoincore.network.peer\n\nimport io.horizontalsystems.bitcoincore.network.peer.task.PeerTas"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/network/peer/MempoolTransactions.kt",
"chars": 2906,
"preview": "package io.horizontalsystems.bitcoincore.network.peer\n\nimport io.horizontalsystems.bitcoincore.models.InventoryItem\nimpo"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/network/peer/Peer.kt",
"chars": 6116,
"preview": "package io.horizontalsystems.bitcoincore.network.peer\n\nimport io.horizontalsystems.bitcoincore.crypto.BloomFilter\nimport"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/network/peer/PeerAddressManager.kt",
"chars": 2292,
"preview": "package io.horizontalsystems.bitcoincore.network.peer\n\nimport io.horizontalsystems.bitcoincore.core.IPeerAddressManager\n"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/network/peer/PeerConnection.kt",
"chars": 3289,
"preview": "package io.horizontalsystems.bitcoincore.network.peer\n\nimport io.horizontalsystems.bitcoincore.io.BitcoinInput\nimport io"
},
{
"path": "bitcoincore/src/main/kotlin/io/horizontalsystems/bitcoincore/network/peer/PeerDiscover.kt",
"chars": 1187,
"preview": "package io.horizontalsystems.bitcoincore.network.peer\n\nimport io.horizontalsystems.bitcoincore.core.IPeerAddressManager\n"
}
]
// ... and 273 more files (download for full content)
About this extraction
This page contains the full source code of the horizontalsystems/bitcoin-kit-android GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 473 files (2.0 MB), approximately 557.1k tokens, and a symbol index with 2523 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.