Finality
1 · Distinguish settlement from finality.
1 · Distinguish settlement from finality.
2 · How many confirmations should you wait for?
2 · How many confirmations should you wait for?
3 · Which settles faster, Polygon or Ethereum?
3 · Which settles faster, Polygon or Ethereum?
block_time × confirmations, and those two are inversely related by design. Chains with fast, cheap blocks make each block less expensive to orphan, so they need more of them for equivalent confidence.Follow-up: what is the fastest in your set? Solana at ~13s (400ms × 32), then Base at 20s. Base and Polygon have identical block times and a 12× difference in settlement window, which is the cleanest demonstration that block time alone tells you nothing. The scenario.Failure modes
4 · A transaction failed. A transaction was dropped. Why does the difference matter?
4 · A transaction failed. A transaction was dropped. Why does the difference matter?
4b · Solana has the highest drop rate in the set. Is it therefore the least reliable choice?
4b · Solana has the highest drop rate in the set. Is it therefore the least reliable choice?
5 · What is a reorg, and why is it the worst failure mode for a payments business?
5 · What is a reorg, and why is it the worst failure mode for a payments business?
pending again.It is the worst case because it is the one where you already told the customer it worked.Follow-up: how do you test for something probabilistic? Two ways, and the second matters more. Probabilistically during block production, seeded so a run is reproducible, and deterministically via forceReorg(depth), because the chaos suite needs a reorg at a precise moment. Tuning a probability until a test happens to reorg is flaky and proves nothing about the path you meant to exercise.6 · After a reorg, what does the consumer need to know?
6 · After a reorg, what does the consumer need to know?
reorg event carries revertedTransactions so the consumer does not have to diff state itself.Rollback clears each affected transaction’s block height, resets status to pending, and pushes it to the front of the mempool so it is re-mined promptly rather than queuing behind everything submitted since.Follow-up: why not let the consumer diff? Because diffing requires the consumer to have retained the prior state, correctly, and every consumer would implement that separately. Putting it in the event makes it one implementation instead of n.Design
7 · What does 'chain-agnostic' actually mean?
7 · What does 'chain-agnostic' actually mean?
ChainDriver has six methods: broadcast, getTransaction, getConfirmations, estimateFee, head, subscribe. Everything upstream codes against it, so swapping the simulator for a real RPC client is another implementation rather than a change to the saga.Follow-up: how do you know the abstraction is real? Nothing in the movement context can tell it is talking to a simulator. That is the test: the code above cannot detect what is below.8 · How would you pick a chain per transfer?
8 · How would you pick a chain per transfer?
9 · Your settle step broadcasts without error. Is the transfer settled?
9 · Your settle step broadcasts without error. Is the transfer settled?
settle re-reads the transaction and requires final. Checking final rather than “no error was thrown” is the difference between confirming settlement and merely confirming submission, and the wrong version looks completely correct until the day a transaction is dropped.Follow-up: how do you wait without a wall clock? The simulator has none; time is a function the caller injects (advanceChain). That is also what makes a full settlement testable in milliseconds.10 · Can you reverse an on-chain settlement?
10 · Can you reverse an on-chain settlement?
settle compensation is a ledger-level unwind representing funds recovered from the settlement partner. Nothing un-sends a confirmed on-chain transaction. That limitation is documented rather than papered over, because an architecture implying otherwise is lying about what a blockchain is.Follow-up: so what actually happens commercially? You have a relationship with the settlement partner and a claim against them. The ledger records the claim. The chain records the transfer. Those are different facts and the system should not conflate them.Questions to ask them back
- What confirmation depth do you use, and is it a function of value or a constant?
- What happens if a chain reorgs after you have credited the beneficiary?
- Do you credit before finality? If so, is that modelled as a credit exposure anywhere?
- How do you test reorg handling?