Arkd settlement intents coordinate batch swaps and VTXO renewal. They are
distinct from Arkade Intents, the
application-level payment and exchange protocol.
Intent Structure
The intent schema expresses what is being spent and where it goes. Its top-level fields include theReceiver format (onchain address or offchain
public key) and the IntentMessage execution parameters and validity window.
Intent structure
Intent structure
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(viaReceivers). Either:- onchain (via
OnchainAddress) - offchain (via
PubKeyto create new VTXOs)
- onchain (via
- Contains a
Proofof ownership of those funds via a BIP322 signature - Contains a
Message(BIP322 message) with intent details
Receiver Structure
Receiver Structure
Receivers is defined via an Amount, an OnchainAddress, and a PubKey. At least one of OnchainAddress and PubKey must be present at submission. They construct Arkade transaction outputs or direct onchain payments. IntentMessage Format
IntentMessage Format
IntentMessage contains intent details in JSON structure:- The
Typeindicates if the intent is for renewal or ownership proof to delete another OnchainOutputIndexes: Indicates which outputs become onchain outputs; the others become virtual outputsValidAt: Time (seconds) when the intent becomes valid; 0 = valid right awayExpireAt: Time (seconds) when the intent expires; 0 = no expiryCosignersPublicKeys: Public keys signing the virtual transaction tree; typically one, but can be more to support flexible user needs
Intent Lifecycle
The batch swap lifecycle, coordinated over theGetEventStream RPC:
Create a BIP322 Signature
Intents use BIP322 message signing protocol for proving ownership of coins.
Source: TS-SDKThe
Code example: BIP322 signature implementation from the TS-SDK
Code example: BIP322 signature implementation from the TS-SDK
create function takes a string message for the associated Register
or Delete action.Register an Intent
The core of intent registration is the
Source: Typescript SDKThe server then responds with a
RegisterIntentRequest which contains a Bip322Signature field and an intent message:Code example: RegisterIntentRequest
Code example: RegisterIntentRequest
Intent message format
Intent message format
The intent message structure includes:
InputTapTrees- Taproot trees for spent inputsOnchainOutputIndexes- Which outputs should be considered onchainValidAt/ExpireAt- Timestamp validity windowsCosignersPublicKeys- Required for offchain outputs
Messages are JSON string encoded with a static format, making the order of the fields relevant
Example: intent message
Example: intent message
RegisterIntentResponse containing an intent_id string for tracking.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.Delete Intent
The
Source: Typescript SDK
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.Code example: delete from Typescript SDK
Code example: delete from Typescript SDK
Recovery Mechanisms
The operator request system provides additional options for edge cases like recoverable virtual outputs:- Expired virtual outputs: recover unspent and swept outputs (
recoverVtxos) - Sub-dust virtual outputs: amounts below the Bitcoin dust threshold