open-standards/openpay/crates
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Transaction Science 9c04dca002 op-rails-x402: auth-capture and batch-settlement, and an honest account of where the wire stands
The rail refused two of the wire's four schemes. Both are implemented.

**`auth-capture`.** Under `escrow` the client's settle places a hold before the
work, and the server finalizes afterwards with a payload it authors itself,
naming the operation as `payload.type`: a capture of what the work cost, or a
void when it cost nothing. `accept` walks that, and refuses a capture over the
hold before it is relayed. Later operations go through the same `/settle`, so
`lifecycle_payload` builds them around the network binding's own fields — the
facilitator is handed the payment rather than left to reconstruct it.

`AuthCapturePayment` is the server's book of one payment: held, captured,
refunded, and the two deadlines. The escrow enforces these on chain, so the
book is not where safety comes from. It is where a doomed operation is refused
*before* it costs a failed settle and, for an asynchronous server, a payment
its own records misdescribe: a capture over the hold or past the capture
deadline, a void with nothing left to release, a refund over what was captured
and not yet refunded or past the refund deadline, a fee outside the bounds the
client authorized. A requirement with no capture deadline is refused rather
than booked — a hold that can never be reclaimed is not one to place.

**`batch-settlement`.** The commitment is verified, the work runs, and the
charge is stored rather than moved, so the result carries an empty
`transaction` and reports the request's price in `extra.chargedAmount`. That is
success, not a missing hash. The charge is bounded where it is reported, since
under this scheme there is no transfer to fail instead.

The settle-time amount rule is now one type, `MeteredCharge`, for every scheme
whose settled figure may differ from the authorized one; `UptoCharge` stays as
its name for the `upto` case.

And the capability document is corrected. It claimed partial settlement as
ground the wire did not cover. The wire's reservation lifecycle is as complete
as ours, and the document now says so and maps all three metered schemes onto
it. What that narrows our contribution there to is exactly two things, stated
without decoration: nothing on that wire bounds the energy the paid work burns,
and none of the three schemes carries a measurement — the figure the buyer pays
is a number the seller produced, bounded above and otherwise unexplained.

