Skip to main content

Use this prompt to get started quickly.

Open in Cursor
These examples connect to signet so you can test for free. To go live, point the same configuration at Second’s mainnet endpoints from Test on mainnet and select the mainnet network.

Prerequisites

  • Android: API 24+ (Android 7.0), Kotlin 1.9+
  • JVM: OpenJDK 17+, Kotlin 1.9+

Getting started

1

Install the SDK

Add the GitLab Maven registry and the Bark dependency to your Gradle project.
In your root settings.gradle.kts:
dependencyResolutionManagement {
  repositories {
    google()
    mavenCentral()
    maven { url = uri("https://gitlab.com/api/v4/projects/78057981/packages/maven") }
  }
}
In your module build.gradle.kts:
dependencies {
  // The bindings pull in the desktop JNA jar; Android needs the @aar
  // variant, which bundles the native libraries.
  implementation("tech.second.bark:bark-android:0.9.0+bark.0.2.4") {
    exclude(group = "net.java.dev.jna", module = "jna")
  }
  implementation("net.java.dev.jna:jna:5.18.1@aar")
}
In the same file, inside the android {} block:
packaging {
  // Extract native libs from the APK so JNA can load them
  jniLibs.useLegacyPackaging = true
}
Without the JNA @aar swap and useLegacyPackaging, the app builds but crashes at runtime with UnsatisfiedLinkError when the wallet first loads.
2

Create a wallet

Generate a BIP39 mnemonic, configure the wallet for signet, and initialize it.
import uniffi.bark.*
import kotlinx.coroutines.runBlocking
import java.nio.file.Paths

fun main() = runBlocking {
    // Generate a new mnemonic
    val mnemonic = generateMnemonic()
    println("Mnemonic: $mnemonic")

    // Configure for signet
    val config = Config(
        serverAddress = "https://ark.signet.2nd.dev",
        serverAccessToken = null,
        esploraAddress = "https://esplora.signet.2nd.dev",
        bitcoindAddress = null,
        bitcoindCookiefile = null,
        bitcoindUser = null,
        bitcoindPass = null,
        network = Network.SIGNET,
        vtxoRefreshExpiryThreshold = null,
        vtxoExitMargin = null,
        htlcRecvClaimDelta = null,
        fallbackFeeRate = null,
        roundTxRequiredConfirmations = null,
        daemonSyncIntervalSecs = null,
        offboardRequiredConfirmations = null,
        daemonManualSync = null,
        lightningReceiveClaimRetries = null
    )

    // Create a data directory
    val dataDir = Paths.get(
        System.getProperty("user.home"), ".bark", "my_wallet"
    )
    java.io.File(dataDir.toString()).mkdirs()

    // Create the wallet
    val wallet = Wallet.create(
        mnemonic = mnemonic,
        config = config,
        datadir = dataDir.toString(),
        forceRescan = false
    )
}
Back up the mnemonic securely, and back up wallet data continuously. Both are required to restore a wallet.
On Android, wallet operations are suspend functions. Call them from a coroutine (e.g. withContext(Dispatchers.IO)) to keep the main thread free.
3

Get a receiving address

Generate an Ark address to receive bitcoin.
// Inside a coroutine (e.g. runBlocking, or withContext on Android)
val address = wallet.newAddress()
println("Ark address: $address")
Send some signet sats to this address using the faucet.
4

Check your balance

Sync the wallet with the Ark server and read your balance.
// Inside a coroutine
wallet.sync()

val balance = wallet.balance()
println("Spendable: ${balance.spendableSats} sats")

Next steps

https://mintcdn.com/second-0659a37d/IZIYL7kfKRS394NE/images/gitlab-icon-outline.svg?fit=max&auto=format&n=IZIYL7kfKRS394NE&q=85&s=31497d40e3e7174b42f13799a0b33eb5

Source and examples

Full Kotlin source and example projects on GitLab.

How Ark works

Learn about the protocol powering your wallet.