Skip to main content
Arkd settlement intents coordinate batch swaps and VTXO renewal. They are distinct from Arkade Intents, the application-level payment and exchange protocol.
When a user wants to settle funds onchain through a batch swap, they submit a settlement intent to the operator. Settlement intents are valid-but-unmineable Bitcoin transactions that encode an ownership proof of the inputs a user wants to redeem - whether it’s offchain VTXOs, an onchain UTXO or recoverable VTXOs (i.e. expired outputs) - and define the outputs they wish to receive. Settlement intents are based on BIP322, a standardized Bitcoin message signing protocol. The system was introduced with the v0.7.0 arkd release.
The usage of BIP322 enables users to choose between renewing their expiring offchain funds themselves or delegating the renewal of such VTXOs. The delegated intent workflow can be found under Settlement Intent Delegation

Intent Structure

The intent schema expresses what is being spent and where it goes. Its top-level fields include the Receiver format (onchain address or offchain public key) and the IntentMessage execution parameters and validity window.
The Intent domain is a user-submitted presigned Bitcoin transaction that:
  • Contains an IntentId (UUID)
  • Specifies the Inputs (VTXOs, UTXOs, or expired coins)
  • Specifies the Outputs (via Receivers). Either:
    • onchain (via OnchainAddress)
    • offchain (via PubKey to create new VTXOs)
  • Contains a Proof of ownership of those funds via a BIP322 signature
  • Contains a Message (BIP322 message) with intent details
Receivers is defined via an Amount, an OnchainAddress and a PubKey (of which at least one must be present during Intent submission. Those are used to construct Arkade transaction outputs or direct onchain payments. 
IntentMessage contains intent details in JSON structure:
  • The Type indicates if the intent is for renewal or ownership proof to delete another
  • InputTapTrees is the revealed Taproot tree of all inputs of the intent. Revelation occurs like witness data in Bitcoin
  • OnchainOutputIndexes: Indicates which outputs become UTXOs; others are VTXOs
  • ValidAt: Time (seconds) when the intent becomes valid; 0 = valid right away
  • ExpireAt: Time (seconds) when the intent expires; 0 = no expiry
  • CosignersPublicKeys: Public keys signing the VTXO tree; typically one, but can be more to support flexible user needs

Intent Lifecycle 

The Arkade event stream (GetEventStream) is a server-side streaming RPC method in the ArkService that provides real-time batch processing coordination events to clients including batch start, finalization, and failure notifications. The server uses this stream to indicate the next required action and corresponding API call. The full Intent lifecycle is as follows:
1

Create a BIP322 Signature

Intents use BIP322 message signing protocol for proving ownership of coins.
Source: TS-SDK
The create function takes a string message for the associated Register or Delete action.
2

Register an Intent

The core of intent registration is the RegisterIntentRequest which contains a Bip322Signature field and an intent message:
The intent message structure includes:
  • InputTapTrees - Taproot trees for spent inputs
  • OnchainOutputIndexes - Which outputs should be considered onchain
  • ValidAt/ExpireAt - Timestamp validity windows
  • CosignersPublicKeys - Required for offchain outputs
Messages are JSON string encoded with a static format, making the order of the fields relevant
Source: Typescript SDK
The server then responds with a RegisterIntentResponse containing an intent_id string for tracking.
3

Confirm Registration

After receiving a BatchStartedEvent containing their intent ID hash, clients must call ConfirmRegistration with a ConfirmRegistrationRequest containing the intent_id to confirm participation. The server responds with an empty ConfirmRegistrationResponse.
4

Delete Intent

The DeleteIntent method accepts a DeleteIntentRequest with a Bip322Signature proof that demonstrates ownership of any input VTXOs from the original intent. The server responds with an empty DeleteIntentResponse upon successful deletion.
Source: Typescript SDK

Recovery Mechanisms

The intent system provides additional options for edge cases like recoverable VTXOs:
  • Expired VTXOs: Recover unspent and swept VTXOs (recoverVtxos)
  • Sub-dust VTXOs: Amounts below the Bitcoin dust threshold (SubDustScript)