From 6ceb9375de722a7ee9b5ff9b94a623cd5c89ec55 Mon Sep 17 00:00:00 2001 From: Russell Ballestrini Date: Tue, 30 Sep 2025 15:43:35 -0400 Subject: [PATCH] modified: Makefile new file: docs/state-machine.dot new file: docs/state-machine.dot.svg renamed: state-machine.svg -> docs/state-machine.svg --- Makefile | 3 + docs/state-machine.dot | 62 ++++ docs/state-machine.dot.svg | 388 ++++++++++++++++++++ state-machine.svg => docs/state-machine.svg | 0 4 files changed, 453 insertions(+) create mode 100644 docs/state-machine.dot create mode 100644 docs/state-machine.dot.svg rename state-machine.svg => docs/state-machine.svg (100%) diff --git a/Makefile b/Makefile index 0082c38..9379e74 100644 --- a/Makefile +++ b/Makefile @@ -71,6 +71,9 @@ help: @echo "" @echo "For more info, see README.md and CRYPTO.rst" +docs/state-machine.dot.svg: + dot -Tsvg docs/state-machine.dot -o docs/state-machine.dot.svg + # ----------------------------------------------------------------------------- # Environment Setup Targets # ----------------------------------------------------------------------------- diff --git a/docs/state-machine.dot b/docs/state-machine.dot new file mode 100644 index 0000000..ab1389c --- /dev/null +++ b/docs/state-machine.dot @@ -0,0 +1,62 @@ +digraph G { + rankdir=LR; + node [shape=box, style="filled,rounded", penwidth=2, fontsize=12, fontname="Arial"]; + edge [penwidth=1.5, fontsize=10, fontname="Arial"]; + "[*]" [shape=circle, label="", width=0.2, fillcolor=black, style=filled]; + "pending" [fillcolor="#e7f3ff", fontcolor="#0056b3", color="#0056b3", fontsize=12]; + "doublepay_refunded" [fillcolor="#e7f3ff", fontcolor="#0056b3", color="#0056b3", fontsize=12]; + "latepay_refunded" [fillcolor="#e7f3ff", fontcolor="#0056b3", color="#0056b3", fontsize=12]; + "received" [fillcolor="#cce5ff", fontcolor="#004085", color="#004085", fontsize=12]; + "expired" [fillcolor="#f8d7da", fontcolor="#721c24", color="#721c24", fontsize=12]; + "cancelled" [fillcolor="#f8d7da", fontcolor="#721c24", color="#721c24", fontsize=12]; + "confirmed" [fillcolor="#d4edda", fontcolor="#155724", color="#155724", fontsize=12]; + "confirmed_overpay" [fillcolor="#cce5ff", fontcolor="#004085", color="#004085", fontsize=12]; + "underpaid_refunded" [fillcolor="#fff3cd", fontcolor="#856404", color="#856404", fontsize=12]; + "out_of_stock_refunded" [fillcolor="#fff3cd", fontcolor="#856404", color="#856404", fontsize=12]; + "confirmed_overpay_refunded" [fillcolor="#fff3cd", fontcolor="#856404", color="#856404", fontsize=12]; + "confirmed_overpay_refunded_complete" [fillcolor="#d4edda", fontcolor="#155724", color="#155724", fontsize=12]; + "confirmed_overpay_not_refunded" [fillcolor="#d4edda", fontcolor="#155724", color="#155724", fontsize=12]; + "latepay_refunded_complete" [fillcolor="#f8d7da", fontcolor="#721c24", color="#721c24", fontsize=12]; + "latepay_not_refunded" [fillcolor="#f8d7da", fontcolor="#721c24", color="#721c24", fontsize=12]; + "underpaid_refunded_complete" [fillcolor="#f8d7da", fontcolor="#721c24", color="#721c24", fontsize=12]; + "underpaid_not_refunded" [fillcolor="#f8d7da", fontcolor="#721c24", color="#721c24", fontsize=12]; + "out_of_stock_refunded_complete" [fillcolor="#f8d7da", fontcolor="#721c24", color="#721c24", fontsize=12]; + "out_of_stock_not_refunded" [fillcolor="#f8d7da", fontcolor="#721c24", color="#721c24", fontsize=12]; + "doublepay_refunded_complete" [fillcolor="#f8d7da", fontcolor="#721c24", color="#721c24", fontsize=12]; + "doublepay_not_refunded" [fillcolor="#f8d7da", fontcolor="#721c24", color="#721c24", fontsize=12]; + "terminated" [shape=doubleoctagon, fillcolor="#e0e0e0", fontcolor="#333333", color="#333333", fontsize=12]; + "[*]" -> "pending"; + "[*]" -> "doublepay_refunded" [label="Duplicate payment detected"]; + "[*]" -> "latepay_refunded" [label="Late payment detected"]; + "pending" -> "received" [label="Payment detected in mempool"]; + "pending" -> "expired" [label="Payment timeout (never received)"]; + "pending" -> "cancelled" [label="User cancellation"]; + "received" -> "confirmed" [label="Sufficient payment + confirmations"]; + "received" -> "confirmed_overpay" [label="Overpayment detected"]; + "received" -> "underpaid_refunded" [label="Underpayment detected"]; + "received" -> "out_of_stock_refunded" [label="Product unavailable"]; + "confirmed" -> "terminated" [label="✓ Terminal Success"]; + "confirmed_overpay" -> "confirmed_overpay_refunded" [label="Initiate refund"]; + "confirmed_overpay_refunded" -> "confirmed_overpay_refunded_complete" [label="Refund confirmed"]; + "confirmed_overpay_refunded" -> "confirmed_overpay_not_refunded" [label="No refund wallet configured"]; + "confirmed_overpay_refunded_complete" -> "terminated" [label="✓ Terminal Success"]; + "confirmed_overpay_not_refunded" -> "terminated" [label="✓ Terminal Success (Not Refunded)"]; + "expired" -> "terminated" [label="✓ Terminal Failed (Expired)"]; + "latepay_refunded" -> "latepay_refunded_complete" [label="Refund confirmed"]; + "latepay_refunded" -> "latepay_not_refunded" [label="No refund wallet configured"]; + "latepay_refunded_complete" -> "terminated" [label="✓ Terminal Failed (Refund Complete)"]; + "latepay_not_refunded" -> "terminated" [label="✓ Terminal Failed (Not Refunded)"]; + "underpaid_refunded" -> "underpaid_refunded_complete" [label="Refund confirmed"]; + "underpaid_refunded" -> "underpaid_not_refunded" [label="No refund wallet configured"]; + "underpaid_refunded_complete" -> "terminated" [label="✓ Terminal Failed (Refund Complete)"]; + "underpaid_not_refunded" -> "terminated" [label="✓ Terminal Failed (Not Refunded)"]; + "out_of_stock_refunded" -> "out_of_stock_refunded_complete" [label="Refund confirmed"]; + "out_of_stock_refunded" -> "out_of_stock_not_refunded" [label="No refund wallet configured"]; + "out_of_stock_refunded_complete" -> "terminated" [label="✓ Terminal Failed (Refund Complete)"]; + "out_of_stock_not_refunded" -> "terminated" [label="✓ Terminal Failed (Not Refunded)"]; + "doublepay_refunded" -> "doublepay_refunded_complete" [label="Refund confirmed"]; + "doublepay_refunded" -> "doublepay_not_refunded" [label="No refund wallet configured"]; + "doublepay_refunded_complete" -> "terminated" [label="✓ Terminal Failed (Refund Complete)"]; + "doublepay_not_refunded" -> "terminated" [label="✓ Terminal Failed (Not Refunded)"]; + "cancelled" -> "terminated" [label="✓ Terminal Failed (Cancelled)"]; +} diff --git a/docs/state-machine.dot.svg b/docs/state-machine.dot.svg new file mode 100644 index 0000000..5699780 --- /dev/null +++ b/docs/state-machine.dot.svg @@ -0,0 +1,388 @@ + + + + + + +G + + + +[*] + + + + +pending + +pending + + + +[*]->pending + + + + + +doublepay_refunded + +doublepay_refunded + + + +[*]->doublepay_refunded + + +Duplicate payment detected + + + +latepay_refunded + +latepay_refunded + + + +[*]->latepay_refunded + + +Late payment detected + + + +received + +received + + + +pending->received + + +Payment detected in mempool + + + +expired + +expired + + + +pending->expired + + +Payment timeout (never received) + + + +cancelled + +cancelled + + + +pending->cancelled + + +User cancellation + + + +doublepay_refunded_complete + +doublepay_refunded_complete + + + +doublepay_refunded->doublepay_refunded_complete + + +Refund confirmed + + + +doublepay_not_refunded + +doublepay_not_refunded + + + +doublepay_refunded->doublepay_not_refunded + + +No refund wallet configured + + + +latepay_refunded_complete + +latepay_refunded_complete + + + +latepay_refunded->latepay_refunded_complete + + +Refund confirmed + + + +latepay_not_refunded + +latepay_not_refunded + + + +latepay_refunded->latepay_not_refunded + + +No refund wallet configured + + + +confirmed + +confirmed + + + +received->confirmed + + +Sufficient payment + confirmations + + + +confirmed_overpay + +confirmed_overpay + + + +received->confirmed_overpay + + +Overpayment detected + + + +underpaid_refunded + +underpaid_refunded + + + +received->underpaid_refunded + + +Underpayment detected + + + +out_of_stock_refunded + +out_of_stock_refunded + + + +received->out_of_stock_refunded + + +Product unavailable + + + +terminated + + +terminated + + + +expired->terminated + + +✓ Terminal Failed (Expired) + + + +cancelled->terminated + + +✓ Terminal Failed (Cancelled) + + + +confirmed->terminated + + +✓ Terminal Success + + + +confirmed_overpay_refunded + +confirmed_overpay_refunded + + + +confirmed_overpay->confirmed_overpay_refunded + + +Initiate refund + + + +underpaid_refunded_complete + +underpaid_refunded_complete + + + +underpaid_refunded->underpaid_refunded_complete + + +Refund confirmed + + + +underpaid_not_refunded + +underpaid_not_refunded + + + +underpaid_refunded->underpaid_not_refunded + + +No refund wallet configured + + + +out_of_stock_refunded_complete + +out_of_stock_refunded_complete + + + +out_of_stock_refunded->out_of_stock_refunded_complete + + +Refund confirmed + + + +out_of_stock_not_refunded + +out_of_stock_not_refunded + + + +out_of_stock_refunded->out_of_stock_not_refunded + + +No refund wallet configured + + + +confirmed_overpay_refunded_complete + +confirmed_overpay_refunded_complete + + + +confirmed_overpay_refunded->confirmed_overpay_refunded_complete + + +Refund confirmed + + + +confirmed_overpay_not_refunded + +confirmed_overpay_not_refunded + + + +confirmed_overpay_refunded->confirmed_overpay_not_refunded + + +No refund wallet configured + + + +confirmed_overpay_refunded_complete->terminated + + +✓ Terminal Success + + + +confirmed_overpay_not_refunded->terminated + + +✓ Terminal Success (Not Refunded) + + + +latepay_refunded_complete->terminated + + +✓ Terminal Failed (Refund Complete) + + + +latepay_not_refunded->terminated + + +✓ Terminal Failed (Not Refunded) + + + +underpaid_refunded_complete->terminated + + +✓ Terminal Failed (Refund Complete) + + + +underpaid_not_refunded->terminated + + +✓ Terminal Failed (Not Refunded) + + + +out_of_stock_refunded_complete->terminated + + +✓ Terminal Failed (Refund Complete) + + + +out_of_stock_not_refunded->terminated + + +✓ Terminal Failed (Not Refunded) + + + +doublepay_refunded_complete->terminated + + +✓ Terminal Failed (Refund Complete) + + + +doublepay_not_refunded->terminated + + +✓ Terminal Failed (Not Refunded) + + + diff --git a/state-machine.svg b/docs/state-machine.svg similarity index 100% rename from state-machine.svg rename to docs/state-machine.svg