The Arkade SDK is a TypeScript library for building Bitcoin wallets with support for both on-chain and off-chain transactions via the Ark protocol.
npm install @arkade-os/sdk
import { SingleKey, Wallet } from '@arkade-os/sdk'
// Create a new in-memory key (or use an external signer)
const identity = SingleKey.fromHex('your_private_key_hex')
// Create a wallet with Ark support
const wallet = await Wallet.create({
identity: identity,
// Esplora API, can be left empty mempool.space API will be used
esploraUrl: 'https://mutinynet.com/api',
arkServerUrl: 'https://mutinynet.arkade.sh',
})
// Get wallet addresses
const arkAddress = await wallet.getAddress()
const boardingAddress = await wallet.getBoardingAddress()
console.log('Ark Address:', arkAddress)
console.log('Boarding Address:', boardingAddress)
const incomingFunds = await waitForIncomingFunds(wallet)
if (incomingFunds.type === "vtxo") {
// virtual coins received
console.log("VTXOs: ", incomingFunds.vtxos)
} else if (incomingFunds.type === "utxo") {
// boarding coins received
console.log("UTXOs: ", incomingFunds.coins)
}
Onboarding allows you to swap onchain funds into VTXOs
import { Ramps } from '@arkade-os/sdk'
const onboardTxid = await new Ramps(wallet).onboard();
// Get detailed balance information
const balance = await wallet.getBalance()
console.log('Total Balance:', balance.total)
console.log('Boarding Total:', balance.boarding.total)
console.log('Offchain Available:', balance.available)
console.log('Offchain Settled:', balance.settled)
console.log('Offchain Preconfirmed:', balance.preconfirmed)
console.log('Recoverable:', balance.recoverable)
// Get virtual UTXOs (off-chain)
const virtualCoins = await wallet.getVtxos()
// Get boarding UTXOs
const boardingUtxos = await wallet.getBoardingUtxos()
// Send bitcoin via Ark
const txid = await wallet.sendBitcoin({
address: 'tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx',
amount: 50000, // in satoshis
feeRate: 1 // optional, in sats/vbyte
})
This can be used to move preconfirmed balances into finalized balances, to convert manually UTXOs and VTXOs.
// For settling transactions
const settleTxid = await wallet.settle({
inputs, // from getVtxos() or getBoardingUtxos()
outputs: [{
address: destinationAddress,
amount: BigInt(amount)
}]
})
// Get transaction history
const history = await wallet.getTransactionHistory()
console.log('History:', history)
// Example history entry:
{
key: {
boardingTxid: '...', // for boarding transactions
commitmentTxid: '...', // for commitment transactions
redeemTxid: '...' // for regular transactions
},
type: TxType.TxReceived, // or TxType.TxSent
amount: 50000,
settled: true,
createdAt: 1234567890
}
Collaborative exit or "offboarding" allows you to withdraw your virtual funds to an onchain address.
import { Ramps } from '@arkade-os/sdk'
const exitTxid = await new Ramps(wallet).offboard(onchainAddress);
Unilateral exit allows you to withdraw your funds from the Ark protocol back to the Bitcoin blockchain without requiring cooperation from the Ark server. This process involves two main steps:
import { Unroll, OnchainWallet } from '@arkade-os/sdk'
// Create an onchain wallet to pay for P2A outputs in VTXO branches
// OnchainWallet implements the AnchorBumper interface
const onchainWallet = new OnchainWallet(wallet.identity, 'regtest');
// Unroll a specific VTXO
const vtxo = { txid: 'your_vtxo_txid', vout: 0 };
const session = await Unroll.Session.create(
vtxo,
onchainWallet,
onchainWallet.provider,
wallet.indexerProvider
);
// Iterate through the unrolling steps
for await (const step of session) {
switch (step.type) {
case Unroll.StepType.WAIT:
console.log(`Waiting for transaction ${step.txid} to be confirmed`);
break;
case Unroll.StepType.UNROLL:
console.log(`Broadcasting transaction ${step.tx.id}`);
break;
case Unroll.StepType.DONE:
console.log(`Unrolling complete for VTXO ${step.vtxoTxid}`);
break;
}
}
The unrolling process works by:
Once VTXOs are fully unrolled and the unilateral exit timelock has expired, you can complete the exit:
// Complete the exit for specific VTXOs
await Unroll.completeUnroll(
wallet,
[vtxo.txid], // Array of VTXO transaction IDs to complete
onchainWallet.address // Address to receive the exit amount
);
Important Notes:
completeUnroll
method can only be called after VTXOs are fully unrolled and the timelock has expiredOnchainWallet
to pay for P2A transaction fees// service-worker.ts
import { Worker } from '@arkade-os/sdk'
// Worker handles communication between the main thread and service worker
new Worker().start()
// specify the path to the service worker file
// this will automatically register the service worker
const serviceWorker = await setupServiceWorker('/service-worker.js')
const wallet = new ServiceWorkerWallet(serviceWorker)
// Initialize the wallet
await wallet.init({
privateKey: 'your_private_key_hex',
// Esplora API, can be left empty mempool.space API will be used
esploraUrl: 'https://mutinynet.com/api',
// OPTIONAL Ark Server connection information
arkServerUrl: 'https://mutinynet.arkade.sh',
})
// check service worker status
const status = await wallet.getStatus()
console.log('Service worker status:', status.walletInitialized)
// clear wallet data stored in the service worker memory
await wallet.clear()
For complete API documentation, visit our TypeScript documentation.
pnpm install
pnpm format
pnpm lint
curl https://getnigiri.vulpem.com | bash
# Run all tests
pnpm test
# Run unit tests only
pnpm test:unit
# Run integration tests with ark provided by nigiri
nigiri start --ark
pnpm test:setup # Run setup script for integration tests
pnpm test:integration
nigiri stop --delete
# Run integration tests with ark provided by docker (requires nigiri)
nigiri start
pnpm test:up-docker
pnpm test:setup-docker # Run setup script for integration tests
pnpm test:integration-docker
pnpm test:down-docker
nigiri stop --delete
# Watch mode for development
pnpm test:watch
# Run tests with coverage
pnpm test:coverage
# Build the TS doc
pnpm docs:build
# open the docs in the browser
pnpm docs:open
# Release new version (will prompt for version patch, minor, major)
pnpm release
# You can test release process without making changes
pnpm release:dry-run
# Cleanup: checkout version commit and remove release branch
pnpm release:cleanup
MIT