skills/noa-cli/SKILL.md
CLI reference for noa and Ark Indexer REST API — tools for decoding and inspecting Bitcoin/Ark primitives. Use when working with Ark addresses, Bitcoin scripts, taproot trees, PSBTs, note closures, VTXOs, commitment txs, forfeit txs, or connector trees. Covers all noa subcommands (address, script, note, taptree, psbt) and Indexer endpoints (GetCommitmentTx, GetVtxos, GetVtxoTree, GetVtxoChain, GetVirtualTxs, etc.). Includes a step-by-step recipe for investigating any VTXO from an outpoint.
npx skillsauth add arklabshq/arkadian noa-cliInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Ark companion CLI for decoding and inspecting Bitcoin/Ark primitives.
Source: ~/code/go/noa | Module: github.com/louisinger/noa
Depends on: github.com/arkade-os/arkd/pkg/ark-lib
go install github.com/louisinger/noa@latest
# or from source
make -C ~/code/go/noa install
noa address <ark_address>
Output: version, HRP, signer pubkey, VTXO tapkey, pkScript (hex + asm).
Uses arklib.DecodeAddressV0.
noa script <script_hex>
Output: ASM disassembly, then closure type and fields. Recognized closure types:
MultisigClosure — pubkeys listCLTVMultisigClosure — pubkeys + absolute locktime (blocks or seconds)CSVMultisigClosure — pubkeys + relative locktime (blocks or seconds)ConditionMultisigClosure — pubkeys + condition scriptConditionCSVMultisigClosure — pubkeys + relative locktime + condition scriptnoa note fromTxid <txid_hex>
Takes a 32-byte txid as preimage hash, creates a NoteClosure, derives the taproot tapkey and pkScript.
Output: tapkey (hex), script (hex + asm).
noa taptree decode <taptree_hex>
Decodes via txutils.DecodeTapTree. Output: all leaf scripts (hex + asm), then the derived pkScript (hex + asm).
noa taptree encode <script1_hex> [script2_hex] ...
Takes one or more hex-encoded scripts, encodes into a taptree via txutils.TapTree.Encode().
Output: encoded taptree (hex).
noa psbt decode <psbt_base64_or_hex>
Auto-detects base64 vs hex input. Output:
ConditionWitness — witness stack itemsCosignerPublicKey — index + schnorr pubkeyVtxoTaprootTree — list of script hex stringsVtxoTreeExpiry — relative locktime type + valueAll hex inputs are raw hex strings (no 0x prefix). PSBT accepts both base64 and hex.
noa script expects raw tapscript leaf scripts (closure scripts), NOT P2TR pkScripts.
Base URL: http://localhost:7070 (default, adjust per environment).
All GET endpoints. Responses are JSON. Pagination via ?page.size=N&page.index=I.
Commitment TX
GET /v1/indexer/commitmentTx/{txid} — round info: batches, input/output counts, amounts, timestampsGET /v1/indexer/commitmentTx/{txid}/forfeitTxs — forfeit txids for a commitmentGET /v1/indexer/commitmentTx/{txid}/connectors — connector tree nodes (txid + children map)Batch / VTXO Tree
GET /v1/indexer/batch/{txid}/{vout}/tree — full VTXO tree structure (nodes with children)GET /v1/indexer/batch/{txid}/{vout}/tree/leaves — leaf outpoints onlyGET /v1/indexer/batch/{txid}/{vout}/sweepTxs — on-chain txids that swept this batchVTXOs
GET /v1/indexer/vtxos?outpoints={txid}:{vout} — lookup by outpointGET /v1/indexer/vtxos?scripts={script_hex} — lookup by pkScriptspendable_only, spent_only, recoverable_only, pending_only, after, beforeVTXO Chain
GET /v1/indexer/vtxo/{txid}/{vout}/chain — chain of ark txs from tree leaf to this VTXOtxid, expiresAt, type (COMMITMENT/ARK/TREE/CHECKPOINT), spendsVirtual Transactions
GET /v1/indexer/virtualTx/{txid} — returns PSBT in base64 (feed directly to noa psbt decode)Assets
GET /v1/indexer/asset/{asset_id} — asset info (supply, metadata, control_asset)IndexerVtxo: outpoint, createdAt, expiresAt, amount, script (pkScript hex), isPreconfirmed, isSwept, isUnrolled, isSpent, spentBy, commitmentTxids, settledBy, arkTxid, assets
IndexerChain: txid, expiresAt, type (COMMITMENT|ARK|TREE|CHECKPOINT), spends (parent txids)
Given a {txid}:{vout}:
curl -s "http://localhost:7070/v1/indexer/vtxos?outpoints={txid}:{vout}" | jq
Note: amount, script, status flags (isSpent, isSwept, isUnrolled), commitmentTxids.
curl -s "http://localhost:7070/v1/indexer/vtxo/{txid}/{vout}/chain" | jq
Shows the chain from commitment → tree → ark txs. Identify the commitment txid (type=COMMITMENT).
curl -s "http://localhost:7070/v1/indexer/commitmentTx/{commitment_txid}" | jq
Shows batches, total input/output amounts and VTXO counts, timestamps, swept status.
VTXO_PSBT=$(curl -s "http://localhost:7070/v1/indexer/virtualTx/{txid}" | jq -r '.txs[0]')
noa psbt decode "$VTXO_PSBT"
Look for: cosigner pubkeys, VTXO tree expiry, output values and pkScripts.
Connectors:
curl -s "http://localhost:7070/v1/indexer/commitmentTx/{commitment_txid}/connectors" | jq
CONN_PSBT=$(curl -s "http://localhost:7070/v1/indexer/virtualTx/{connector_txid}" | jq -r '.txs[0]')
noa psbt decode "$CONN_PSBT"
Forfeits:
curl -s "http://localhost:7070/v1/indexer/commitmentTx/{commitment_txid}/forfeitTxs" | jq
FORFEIT_PSBT=$(curl -s "http://localhost:7070/v1/indexer/virtualTx/{forfeit_txid}" | jq -r '.txs[0]')
noa psbt decode "$FORFEIT_PSBT"
Forfeit tx structure: input[0] = VTXO, input[1] = connector dust → single ASP sweep output.
Sweep (if swept):
curl -s "http://localhost:7070/v1/indexer/batch/{commitment_txid}/{batch_vout}/sweepTxs" | jq
Extract pkScript hex from noa psbt decode output, then if it's a tapscript leaf (not P2TR):
noa script <closure_script_hex>
Note: noa script decodes Ark closure scripts (MultisigClosure, CSV, CLTV, Condition variants). It does NOT decode P2TR output scripts — those are just OP_1 <tapkey>.
noa address <ark_addr> → get tapkey and pkScriptnoa script <hex> → identify closure type and keysnoa note fromTxid <txid> → compare derived tapkey against on-chain outputnoa taptree decode <hex> → see all leaf scripts and derived pkScriptnoa psbt decode <base64> → inspect Ark PSBT fields (cosigner keys, VTXO trees, expiries)documentation
Update project documentation based on new commits and changes in the repository. Use when: user wants to sync docs after project changes.
testing
Remove a project from the Arkadian documentation registry and delete all associated documentation files. Use when: user wants to deregister a project.
tools
RESTRICTED to ark-project-manager. Generate actionable, dependency-ordered task lists organized by user story.
testing
RESTRICTED to ark-project-manager. Create or update feature specifications from natural language descriptions.