Whitepaper v1 is out: what coordination holds, and what it cannot

Product · Queue

One intention, one action

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

ClickClickRetry
One actionMutiq

Repeat Request Detection

Two requests become one key

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.

Click 1new key, queued
Click 2same key, held
Retrysame key, held
New scopenew key, queued

Illustration of what the queue does with four requests

Why it matters

A repeat is rarely malicious

Slow network

The second click

The screen did not react, so the user tried again. That is reasonable behaviour, and the code has to expect it.

Retry logic

The polite retry

A timeout does not mean a failure. A retry that resends a transaction can do the work twice.

Page reload

The lost memory

A component's state is gone after a reload. A queue kept in storage still knows what was sent.

Two tabs

The same button, twice

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

Every action has one state

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

Every part of the request, handled

Idempotency key

keccak(namespace, logical action), the same derivation in TypeScript and in the contract.

Single-flight guard

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.

Repeat counter

Held requests are counted, in the queue and on the ledger, so you can see how often it happens.

Deadlines

A queued action can carry a deadline. Past it, the action expires instead of being sent late.

Scope

Your way of saying this one really is a new action.

Durable list

The queue lives in browser storage, so a reload does not forget what happened.

Namespaces

Each app or environment has its own keys, rules and roles.

Public record

First registration wins on MutiqActionLedger, with repeats counted by the contract.

Where it holds

Inside your pipeline

All integrations
  1. 01

    Buttons in your app

    Calls that go through the client code are held.

  2. 02

    Scripts using the package

    Same key and guard, in the same process.

  3. 03

    Anything else

    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.

Ready to coordinate?

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