Skip to main content

Transaction outputs and script paths

Arkade transactions are Bitcoin transactions that consume and create outputs with special Taproot spending paths. They have two key features differentiating them from conventional Bitcoin transactions:
  • Cooperative execution - The operator verifies and co-signs eligible paths.
  • Extended programmability - Spending paths can utilize custom opcodes that enable features such as transaction introspection and advanced arithmetic.
  • Immediate spending - Resulting outputs can fund subsequent Arkade transactions without onchain block confirmation.
Learn more about Arkade outputs, batch outputs, and transaction paths

Script compatibility and path rules

Arkade applies Bitcoin Script semantics to output spending paths during cooperative execution. Published Bitcoin paths remain subject to Bitcoin consensus. There are two types of spending paths:
  • Collaborative paths (offchain, instant) must include the server pubkey so the operator can co-sign.
  • Unilateral paths (onchain, timelocked) must include a CSV exit delay using or exceeding the value from getInfo(). The operator’s signature is not required.
CSV (relative timelocks) can only be used for unilateral exit paths. For collaborative paths, you MUST use CLTV (absolute timelocks).

Timelocks

The SDK provides helpers for common patterns:

Input/output structure

Inputs specify which output and spending path:
Outputs specify destinations:

Two-phase transaction flow

Arkade uses a two-phase protocol for virtual (offchain) transactions:
  1. SubmitTx - Client submits signed transaction + unsigned checkpoints → operator validates, co-signs, and returns partially signed checkpoints
  2. FinalizeTx - Client completes checkpoint signatures → Transaction receives preconfirmation status
Deep dive into the offchain execution workflow

PSBTs and the Transaction class

You can craft a classic PSBT using @scure/btc-signer. When decoding Arkade PSBTs, pass { allowUnknown: true } to preserve Arkade-specific fields:
We strongly recommend using the SDK’s Transaction class instead. It matches @scure/btc-signer 1:1, so the same API calls (and { allowUnknown: true }) work:

Next steps

Lightning

Integrate Lightning payments via Arkade intents

Spilman channels

Build payment channels

Experimental contracts

Advanced contract patterns

API reference

Full SDK documentation