Payment Pools

aka Coinpools, Joinpools


Payment Pools, Joinpools or Coinpools are constructions that allows multiple users to trustlessly share ownership of one or more UTXOs. When funds are spent, it’s not possible to tell from the block chain which pool member (or members) spent the funds.

Like being written by Jeremy Rubin,

Mechanistically, all that is required of a Payment Pool is that:

  • It’s a single (shared) UTXO
  • Every user can get their funds out unilaterally
  • A set of users can authorize spend the funds
  • Unspent funds/change stays in the pool


Some form of payment pools, Joinpools, are possible today as they use pre-signed transactions to ensure that each participant in the pool gets their money back. However, they suffer from the problem that any participant not cooperating requires breaking up the pool into pieces.

Using CTV a slight improvement on this idea is possible, reducing some of the need for interactivity and reducing the number of pieces a pool is broken up into from N to log(N) where N is the number of participants.

Robust Payment Pools

In the context of covenants, designs have been made for payment pools that don't suffer this "break-up problem" when a participant disappears. In these designs, every user that is not cooperating can be pushed out of the pool without breaking up the pool further than needed. This means that the remaining active users can continue operations after the non-cooperative participant has been exited.

Designs like this are proposed using the more expressive proposals like TLUV, MATT and CATT.

CoinPool design:

CoinPools are an implementation of the "robust payment pools" idea, as described in the bitcoin-dev mailing list post by Antoine Riard:

A Split_Tx enables a unilateral exit from the CoinPool, in case it's not possible to use a cooperative Pool_Tx path. This transaction spends the UTXO via the Merkle branch into two outputs:

  • a withdraw output paying to the pool participant who initiated a transaction
  • a recursive output paying to the new instance of a CoinPool, which contains all the same participants except the one who just withdrew

Edit this page on GitHub