Co-Authored-By: Claude <[email protected]>
2026-11-10 15:24:37 -05:00
..
op-3ds2 Cargo: no minimum-supported-version floor, because the policy is latest stable 2026-11-03 17:42:20 -05:00
op-agentic op-agentic: the checkout commitment was self-referential, and withholding the open mandate shed its limits 2026-11-10 15:00:18 -05:00
op-batch Cargo: no minimum-supported-version floor, because the policy is latest stable 2026-11-03 17:42:20 -05:00
op-bin Cargo: no minimum-supported-version floor, because the policy is latest stable 2026-11-03 17:42:20 -05:00
op-bnpl Cargo: no minimum-supported-version floor, because the policy is latest stable 2026-11-03 17:42:20 -05:00
op-cli Cargo: no minimum-supported-version floor, because the policy is latest stable 2026-11-03 17:42:20 -05:00
op-connect clippy 1.99: two findings the comparison missed, and one it could not have seen 2026-11-03 17:42:20 -05:00
op-core Cargo: no minimum-supported-version floor, because the policy is latest stable 2026-11-03 17:42:20 -05:00
op-crypto-extra clippy 1.99: fix what Rust 1.99.1's clippy newly reports, before the pin moves 2026-11-03 17:42:20 -05:00
op-dispute Cargo: no minimum-supported-version floor, because the policy is latest stable 2026-11-03 17:42:20 -05:00
op-dispute-evidence Cargo: no minimum-supported-version floor, because the policy is latest stable 2026-11-03 17:42:20 -05:00
op-driver-sdk Cargo: no minimum-supported-version floor, because the policy is latest stable 2026-11-03 17:42:20 -05:00
op-emv clippy 1.99: fix what Rust 1.99.1's clippy newly reports, before the pin moves 2026-11-03 17:42:20 -05:00
op-ewallets-asia Cargo: no minimum-supported-version floor, because the policy is latest stable 2026-11-03 17:42:20 -05:00
op-ffi-jni Cargo: no minimum-supported-version floor, because the policy is latest stable 2026-11-03 17:42:20 -05:00
op-ffi-swift Cargo: no minimum-supported-version floor, because the policy is latest stable 2026-11-03 17:42:20 -05:00
op-fraud Cargo: no minimum-supported-version floor, because the policy is latest stable 2026-11-03 17:42:20 -05:00
op-fraud-graph Cargo: no minimum-supported-version floor, because the policy is latest stable 2026-11-03 17:42:20 -05:00
op-fx Cargo: no minimum-supported-version floor, because the policy is latest stable 2026-11-03 17:42:20 -05:00
op-graph openpay: record each payment, keep the payer's mandate, bound refunds by it 2026-11-08 23:48:16 -05:00
op-iso8583 Cargo: no minimum-supported-version floor, because the policy is latest stable 2026-11-03 17:42:20 -05:00
op-iso20022 clippy 1.99: fix what Rust 1.99.1's clippy newly reports, before the pin moves 2026-11-03 17:42:20 -05:00
op-ledger Cargo: no minimum-supported-version floor, because the policy is latest stable 2026-11-03 17:42:20 -05:00
op-mobile-wallets Cargo: no minimum-supported-version floor, because the policy is latest stable 2026-11-03 17:42:20 -05:00
op-openbanking Cargo: no minimum-supported-version floor, because the policy is latest stable 2026-11-03 17:42:20 -05:00
op-orchestrator Cargo: no minimum-supported-version floor, because the policy is latest stable 2026-11-03 17:42:20 -05:00
op-payouts Cargo: no minimum-supported-version floor, because the policy is latest stable 2026-11-03 17:42:20 -05:00
op-rails-a2a Cargo: no minimum-supported-version floor, because the policy is latest stable 2026-11-03 17:42:20 -05:00
op-rails-card Cargo: no minimum-supported-version floor, because the policy is latest stable 2026-11-03 17:42:20 -05:00
op-rails-crypto Cargo: no minimum-supported-version floor, because the policy is latest stable 2026-11-03 17:42:20 -05:00
op-rails-x402 op-rails-x402: auth-capture and batch-settlement, and an honest account of where the wire stands 2026-11-10 15:24:37 -05:00
op-reconciliation clippy 1.99: fix what Rust 1.99.1's clippy newly reports, before the pin moves 2026-11-03 17:42:20 -05:00
op-refund Cargo: no minimum-supported-version floor, because the policy is latest stable 2026-11-03 17:42:20 -05:00
op-revrec Cargo: no minimum-supported-version floor, because the policy is latest stable 2026-11-03 17:42:20 -05:00
op-routing clippy 1.99: fix what Rust 1.99.1's clippy newly reports, before the pin moves 2026-11-03 17:42:20 -05:00
op-screening clippy 1.99: fix what Rust 1.99.1's clippy newly reports, before the pin moves 2026-11-03 17:42:20 -05:00
op-server openpay: record each payment, keep the payer's mandate, bound refunds by it 2026-11-08 23:48:16 -05:00
op-settlement clippy 1.99: fix what Rust 1.99.1's clippy newly reports, before the pin moves 2026-11-03 17:42:20 -05:00
op-statements Cargo: no minimum-supported-version floor, because the policy is latest stable 2026-11-03 17:42:20 -05:00
op-subscriptions Cargo: no minimum-supported-version floor, because the policy is latest stable 2026-11-03 17:42:20 -05:00
op-tax clippy 1.99: fix what Rust 1.99.1's clippy newly reports, before the pin moves 2026-11-03 17:42:20 -05:00
op-vault Cargo: no minimum-supported-version floor, because the policy is latest stable 2026-11-03 17:42:20 -05:00
op-wasm Cargo: no minimum-supported-version floor, because the policy is latest stable 2026-11-03 17:42:20 -05:00
op-webhook Cargo: no minimum-supported-version floor, because the policy is latest stable 2026-11-03 17:42:20 -05:00