Skip to content

Builder: add persistable custom-anchor transfer package #151

Description

@darioAnongba

Parent: #139
Depends on: #140

Problem

Advanced custom-anchor flows need a durable boundary between commit, external signing, optional external broadcast, publish/log, and proof handling. Callers may commit a transfer, hand the anchor transaction to an external signer or broadcaster, restart, and later need to publish/log or recover proof metadata from the committed state.

The ADR defines this boundary as a persistable committed transfer package. This package should make the post-commit lifecycle explicit instead of relying on in-memory builder state.

Scope

  • Define SDK-owned DTOs for a committed custom-anchor transfer package.
  • Include committed anchor PSBT bytes, active virtual PSBT bytes, passive virtual PSBT bytes, change output index, locked UTXO metadata, input summaries, output summaries, proof update metadata, and publish/log metadata required for retry.
  • Define which fields callers must persist before external signing or external broadcast.
  • Define immutable plan/package lifecycle semantics: build returns an immutable plan, commit consumes a plan and returns a committed package, publish/log consumes a committed package plus final anchor PSBT bytes.
  • Support retrying publish/log from the package after process restart when the backend operation is idempotent or exposes a duplicate-safe result.
  • Ensure the package does not expose taprpc, taproot-assets, btcd PSBT structs, or other implementation types in public signatures.

Acceptance criteria

  • The advanced builder returns a committed transfer package after commit.
  • The package can be serialized or converted into host-owned storage DTOs without implementation types.
  • Publish/log can be driven from a persisted package plus final anchor PSBT bytes.
  • Pre-publish validation checks the final anchor PSBT against the committed package before calling the backend.
  • Tests cover restart-style reconstruction from the committed package and retry behavior for publish/log failures where practical.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    Status
    ✅ Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions