Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 0 additions & 14 deletions .github/workflows/docs.yaml

This file was deleted.

25 changes: 25 additions & 0 deletions .github/workflows/format-check.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
name: Format Check

on: [pull_request, workflow_dispatch]

jobs:
format_check:
name: "Check Kotlin formatting"
runs-on: ubuntu-24.04
steps:
- name: "Check out PR branch"
uses: actions/checkout@v4
with:
fetch-depth: 1

- name: "Set up JDK"
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17

- name: "Download ktfmt"
run: curl -fsSLo ktfmt.jar https://github.com/facebook/ktfmt/releases/download/v0.64/ktfmt-0.64-with-dependencies.jar

- name: "Check formatting"
run: java -jar ktfmt.jar --dry-run --set-exit-if-changed --kotlinlang-style --enable-editorconfig src/
4 changes: 4 additions & 0 deletions justfile
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,7 @@ docs-clean:
rm -rf .venv/
rm -rf .cache/
rm -rf site/

# Format app using ktfmt
format:
ktfmt --kotlinlang-style --enable-editorconfig src/
45 changes: 21 additions & 24 deletions src/org/bitcoindevkit/devkitwallet/data/Kyoto.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
package org.bitcoindevkit.devkitwallet.data

import android.util.Log
import kotlin.collections.listOf
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow
Expand All @@ -26,12 +27,12 @@ import org.bitcoindevkit.Update
import org.bitcoindevkit.Wallet
import org.bitcoindevkit.Warning
import org.bitcoindevkit.Wtxid
import kotlin.collections.listOf

private const val TAG = "KyotoClient"

