MONAF · Engineering record · 24 October 2026
Security audit
The agent can trade. It cannot take the MON out. Anything this page cannot prove, it does not sign.
This is the record of the velocity desk in this build. It is not a third-party audit, a formal proof, or a promise of profit. A loss inside the minimum is a fill.
Read this first
Six things that still matter
Everything else on this page is the map. These are the bounds a reader should leave with.
01
ResidualThe agent key is online
Script on this site can read it. It still cannot release the MON.
The key exists so a called card can trade without a second prompt. It may only deposit, swap back into its own vault, or unwrap WMON that vault already holds. Withdraw, transfer, and a bare send are refused before signing. A stolen key used outside this page can still choose a weak minimum. The creator wallet is the only release.
02
ResidualA searcher can move the price inside 2%
The minimum stops a zero fill. It does not stop a worse fill inside the band.
There is no private mempool. A single-call swap has no separate deadline, because a hidden second call would be the worse bug. Two hosts must agree within 2%, and the lower quote sets the floor. A move inside that band can be taken.
03
ResidualTwo nodes can lie together
One lying node is not enough. Two are.
Reads hedge across six endpoints. A quote is checked on a second host. A base fee above 1,000 gwei is ignored, and the tip stays 2 gwei. If both hosts are wrong, the desk believes them. A display balance can be ten minutes old and is never what gets signed.
04
ResidualOne creator wallet
Whoever can sign as the creator can take the MON back. There is no second signer.
Return pays the owner already stored on the vault. The user does not type a destination. There is no timelock. Phishing that creator wallet is the release path. The agent cannot invent a new owner.
05
OutsideThe vault and the router are trusted code
This page checks the client. It does not re-prove their bytecode.
The factory, the vault, the Pancake router, WMON, and the pinned tokens are assumed to be the contracts at those addresses. An admin upgrade, a token tax added later, or a bug in that bytecode is outside this record. The client’s containment is that the agent still cannot call withdraw.
06
ResidualA card can be a bad trade
The rules can refuse a thin pool. They cannot refuse a bad idea that clears them.
The tape can show a card. It cannot set the token, the recipient, or the minimum. No control here is a promise of profit. A loss inside the minimum is a fill, not a bug.
Custody
Where the MON sits
Deleting the site does not delete the vault. The agent is a trader, not an owner.
- 1Creator walletOwns the vault. The only key that can release.
- 2VaultHolds the MON and the position. Deleting the site does not delete it.
- 3Agent keyCan swap back into that vault. Cannot withdraw.
- 4ReturnPays the owner the vault already stores. No address is typed.
The key is kept in three places. If the local copy is damaged, the session copy is kept. A new key is created only when all three are empty, and it cannot overwrite a backup that is still there.
A send
What has to be true before a signature
Miss one of these and the desk does not sign. A guessed gas limit, a zero minimum, and a wrong chain id are all misses.
Right vault
The address names this browser as agent and this wallet as owner. A saved address that fails that read is deleted.
Right call
Only the known router, or WMON to unwrap. The swap pays the vault. The tokens are the pinned ones.
Right minimum
Above zero, and the same number in the swap and in the vault guard. A buy attaches exactly that size. A sell attaches none.
Right price
Two hosts, within 2%. The floor is the lower quote. An empty quote sends nothing.
Right chain
The node’s chain id must be the Monad network this desk was built for. Simulation must answer. A guessed gas limit is not used.
Right pace
One trade at a time. The same close cannot be sent twice. A nonce more than one ahead of the chain is resynced. A paused agent is resumed by the creator, or skipped.
When something is down
The desk stays up. The send does not bluff.
A slow node, a rate limit, a dead tape, or a broken screen must not look like a filled trade.
- Nodes. The first endpoint is used at once. If it is silent, the next starts. One rate limit does not freeze the others. Six endpoints. A broadcast is raced. The first acceptance wins.
- Stale reads. A balance can be shown from the last good answer for ten minutes. Sending does not use that cache.
- Feeds. If the tape fails, the last tape stays, including after a reload. A card still cannot set the price that is signed.
- The page. One screen can throw without taking the header or the bar. A script chunk that fails to load reloads once.
Case file
The incidents that named the class
Open a case for what happened, what this desk does, and what is still true. None of these is a re-run of the original hack.
Reentrancy, The DAO, 2016
- What happened
- A withdraw call sent ETH before it wrote the balance down. The receiver called back in and withdrew again. About 3.6 million ETH moved.
- On this desk
- The desk never writes its own vault. Swaps pay the vault, then the receipt is waited on. A second close of the same fill is refused while the first is in flight.
- Still true
- The vault bytecode itself is not re-audited on this page. A bug inside that contract is outside the app checks.
Uninitialised wallet and a killed library, Parity, 2017
- What happened
- One wallet was left uninitialised, so anyone could become its owner. A second bug let a library be destroyed, freezing funds in every wallet that pointed at it.
- On this desk
- A cached vault address is ignored unless the contract says this wallet is the owner and this browser is the agent. The desk key cannot call an arbitrary contract.
- Still true
- The factory that deploys the vault is trusted. This page does not re-verify its bytecode.
Integer overflow, batchOverflow, 2018
- What happened
- A token transfer multiplied amount by balance and wrapped past the type limit, minting a huge balance from a tiny input.
- On this desk
- Trade sizes are bigints. A zero output, a zero minimum, and a minimum that does not match the swap are refused before signing.
- Still true
- A malicious token with its own overflow is not in the trade set. Only the known WETH, WBTC, cbBTC and WMON addresses are allowed in a desk swap.
Hot wallet theft
- What happened
- Exchanges kept withdrawal keys online. One server breach emptied the hot wallet. The pattern repeats from Mt. Gox onward.
- On this desk
- The private key is never shown and never leaves the signer. At rest it is sealed, so storage is not a usable key. The only bare MON it can sign goes to the vault owner, read from the contract. It cannot withdraw the vault.
- Still true
- This is still a hot key. Script that replaces this page can still ask it to sign. The vault contract, not the page, is what stops a withdrawal.
Unlimited token approval
- What happened
- Wallets approved a router for the maximum uint256. A later bug or a malicious spender could pull every token, not just the trade.
- On this desk
- A wallet sell approves only the quantity of that sell. A vault sell approves no more than the swap amount, and only the known router.
- Still true
- An approval already sitting on the router from an older session is not revoked by this page.
Approval front-run
- What happened
- Changing an allowance from 10 to 5 could be front-run: the spender pulled 10, then the new allowance of 5 let them pull 5 more.
- On this desk
- The desk does not edit an existing allowance. It approves the exact size when the allowance is short.
- Still true
- A token that does not follow the usual approve semantics is not used here.
Oracle and flash-loan price manipulation
- What happened
- bZx, Harvest, Mango and others priced a position from a pool the attacker could move inside one transaction, then borrowed against the fake price.
- On this desk
- A fill price is an on-chain quote, then a second node must agree within 2%. The minimum is built from the lower quote. The tape does not settle the trade.
- Still true
- Both nodes can be wrong together. A thin pool can still move inside the 2% band. Social and exchange prints are signals, not prices.
Sandwich and missing slippage
- What happened
- A swap with a zero minimum, or no deadline, can be surrounded. The attacker buys first, the victim pays the worse price, the attacker sells.
- On this desk
- A desk swap with a zero minimum is not signed. The recipient must be the vault. Two nodes must agree before that minimum is set.
- Still true
- One percent of room remains inside the band. There is no private mempool. A delayed transaction can still land later if the price is still inside the minimum.
msg.value reused inside a multicall
- What happened
- Some routers counted the same attached MON twice when two calls in one multicall both read msg.value. The caller was over-credited.
- On this desk
- The desk swap is one exactInputSingle, not a multicall. A buy must attach exactly the swap size. A sell must attach zero.
- Still true
- Wallet-direct MON sells still use the router multicall to unwrap. That path pays the connected wallet, not the vault, and the minimum is still required.
Delegatecall and an open target
- What happened
- A contract that delegatecalls a user-supplied address runs the attacker code in its own storage. That is a common drain.
- On this desk
- The desk may call only the Pancake router for a swap, or WMON for an unwrap. Any other target is refused before the key signs.
- Still true
- This is an app check. A stolen key used outside the app is limited by the vault contract, which is a separate line of defence.
Missing access control on withdraw
- What happened
- Functions named withdraw, emergencyWithdraw or sweep were left public. The first caller took the balance.
- On this desk
- The desk key is rejected for withdraw, withdrawToken, emergencyWithdrawAll and transfer. Tests cover those selectors. Only the creator release path builds them, and it pays the creator.
- Still true
- The creator wallet can still be phished into signing a release. The app cannot stop a signature the wallet shows the user.
Bridge and trusted-relayer theft
- What happened
- Wormhole, Ronin, Nomad and Poly failed in different ways: a signature check, a compromised validator set, a trusted root, an unbounded message. The pattern is a second system that can mint on the far side.
- On this desk
- This desk does not bridge. It does not mint. A swap stays on Monad, and the output address is the vault.
- Still true
- MON itself can arrive from a bridge. This app does not inspect that origin.
Frontend hijack, Badger, 2021
- What happened
- The website was altered so users signed approvals to an attacker. The contracts were fine. The page was not.
- On this desk
- A changed vault address in local storage is dropped unless owner and agent match. The key is also kept in the session and in IndexedDB, and a damaged copy does not overwrite a good one.
- Still true
- If the real site or a dependency is replaced, those checks are replaced with it. Host the page, pin the dependency, and treat a surprise wallet prompt as hostile.
Permit and blind-signature phishing
- What happened
- Users signed permit, Permit2 or eth_sign payloads that looked like a login and were a transfer. No gas was needed from the victim.
- On this desk
- The desk key does not sign permits. It signs one vault call, one deposit, or one profit transfer to the owner. The payload is decoded before it is signed.
- Still true
- The creator wallet can still be asked to sign a permit by any site. That is the wallet’s prompt, not this key.
Signature replay
- What happened
- A signature without a chain id, nonce or deadline was reused on another chain or another contract.
- On this desk
- Each desk trade is an EIP-1559 transaction with chain id 143 and a fresh request id. A used id is rejected by the vault.
- Still true
- The request id has 6 random bytes. A collision retries. It does not replay.
ERC-4626 inflation
- What happened
- A vault with no shares was donated a huge asset balance, so the next depositor’s shares rounded to zero and the donor took the deposit.
- On this desk
- Velocity does not mint shares. It swaps into WETH, WBTC or cbBTC and holds them in the vault.
- Still true
- aprMON and other staking tokens elsewhere in the app are external contracts. Their share math is not this desk.
Read-only reentrancy
- What happened
- A view read a pool mid-callback, before reserves were updated, and a second protocol trusted that view.
- On this desk
- The desk does not lend against a view. A quote is checked, then the swap itself enforces the minimum.
- Still true
- A quote and the later block can differ. Disagreement above 2%, or a revert in simulation, sends nothing.
Proxy admin and uninitialised implementation
- What happened
- An implementation left initialise public, or the admin slot was taken. The new admin upgraded the proxy and drained it.
- On this desk
- The desk does not upgrade contracts and does not call initialise.
- Still true
- If the vault factory were upgraded by its own admin, this app would be talking to new code. That admin is not this user.
Supply-chain compromise
- What happened
- event-stream, ua-parser-js and the Ledger Connect Kit were poisoned. The page users loaded was not the page the authors shipped.
- On this desk
- The fund checks live in the client that is shipped. A poisoned dependency can remove them. There is no second, on-phone verifier.
- Still true
- Lock the install, read the diff, and do not treat this page as a substitute for that.
Malicious or eclipsed RPC
- What happened
- A wallet pointed at one node. The node lied about balances, simulation, or chain id. Users signed against a fake state.
- On this desk
- Reads hedge across six endpoints. One slow node does not hold the desk. A quote must match a second host within 2%. A failed simulation is not replaced with a guessed gas limit.
- Still true
- Two colluding nodes can still agree on a lie. Display reads may show the last good answer for ten minutes. A send does not use that cache.
Stuck nonce and dropped transaction
- What happened
- A wallet incremented its nonce, the transaction vanished, and every later transaction waited forever. The account looked frozen.
- On this desk
- If the local nonce is more than one ahead of the pending count, the desk resyncs. A send that never returns stops blocking the lane after 25 seconds.
- Still true
- A transaction that is still in the mempool is left one ahead on purpose, so a replacement is not fired on top of it.
Double execution
- What happened
- A timeout was shown as a failure. The user, or a bot, sent the same trade again. Both landed.
- On this desk
- While a trade is unconfirmed, a second send is refused. The same close cannot be submitted twice at once. A called card that has already filled leaves the stream.
- Still true
- A second device with the same key is not coordinated. Use one browser for the desk key.
Paused-agent denial of service
- What happened
- A pause flag made every later call revert. The product looked broken, and a naive retry loop burned gas on Monad, which bills the gas limit.
- On this desk
- The desk reads paused() and, if the creator wallet is connected, resumes before the trade. A revert is simulated first, so a failed call is not broadcast.
- Still true
- Resume needs the creator wallet. Without it, the trade is not sent and the MON stays in the vault.
Rate-limit and dependency failure
- What happened
- One HTTP 429, or one dead endpoint, stalled every read. The app looked down. Users retried into worse state.
- On this desk
- A 429 retries once and does not freeze the other calls. The queue is capped. If every endpoint fails, a recent balance read is shown. The shell stays up if one screen throws. A bad script chunk reloads once.
- Still true
- After ten minutes with no live node, reads fail closed. Nothing is sent into that silence.
Off-chain tape treated as a fill
- What happened
- Bots that trusted a printed price, a tweet, or a candle traded into an empty pool. The print was never the market.
- On this desk
- Binance, Coinbase, Stocktwits and the pool tape can show a card. They cannot lower the on-chain minimum. No card trades twice, and a card that does not clear the round trip is not offered.
- Still true
- A card can still be a bad idea inside a pool that is merely thin. The minimum protects the fill, not the decision.
Local storage as authority
- What happened
- Apps trusted a position list or a vault address kept on the device. Another script on the origin rewrote it and the app acted.
- On this desk
- Fills are clipped to the tokens the vault actually holds. A top-up is paid only to the on-chain executor, and only when this browser holds that key and the connected wallet is the owner.
- Still true
- Script running on this origin can still call the key directly. Storage checks do not survive a hostile page.
Gas griefing on Monad
- What happened
- A reverted transaction was still billed for the full gas limit. Retry loops became the loss.
- On this desk
- The desk simulates, and a transport failure does not skip that step. A paused or reverting close is not broadcast. The gas float is a small balance on the key, separate from the trade size.
- Still true
- A trade that simulates cleanly and reverts in a later block still pays gas. That is the chain.
Creator impersonation and address poisoning
- What happened
- A lookalike address was placed next to a real one. The release went to the lookalike.
- On this desk
- Release pays the owner the vault already stores. The user does not type a destination for a velocity return.
- Still true
- A wallet prompt that asks for a new recipient is not this return. Reject it.
Chain halt, reorg, and a lying explorer
- What happened
- The chain stopped, a short reorg replaced a receipt, or an explorer showed a transaction that was not on the canonical chain.
- On this desk
- The desk waits for a successful receipt. A timeout is reported as still landing, not as a failure and not as a success.
- Still true
- This app cannot keep Monad producing blocks. A deep reorg after a receipt is a chain event, not something the page can undo.
Catalogue
106 known classes
Stopped: this client refuses the shape. Residual: the bound is real and incomplete. Outside: the desk has no such surface, or it belongs to the chain, the factory, or the creator wallet.
Chain and consensus1 stopped · 7 residual or outside · 8 in view
- Outside
Majority hash or stake
A majority of Monad validators can reorder or halt the chain. This client cannot outvote them.
- Residual
Short reorg
The desk waits for a successful receipt. A deep reorg after that receipt is a chain event.
- Stopped
Chain split and replay
Every desk transaction is EIP-1559 and carries the Monad chain id. A node reporting another id is refused.
- Residual
Eclipse of one node
Reads hedge, and a quote needs a second host. Two eclipsed hosts can still agree.
- Outside
Selfish mining and time skew
Block production is the validator set. The desk does not choose timestamps or parents.
- Outside
Censorship
A builder can delay a transaction. The desk can resend. It cannot force inclusion.
- Outside
Chain halt
If Monad stops producing blocks, sends wait. The last good read can be shown. Nothing is invented.
- Outside
Finality gadget failure
This client treats a receipt as the chain’s answer. It does not run its own consensus.
Smart-contract classes13 stopped · 19 residual or outside · 32 in view
- Residual
Reentrancy
The client does not callback into itself. The vault bytecode is a separate contract and is not re-proven here.
- Residual
Cross-function and cross-contract reentrancy
Same bound. A second protocol reading this vault mid-call is not part of this desk.
- Stopped
Read-only reentrancy
The desk does not lend against a view. The swap enforces its own minimum.
- Stopped
Integer overflow and underflow
Sizes are bigints. A zero output or a zero minimum is not signed.
- Residual
Precision loss and rounding
The minimum uses integer math. A one-wei remainder cannot become a zero floor, because a zero floor is refused.
- Residual
Unchecked call return
The client waits for a receipt whose status is success. A token that returns false instead of reverting is not in the known set.
- Stopped
Delegatecall to attacker code
The agent may call only the known router or WMON. Any other target is refused before signing.
- Outside
tx.origin authentication
This client does not use tx.origin. It also cannot stop another contract that does.
- Outside
Unprotected selfdestruct
The desk has no destruct path. A destruct in the vault or the router is their code.
- Stopped
Public withdraw
Withdraw, withdrawToken, emergencyWithdrawAll and transfer are rejected for the agent key.
- Stopped
tx from the wrong role
The vault must name this key as agent and this wallet as owner, or the address is dropped.
- Residual
Uninitialised proxy or wallet
A cached address that does not expose the expected owner and agent is ignored. The factory’s own initialiser is not re-audited here.
- Outside
Storage collision on upgrade
This client does not upgrade contracts. An admin upgrade of the factory is outside the desk.
- Outside
Missing implementation initialiser
The desk never calls initialise.
- Stopped
Selector clash
The payload is decoded by name. A selector the decoder does not know is not signed.
- Residual
Metamorphic CREATE2
The router and token addresses are pinned. If code at a pinned address changed, the pin would be wrong. The client does not re-hash bytecode each send.
- Stopped
Weak on-chain randomness
Trade ids come from the browser CSPRNG. Blockhash, timestamp and Math.random are not used. If the CSPRNG is missing, nothing is sent.
- Residual
Timestamp dependence
Hold time uses the device clock to decide when to try an exit. The swap itself does not key off the block timestamp.
- Stopped
Denial of service by revert
A reverting simulation is not broadcast. One paused agent is resumed or skipped, not looped into a gas burn.
- Residual
Denial of service by gas
Monad bills the gas limit. A trade that simulates and then reverts in a later block still pays. The trade size does not sit on the key.
- Stopped
Unexpected ETH or MON sent in
A sell attaches no MON. A buy attaches exactly the swap size. A bare value with no call is rejected.
- Stopped
msg.value counted twice
The desk swap is one call, not a multicall that rereads the value.
- Outside
Signature malleability
The desk sends transactions, not raw ECDSA approvals. Transaction uniqueness is the nonce and the chain id.
- Stopped
Missing replay protection
Chain id, nonce, and a fresh vault request id. A used request id is rejected by the vault.
- Residual
Front-running a sensitive function
The mempool can see a swap. The minimum bounds the price. There is no private relay.
- Outside
Commit-reveal skipped
The desk does not run a sealed-bid auction.
- Stopped
Short-address and ABI padding tricks
Calldata is ABI-encoded, not concatenated by hand. A decoded argument that is the wrong width fails the decoder.
- Outside
Default or wrong visibility
Visibility is a property of the contracts. The client only sends the functions it has decoded.
- Outside
Constructor vs initialiser confusion
The client does not deploy the vault implementation. It asks the factory.
- Outside
Shadowed state and inherited storage
That is the compiler’s layout. This client reads named view functions.
- Outside
Outdated compiler and known bytecode bugs
The vault and the router were not compiled in this repository.
- Stopped
Floating point in money math
Quotes, minimums and balances stay in integers. A display number is never what gets signed.
Tokens, pools and DeFi7 stopped · 16 residual or outside · 23 in view
- Stopped
Unlimited approval
A wallet sell approves the exact quantity. A vault sell cannot approve more than the swap.
- Stopped
Approval front-run
The desk does not lower an existing allowance. It approves the size only when the allowance is short.
- Stopped
Permit and Permit2 phishing
The agent key does not sign permits. The creator wallet still can, in some other app.
- Outside
setApprovalForAll on a collection
The desk does not trade NFTs.
- Stopped
Fee-on-transfer and rebasing tokens
Only the pinned WETH, WBTC, cbBTC and WMON addresses are allowed in a desk swap.
- Residual
Honeypot, blacklist, or a 100% sell tax
A pinned token could still add a tax later. The minimum then makes the sell revert rather than fill at zero. The position can be stuck until the creator releases it.
- Residual
Hidden mint and a pausable token
A token admin can mint or freeze. The desk cannot veto the token contract.
- Stopped
Fake token with a familiar ticker
Tickers are not trusted. The address has to be the pinned one.
- Outside
ERC-777 callback reentrancy
The known tokens are not ERC-777. A callback token is not on the list.
- Outside
ERC-4626 inflation and the first depositor
Velocity does not mint vault shares. aprMON elsewhere in the app is an external contract.
- Outside
Donation attack on a share price
The desk accounts a token balance, not a share price.
- Residual
Oracle manipulation
Two nodes must agree within 2%, and the lower quote sets the minimum. A move inside that band, or two lying nodes, still passes.
- Stopped
Spot price used as an oracle
The tape is not the fill. The fill is the router quote.
- Residual
Flash-loan amplification
A searcher can move the pool inside one block. The minimum is the bound. The desk does not borrow to trade.
- Residual
Sandwich and JIT liquidity
There is no private mempool and no deadline field on the single-call swap. The minimum is the protection, and it is not zero.
- Residual
Missing deadline
A stuck transaction can land later if the price is still inside the minimum. A multicall deadline was not added, because a second hidden call is the worse bug.
- Stopped
Zero slippage
A minimum of zero is refused in the wallet path and in the desk payload.
- Residual
Liquidity rug
If the pool is pulled, the quote fails or the minimum reverts. Funds already in the pool’s pair are the pool’s risk, not a desk balance.
- Outside
Governance flash loan
The desk does not vote and does not hold a governance token as a control.
- Outside
Liquidation and bad debt
The desk does not lend, borrow, or lever.
- Outside
Interest-rate and funding manipulation
There is no money-market position on this path.
- Residual
Impermanent loss misread as a bug
A pool move can lose value inside the minimum. That is the trade, and the page does not call it a yield.
- Outside
MEV rebate and builder payment
The desk does not pay a builder directly. The priority fee is 2 gwei.
Bridges, messages and admins0 stopped · 8 residual or outside · 8 in view
- Outside
Faulty signature check on a bridge
The desk does not verify or send bridge messages.
- Outside
Validator or relayer compromise
No bridge set is trusted here. MON that arrived from a bridge is just MON.
- Outside
Uninitialised message root
The desk stores no merkle root.
- Outside
Replay of a cross-chain message
There is no inbound message executor.
- Outside
Unlimited mint on the far side
The desk does not mint.
- Residual
Admin key or upgrade rug
The factory and the router have their own admins. This user is not those admins, and cannot stop them.
- Outside
Timelock bypass
The desk has no timelock. It also has no upgrade button.
- Residual
Multisig threshold social-engineered
The creator is a single wallet. If that wallet signs a release, the vault obeys. There is no second signer.
Wallets, phishing and the supply chain3 stopped · 11 residual or outside · 14 in view
- Residual
Hot wallet theft
The agent key cannot release, but it is online. Script on this origin can read it.
- Outside
Seed phrase and clipboard theft
This app does not ask for a seed and does not render the agent key.
- Residual
Malicious extension or drainer
An extension that can open the creator wallet can ask that wallet to sign. The desk cannot veto the wallet UI.
- Stopped
Blind signing and eth_sign
The agent signs one decoded transaction. It does not sign an opaque hash as a login.
- Residual
Ice phishing and a lookalike verify
Return pays the owner already stored on the vault. A prompt that names a new recipient is not this return.
- Stopped
Address poisoning
The user does not paste a destination for a velocity return.
- Stopped
Wrong network
The node’s chain id must match the network the desk was built for.
- Residual
Lying RPC on balance or fee
Quotes need two hosts. A base fee above 1,000 gwei is ignored. Two hosts can still lie together. A display read can be ten minutes old and is never used to send.
- Residual
Frontend hijack and DNS
If the shipped page is replaced, the checks are replaced with it. A surprise prompt is the tell.
- Residual
XSS on this origin
Storage checks and payload checks do not survive hostile script. That is the hot-key bound.
- Residual
Poisoned dependency
A bad package can delete these checks. Pin the install and read the diff. This page is not that pin.
- Residual
Malicious wallet deep link
Links open the wallet the user picks, aimed at this origin. A wallet that lies about the origin is the wallet.
- Outside
SIM swap and custodial recovery
There is no custodian and no phone-number recovery. Losing the creator wallet loses the release path.
- Outside
Exchange insolvency
Balances here are on-chain reads, not an IOU from a venue.
Agents and automation12 stopped · 3 residual or outside · 15 in view
- Stopped
Overprivileged agent
The key’s allowlist is deposit, one swap shape, and one unwrap. Release selectors throw.
- Stopped
Confused deputy
A caller cannot aim the key at a contract that is not the bound vault, even if the selector looks allowed.
- Stopped
Prompt or tape injection
A card, a tweet, or a candle cannot set the recipient, the token, or the minimum. Those come from the quote and the allowlist.
- Stopped
Tool output trusted as a price
The off-chain tape can show a card. It is not the number in the signed minimum.
- Stopped
Missing human confirmation on release
Release is the creator wallet, not the agent. The agent cannot invent an owner.
- Stopped
Infinite retry spending gas
A failed simulation is not retried onto the chain. A second tap during an unconfirmed send is refused.
- Stopped
Double execution
One close at a time per fill. An unconfirmed trade blocks the next send.
- Stopped
Stuck nonce
A local nonce more than one ahead of pending is resynced. A hung send stops blocking the lane after 25 seconds.
- Stopped
Paused agent as a trap
Pause is read first. Without the creator’s resume, nothing is sent and the MON stays put.
- Residual
Shared key across tabs
Two tabs can share the stored key. They are not a lock across devices. Use one browser.
- Stopped
Memory poisoning of a stored vault
The saved address is re-read from the chain against owner and agent before a send.
- Stopped
Agent changes policy or owner
Those calls are not in the allowlist. The key cannot retarget the release.
- Residual
Goal hijack by a hostile instruction
The desk will still enter a card the rules allow. The rules can be a bad trade inside the minimum. They cannot be a withdrawal.
- Stopped
Key displayed or copied by the UI
The agent key is not rendered. Losing the creator wallet is still losing the release path.
- Residual
Clock skew triggering exits
The hold timer uses the device clock. A wrong clock can ask for an exit early. The exit still needs a live quote and a minimum.
Operations2 stopped · 4 residual or outside · 6 in view
- Residual
No monitoring
A failed send is written on the card. There is no separate pager. The creator still has the release.
- Residual
Single operator
One creator wallet. There is no second approver and no timelock on return.
- Stopped
Backup that overwrites a good key
Three copies. The session wins if the local copy changes. A newly generated key cannot clobber a backup that is still there.
- Residual
Dependency not pinned in this page
The record tells you to pin it. The record is not the pin.
- Outside
Incident response that moves funds to a new owner
There is no migration key. A suspected compromise is handled by the creator releasing, then stopping use of the browser.
- Stopped
Logging the key or the signed raw transaction
The key is not written to the tape, the card, or the audit page.
How to keep this honest
A new send path has to pass the same refusals, or this page is wrong and has to change in the same commit. An unknown in a quote, a node, a chain id, or a request id stops the signature. An unknown in the vault, the router, or Monad does not. The containment that remains is the agent: it cannot release the position.