Skip to content

Sale PSBT Construction

ORD.NET sale transactions are snipe protected and fully self custodial.

To achieve this, ORD.NET assigns anchor UTXOs to every listing and sale, built around a seller-controlled 2-of-2 passthrough output shared between the seller and ORD.NET.

When a seller lists an inscription for sale, ORD.NET collects three PSBT signatures from the seller:

  • TX1 moves the inscription from the seller wallet into the 2-of-2 passthrough output.
  • TX2 spends the passthrough output as part of the sale transaction.
  • TX3 is a presigned recovery transaction that spends the passthrough output back to the seller.

The seller signs TX2 with SIGHASH_SINGLE | SIGHASH_ANYONECANPAY, which locks in the seller payment and the exact amount they will receive. That payment cannot be changed without invalidating the signature.

This is similar to how inscription sale PSBTs have worked historically. The difference is that ORD.NET also signs the inscription input with SIGHASH_DEFAULT, which commits to the full sale transaction. That locks in the remaining inputs and outputs, preventing the seller signature from being reused in a different transaction and blocking mempool RBF sniping.

Neither buyer nor seller has to trust ORD.NET with custody or pricing. The seller’s signature enforces the payment amount, and ORD.NET’s signature enforces the finality of the sale transaction.

If the buyer cancels the sale transaction while it’s pending, ORD.NET automatically RBFs TX1 by spending the anchor UTXO assigned to the listing, invalidating the transfer before the inscription moves into the passthrough output.

TX3 exists to make recovery easy in the unlikely event that the inscription moves into the 2-of-2 passthrough output without an attached sale.

When a buyer purchases an inscription, ORD.NET constructs the sale transaction using the inscription output from the seller’s TX1.

The sale transaction must include the intended seller payment so that it satisfies the seller’s SIGHASH_SINGLE | SIGHASH_ANYONECANPAY signature conditions.

ORD.NET signs the inscription input with SIGHASH_DEFAULT, committing to the complete transaction. This means the seller payment, buyer inputs, buyer outputs, and sale structure are all fixed before broadcast.

Example sale transaction.

TX1 — listing transaction:

Inputs and outputs for the ORD.NET listing transaction

TX2 — sale transaction:

Inputs and outputs for an example ORD.NET sale transaction on mempool.space

The buyer only signs the final sale transaction. As a result, the buyer can purchase one inscription or sweep multiple inscriptions with a single transaction signature flow.

The marketplace fee output is split into two to land the inscription at the correct sat offset for the buyer. The sale transaction also creates the same number of new anchor UTXOs as it consumes.

ORD.NET includes anchor UTXOs in the seller’s TX1 so the inscription can move from the seller wallet into the 2-of-2 passthrough output at the minimum mempool relay fee rate of 0.1 sat/vB.

The change output from TX1, plus an additional anchor UTXO in the sale transaction, act as bump UTXOs. This removes any buyer wallet preparation step, since the buyer doesn’t need to provide bump UTXOs.

The taproot descriptor for the passthrough output:

tr(
<seller_pubkey>,
multi_a(2, <seller_pubkey>, <ordnet_pubkey>)
)

ORD.NET public key:

d2dc3222298e2a5f4e1c7d702fae2bcf7821cc0a095a478b95c62195b0df7398

Key path spend: the seller can unilaterally spend the output through the taproot key path using the seller public key.

Script path spend: the intended sale path is the taproot script path. This requires signatures from both the seller and ORD.NET. This is the coordinated sale path used when a buyer purchases the inscription.