Animica Pay docs 2.00% per successful payment

Money

The splitting limitation

Why there is no atomic 98/2 transaction on this chain, and what we do instead.

This page exists so you learn this from the documentation instead of from a surprise.

The limitation #

For completeness, the payload shapes that produce that conclusion:

KindPayloadCarries value
TRANSFER (0){to, amount, data}yes
DEPLOY (1){code, manifest}no
CALL (2){to, data}no amount field at all

Two related constraints rule out the usual workarounds:

We do not claim atomicity we do not have.

What we do instead #

The customer makes one TRANSFER, with the reference in data. Then:

1. The accounting split is exact and immediate #

At confirmation, the split is exact in accounting, booked once at confirmation in a double-entry ledger whose entries must sum to zero or the booking is refused:

text
D payments_received:<merchant>        gross
C merchant_payable:<merchant>         merchant_amount
C treasury_fee_income:<treasury>      protocol_fee

The intent stores gross, merchant_amount, protocol_fee, the fee_bps and the treasury_address that applied. The split is a committed fact per payment from the moment it confirms, whatever the coins are doing.

2. Merchant-direct with a merchant-signed fee sweep — the default #

Merchant-direct with a merchant-signed fee sweep is the default and it is fully non-custodial. The payment address is your own payout address, so 100% of the gross lands with you and never touches an Animica Pay key. The 2% becomes a fee you owe, tracked as a receivable:

text
D merchant_fee_receivable:<merchant>  protocol_fee
C merchant_payable:<merchant>         protocol_fee    (you really did receive the gross)

Periodically you sign one transfer of the accrued fee to the treasury. The debt is discharged only when that sweep has a successful receipt — inclusion is not execution here either.

3. Forwarding address — opt-in #

Forwarding address is opt-in and clearly labelled. A per-merchant forwarding key held by the platform receives the payment and then emits two transfers: 98% to you, 2% to the treasury. This is atomic in accounting but not on chain, and it is custodial for the seconds between receiving and forwarding. Choose it only if hands-off fee handling is worth that window to you. It is never the default and it is never enabled silently.

Comparison #

Merchant-direct (default)Forwarding (opt-in)
Who holds your moneyonly youplatform, briefly
Custody risknonenon-zero, seconds
Fee collectionyou sign a sweepautomatic
On-chain transactions1 payment + 1 periodic sweep1 payment + 2 forwards
Accounting splitexact, at confirmationexact, at confirmation
Atomic on chainnono

Notice the last row. Neither mode is atomic on chain, because nothing on this chain can be. The difference is who holds the coins in between.

What changes if the chain gains value-carrying calls #

If the chain gains value-carrying calls — a CALL with an amount, or a top-level value in the transaction envelope — then a splitter contract becomes possible and we intend to offer it as a third settlement mode:

Until that exists on mainnet, this page describes the whole truth. If you see a payments product on this chain advertising atomic on-chain splitting today, ask which transaction kind carries the value.

Consequences you can act on #

  1. Reconcile against the ledger, not against your wallet balance. In merchant-direct mode your address receives the gross, so your wallet will show 100% of every payment and the 2% you owe will not be visible there.
  2. Sweep on a schedule. Treat it like a supplier invoice. The balance endpoint reports protocol_fee_owed exactly.
  3. Do not build the fee into a display price twice. The customer pays the gross; the fee comes out of your side of that same gross.
  4. If you cannot sign regularly, take the forwarding option knowingly, having read the custody window above.

The arithmetic of the 2% itself, with exact numbers, is on The 2% fee. How settlement is detected and confirmed is on Core concepts.