Action Queue
Every request waits in one list with one state, until something actually happens to it.
Learn moreA clearer execution layer for Web3 builders. Mutiq turns a double click into one queued action, checks it against your rules, and shows what the chain really did with it.
CA0xa0e4f91373f0a4e3b82c25dcf76f07562a0c2c01Built for the flows you already ship:
Starting on Robinhood Chain.A user taps Update on a slow connection. Nothing seems to happen, so they tap again. Left alone, the app sends two requests and the wallet asks twice.
Try it: two clicks, one prompt| Click | Key | Wallet | State |
|---|---|---|---|
| 1 | none | asked | sent |
| 2Twice | none | asked | sent |
One action, one key
1const hash = actionHash({ signer, target, data, scope: "profile-42" })2const key = actionKey(namespace, hash)34const { items, isNew } = enqueue(queue, { key, ...action }, Date.now())5if (!isNew) return items // held and counted67const { promise } = flight.run(key, () =>8 wallet.send({ to: target, data }) // asked once9)Double-click the button. The network here is slow on purpose.
Every request waits in one list with one state, until something actually happens to it.
Learn moreAn idempotency key recognises the same logical action, however it arrived twice.
Learn moreAllowed targets, functions and counts per window, for each namespace you run.
Learn moreLatest against pending for your signer, with hints when a line is stuck or has a gap.
Learn moreThe layer
Not a trading bot. Not a wallet. Not a new chain.
Built for Robinhood Chain
Read through the site relay from Robinhood Chain, chain id 4663.
Where it goes wrong
A request times out and the code retries. The first one was fine, just late.
See how it is handled ReloadQueueA reload wipes the screen's memory of what it just sent. The button is live again.
See how it is handledClick 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