This needs to be updated to include transaction resubmission by the wallet.
States
stateDiagram
[*] --> pending: request
[*] --> in_ledger: discover
pending --> in_ledger: discover
pending --> [*]: forget
in_ledger --> pending: rollback
State transition: forget
Importantly, a transaction, when sent, cannot be cancelled. One can only request forgetting about it in order to try spending (concurrently) the same UTxO in another transaction. But, the transaction may still show up later in a block and therefore, appear in the wallet.
State transition: discover
Discovering a transaction happens regardless of a transaction being present or not as pending
. Actually, only outgoing transactions are going through the pending
state. Incoming ones or, outgoing ones that have been forgotten may be discovered directly in blocks.
Submission
sequenceDiagram
participant Wallet Client
participant Wallet Server
participant Network
Wallet Client ->>+ Wallet Server: POST payment request
Wallet Server ->> Wallet Server: Select available coins
Wallet Server ->> Wallet Server: Construct transaction
Wallet Server ->> Wallet Server: Sign transaction
Wallet Server -->> Wallet Client: 403 Forbidden
Wallet Server ->>+ Network: Submit transaction
Network ->> Network: Validate transaction structure
Network -->> Wallet Server: (ERR) Malformed transaction
Wallet Server -->> Wallet Client: 500 Internal Server Error
Network ->>- Wallet Server: Accepted
Wallet Server ->>- Wallet Client: 202 Accepted
Network ->> Network: Broadcast transaction to peers
loop Every block
Network ->> Network: Insert or discard transaction(s)
Network ->> Wallet Server: Yield new block
Wallet Server ->> Wallet Server: Discover transaction(s)
end