The second click
The screen did not react, so the user tried again. That is reasonable behaviour, and the code has to expect it.
Product · Queue
A user who clicks twice meant one thing. Mutiq names that thing with an idempotency key, queues it once, counts the repeat, and asks the wallet a single time.
Illustration
Repeat Request Detection
The key is keccak(namespace, logical action). The logical action is the signer, the target, the value, the call data and a scope you choose. Add a form revision or an order id to the scope when a second send is meant to be a second action.
Illustration of what the queue does with four requests
Why it matters
The screen did not react, so the user tried again. That is reasonable behaviour, and the code has to expect it.
A timeout does not mean a failure. A retry that resends a transaction can do the work twice.
A component's state is gone after a reload. A queue kept in storage still knows what was sent.
Each tab has its own memory. Shared storage narrows the window; the on-chain ledger closes the record of it, not the send itself.
State machine
Queued, submitted, replaced, confirmed, reverted, cancelled or expired. The client package and the contract share one transition table, so an illegal move is refused in both places. A finished action stays finished, and a repeat of it is still counted.
Queue toolkit
keccak(namespace, logical action), the same derivation in TypeScript and in the contract.
A second call for a key in flight gets the first call's promise. It is synchronous, so a double click cannot slip past it.
Held requests are counted, in the queue and on the ledger, so you can see how often it happens.
A queued action can carry a deadline. Past it, the action expires instead of being sent late.
Your way of saying this one really is a new action.
The queue lives in browser storage, so a reload does not forget what happened.
Each app or environment has its own keys, rules and roles.
First registration wins on MutiqActionLedger, with repeats counted by the contract.
Calls that go through the client code are held.
Same key and guard, in the same process.
A transaction sent from another wallet screen or a tool outside it cannot be stopped.
Repeats are held only inside the pipeline the app controls.
Click one button twice and watch one action land in the queue. Then read exactly what it holds and what it cannot.
Not a trading bot · Not a wallet · Not a chain · Your wallet signs every transaction