// TODO: Document this class well
class Kyoto private constructor(
class Kyoto
private constructor(
private val kyotoNode: CbfNode,
private val kyotoClient: CbfClient,
) {
Expand Down Expand Up @@ -111,31 +112,27 @@ class Kyoto private constructor(

fun create(wallet: Wallet, dataDir: String, network: Network): Kyoto {
Log.i(TAG, "Starting Kyoto node")
val peers: List<Peer> = when (network) {
Network.REGTEST -> {
val ip: IpAddress = IpAddress.fromIpv4(10u, 0u, 2u, 2u)
val peer1: Peer = Peer(ip, 18444u, false)
listOf(peer1)
}

Network.SIGNET -> {
val ip: IpAddress = IpAddress.fromIpv4(68u, 47u, 229u, 218u)
val peer1: Peer = Peer(ip, null, false)
listOf(peer1)
val peers: List<Peer> =
when (network) {
Network.REGTEST -> {
val ip: IpAddress = IpAddress.fromIpv4(10u, 0u, 2u, 2u)
val peer1: Peer = Peer(ip, 18444u, false)
listOf(peer1)
}

Network.SIGNET -> {
val ip: IpAddress = IpAddress.fromIpv4(68u, 47u, 229u, 218u)
val peer1: Peer = Peer(ip, null, false)
listOf(peer1)
}

else -> {
listOf()
}
}

else -> {
listOf()
}
}

val (client, node) =
CbfBuilder()
.dataDir(dataDir)
.peers(peers)
.connections(1u)
.scanType(ScanType.Sync)
.build(wallet)
CbfBuilder().dataDir(dataDir).peers(peers).connections(1u).scanType(ScanType.Sync).build(wallet)

return Kyoto(node, client).also { instance = it }
}
Expand Down
6 changes: 2 additions & 4 deletions src/org/bitcoindevkit/devkitwallet/data/TxDetails.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,6 @@ data class TxDetails(
val confirmationTimestamp: Timestamp?,
)

@JvmInline
value class Timestamp(val timestamp: ULong)
@JvmInline value class Timestamp(val timestamp: ULong)

@JvmInline
value class ConfirmationBlock(val height: UInt)
@JvmInline value class ConfirmationBlock(val height: UInt)
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@ package org.bitcoindevkit.devkitwallet.data.datastore

import androidx.datastore.core.CorruptionException
import androidx.datastore.core.Serializer
import java.io.InputStream
import java.io.OutputStream
import kotlinx.serialization.Serializable
import kotlinx.serialization.SerializationException
import kotlinx.serialization.json.Json
import java.io.InputStream
import java.io.OutputStream

@Serializable
data class AppSettings(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ package org.bitcoindevkit.devkitwallet.data.datastore

import androidx.datastore.core.CorruptionException
import androidx.datastore.core.Serializer
import java.io.InputStream
import java.io.OutputStream
import kotlinx.serialization.Serializable
import kotlinx.serialization.SerializationException
import kotlinx.serialization.json.Json
import java.io.InputStream
import java.io.OutputStream

@Serializable
enum class ActiveWalletNetwork {
Expand Down Expand Up @@ -36,7 +36,7 @@ data class StoredWallet(

@Serializable
data class WalletData(
val wallets: List<StoredWallet> = emptyList(),
val wallets: List<StoredWallet> = emptyList()
// network config fields go here alongside wallets
)

Expand Down
6 changes: 2 additions & 4 deletions src/org/bitcoindevkit/devkitwallet/domain/DwLogger.kt
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,7 @@ object DwLogger {
}
val millis = System.currentTimeMillis()
val dateTime =
Instant
.ofEpochMilli(millis)
Instant.ofEpochMilli(millis)
.atZone(ZoneId.systemDefault())
.toLocalDateTime()
.truncatedTo(ChronoUnit.SECONDS)
Expand All @@ -40,8 +39,7 @@ object DwLogger {
enum class LogLevel {
INFO,
WARN,
ERROR,
;
ERROR;

override fun toString(): String {
return when (this) {
Expand Down
21 changes: 11 additions & 10 deletions src/org/bitcoindevkit/devkitwallet/domain/Wallet.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
package org.bitcoindevkit.devkitwallet.domain

import android.util.Log
import java.util.UUID
import kotlinx.coroutines.runBlocking
import org.bitcoindevkit.Address
import org.bitcoindevkit.AddressInfo
Expand All @@ -24,6 +25,7 @@ import org.bitcoindevkit.Psbt
import org.bitcoindevkit.Script
import org.bitcoindevkit.TxBuilder
import org.bitcoindevkit.Update
import org.bitcoindevkit.Wallet as BdkWallet
import org.bitcoindevkit.WordCount
import org.bitcoindevkit.devkitwallet.data.ConfirmationBlock
import org.bitcoindevkit.devkitwallet.data.NewWalletConfig
Expand All @@ -35,12 +37,11 @@ import org.bitcoindevkit.devkitwallet.data.datastore.StoredWallet
import org.bitcoindevkit.devkitwallet.domain.utils.intoDomain
import org.bitcoindevkit.devkitwallet.domain.utils.intoProto
import org.bitcoindevkit.devkitwallet.presentation.viewmodels.mvi.Recipient
import java.util.UUID
import org.bitcoindevkit.Wallet as BdkWallet

private const val TAG = "Wallet"

class Wallet private constructor(
class Wallet
private constructor(
val wallet: BdkWallet,
private val walletSecrets: WalletSecrets,
private val connection: Persister,
Expand Down Expand Up @@ -161,7 +162,7 @@ class Wallet private constructor(
feeRate,
pending,
confirmationBlock,
confirmationTimestamp
confirmationTimestamp,
)
}
}
Expand Down Expand Up @@ -218,7 +219,7 @@ class Wallet private constructor(
scriptType = ActiveWalletScriptType.P2WPKH,
descriptor = descriptor.toStringWithSecret(),
changeDescriptor = changeDescriptor.toStringWithSecret(),
recoveryPhrase = mnemonic.toString()
recoveryPhrase = mnemonic.toString(),
)
// TODO: launch this correctly, not on the main thread
// Save the new wallet to the datastore
Expand All @@ -242,7 +243,7 @@ class Wallet private constructor(
walletId = walletId,
walletRepository = walletRepository,
internalAppFilesPath = internalAppFilesPath,
network = newWalletConfig.network
network = newWalletConfig.network,
)
}

Expand Down Expand Up @@ -270,7 +271,7 @@ class Wallet private constructor(
walletId = activeWallet.id,
walletRepository = walletRepository,
internalAppFilesPath = internalAppFilesPath,
network = activeWallet.network.intoDomain()
network = activeWallet.network.intoDomain(),
)
}

Expand Down Expand Up @@ -317,7 +318,7 @@ class Wallet private constructor(
scriptType = ActiveWalletScriptType.P2WPKH,
descriptor = descriptor.toStringWithSecret(),
changeDescriptor = changeDescriptor.toStringWithSecret(),
recoveryPhrase = mnemonicString
recoveryPhrase = mnemonicString,
)

// TODO: launch this correctly, not on the main thread
Expand All @@ -341,7 +342,7 @@ class Wallet private constructor(
walletId = walletId,
walletRepository = walletRepository,
internalAppFilesPath = internalAppFilesPath,
network = recoverWalletConfig.network
network = recoverWalletConfig.network,
)
}
}
Expand All @@ -356,7 +357,7 @@ fun createScriptAppropriateDescriptor(
ActiveWalletScriptType.P2WPKH -> Descriptor.newBip84(bip32ExtendedRootKey, keychain, NetworkKind.TEST)
ActiveWalletScriptType.P2TR -> Descriptor.newBip86(bip32ExtendedRootKey, keychain, NetworkKind.TEST)
ActiveWalletScriptType.UNKNOWN -> TODO()
// ActiveWalletScriptType.UNRECOGNIZED -> TODO()
// ActiveWalletScriptType.UNRECOGNIZED -> TODO()
}
}

Expand Down
12 changes: 6 additions & 6 deletions src/org/bitcoindevkit/devkitwallet/domain/WalletRepository.kt
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,12 @@ class WalletRepository(private val store: DataStore<WalletData>) {

suspend fun addWallet(wallet: StoredWallet) = store.updateData { it.copy(wallets = it.wallets + wallet) }

suspend fun setFullScanCompleted(walletId: String) =
store.updateData { data ->
data.copy(
wallets = data.wallets.map {
suspend fun setFullScanCompleted(walletId: String) = store.updateData { data ->
data.copy(
wallets =
data.wallets.map {
if (it.id == walletId) it.copy(fullScanCompleted = true) else it
}
)
}
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,6 @@ fun ActiveWalletNetwork.intoDomain(): Network {
ActiveWalletNetwork.TESTNET -> Network.TESTNET
ActiveWalletNetwork.SIGNET -> Network.SIGNET
ActiveWalletNetwork.REGTEST -> Network.REGTEST
// ActiveWalletNetwork.UNRECOGNIZED -> throw IllegalArgumentException("Unrecognized network")
// ActiveWalletNetwork.UNRECOGNIZED -> throw IllegalArgumentException("Unrecognized network")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,16 @@ import org.bitcoindevkit.devkitwallet.presentation.theme.themeSurfaceColor
import org.bitcoindevkit.devkitwallet.presentation.ui.screens.intro.OnboardingScreen

private const val TAG = "DevkitWalletActivity"
private val Context.appSettingsStore: DataStore<AppSettings> by dataStore(
fileName = "app_settings.json",
serializer = AppSettingsSerializer,
)
private val Context.walletDataStore: DataStore<WalletData> by dataStore(
fileName = "wallet_data.json",
serializer = WalletDataSerializer,
)
private val Context.appSettingsStore: DataStore<AppSettings> by
dataStore(
fileName = "app_settings.json",
serializer = AppSettingsSerializer,
)
private val Context.walletDataStore: DataStore<WalletData> by
dataStore(
fileName = "wallet_data.json",
serializer = WalletDataSerializer,
)

class DevkitWalletActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
Expand Down Expand Up @@ -112,17 +114,20 @@ class DevkitWalletActivity : ComponentActivity() {
activeWallets =
async {
walletRepository.fetchWallets()
}.await()
}
.await()

onboardingDone =
async {
appSettingsRepository.fetchIntroDone()
}.await()
}
.await()

useDarkTheme =
async {
appSettingsRepository.fetchDarkTheme()
}.await()
}
.await()

// Set the window background before allowing the UI to render for the first time,
// so the correct surface color is already in place when Compose draws its first frame.
Expand Down
Loading
Loading