├── .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-v24 │ └── ic_launcher_foreground.xml │ ├── drawable │ └── ic_launcher_background.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 │ ├── mipmap-hdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-mdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xxhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xxxhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ └── 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 │ ├── messages │ └── mnlistdiff.bin │ └── 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.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.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 /.github/workflows/pull-request-notify.yml: -------------------------------------------------------------------------------- 1 | name: Notify PR events 2 | 3 | on: 4 | pull_request: 5 | 6 | jobs: 7 | build: 8 | runs-on: ubuntu-latest 9 | 10 | steps: 11 | - uses: actions/checkout@v2 12 | - name: Notify to Telegrem 13 | uses: appleboy/telegram-action@master 14 | with: 15 | to: ${{secrets.TELEGRAM_TO}} 16 | token: ${{secrets.TELEGRAM_TOKEN}} 17 | disable_web_page_preview: true 18 | message: | 19 | ${{ github.event.pull_request.html_url }} 20 | 21 | Title: ${{github.event.pull_request.title}} 22 | Author: ${{github.actor}} 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | .idea 4 | .DS_Store 5 | /build 6 | /captures 7 | /local.properties 8 | .externalNativeBuild 9 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "dashkit/cpp/dashj-bls/bls-signatures"] 2 | path = dashkit/cpp/dashj-bls/bls-signatures 3 | url = https://github.com/Chia-Network/bls-signatures 4 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | ## Implementing support for a new coin for external developers 2 | 3 | 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. 4 | 5 | ### Structure of module 6 | 7 | The module depends on the `bitcoincore`. This dependency can be added via JitPack repository. 8 | 9 | In the main `build.gradle` add the JitPack repository: 10 | 11 | ``` 12 | repositories { 13 | maven { url 'https://jitpack.io' } 14 | } 15 | ``` 16 | 17 | Add the following dependency to module `build.gradle` file: 18 | 19 | ``` 20 | dependencies { 21 | implementation 'com.github.horizontalsystems.bitcoin-kit-android:bitcoincore:${version}' 22 | } 23 | ``` 24 | 25 | It implements `AbstractKit` and `Network` interfaces (abstract classes). 26 | 27 | Customizing can be done in 2 places: 28 | 29 | 1. Via `BitcoinCoreBuilder` when building `BitcoinCore` 30 | 2. Via `BitcoinCore` 31 | 32 | 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). 33 | 34 | When the module is released let us know about it. We will review it and decide whether to add it to Unstoppable wallet app. 35 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Horizontal Systems 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 14 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/java/io/horizontalsystems/bitcoinkit/demo/App.kt: -------------------------------------------------------------------------------- 1 | package io.horizontalsystems.bitcoinkit.demo 2 | 3 | import android.app.Application 4 | 5 | class App : Application() { 6 | 7 | override fun onCreate() { 8 | super.onCreate() 9 | 10 | instance = this 11 | } 12 | 13 | companion object { 14 | lateinit var instance: App 15 | private set 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/io/horizontalsystems/bitcoinkit/demo/FeePriority.kt: -------------------------------------------------------------------------------- 1 | package io.horizontalsystems.bitcoinkit.demo 2 | 3 | sealed class FeePriority(val feeRate: Int) { 4 | object Low : FeePriority(5) 5 | object Medium : FeePriority(10) 6 | object High : FeePriority(15) 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/io/horizontalsystems/bitcoinkit/demo/NumberFormatHelper.kt: -------------------------------------------------------------------------------- 1 | package io.horizontalsystems.bitcoinkit.demo 2 | 3 | import java.text.NumberFormat 4 | 5 | object NumberFormatHelper { 6 | 7 | val fiatAmountFormat: NumberFormat 8 | get() { 9 | val numberFormat = NumberFormat.getInstance() 10 | numberFormat.maximumFractionDigits = 2 11 | numberFormat.minimumFractionDigits = 2 12 | return numberFormat 13 | } 14 | 15 | val cryptoAmountFormat: NumberFormat 16 | get() { 17 | val numberFormat = NumberFormat.getInstance() 18 | numberFormat.maximumFractionDigits = 12 19 | numberFormat.minimumFractionDigits = 2 20 | return numberFormat 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 18 | 19 | 29 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_transactions.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 16 | 17 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/layout/view_holder_transaction.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 18 | 19 |