Contract wallets
A contract wallet is a wallet whose address carries code, a Safe, a smart account, or an ordinary key that has delegated to code. Everything that is a transaction works from it as from any wallet, buying a listing, accepting an offer, the two approvals, a cancel, a transfer, a redemption. The one difference is signing a listing or an offer. A signature from an ordinary wallet names its signer by itself, a contract wallet’s does not. So the wallet’s code is asked whether the signature is its own, once when you sign and again by the contract at the fill. The mechanism is on How trading works, the fill on Buy or accept, and a message that stops being shown on Why an offer is not shown. The second half of this page is about wallets on a phone.
Signing a listing or an offer
Section titled “Signing a listing or an offer”The app asks your wallet for the same typed signature it asks any wallet for, the seven fields of the message, and your wallet signs it its own way. Your wallet’s own address is one of the fields, so the signature counts for that wallet alone and not for another account behind the same key. Several owners may have to confirm, and the app waits for the bytes the wallet returns. The bytes can be any length up to 2048, a Safe with three owners returns 195, and a Safe whose owners approved the message’s hash on chain returns none at all. Longer than that reads “Your wallet made a signature that is too long for the marketplace.”
Your wallet’s code is then asked the question the contract will ask at the fill, whether this signature is yours. A no reads “Your wallet’s code rejects this signature, so the marketplace could not accept your offer.”, with listing in place of offer for a listing. If the chain could not be reached to ask, the line reads “The marketplace could not verify your offer right now. Nothing was stored. Please try again.” Signing the same message again changes nothing. Listings and offers from contract wallets can be switched off for a time. The line then reads “The marketplace is not accepting this offer at the moment”, followed by “makers whose address has code are switched off.”
Afterwards, and at the fill
Section titled “Afterwards, and at the fill”The question is asked again every 12 seconds for every live listing and offer of yours. A no hides the message while it stays live, with the reason “your wallet no longer accepts the signature it gave” on the bond’s page. An owner rotated or a delegation moved are the ordinary causes, and the next yes brings the message back, so a change of mind costs nothing but a few seconds.
At the fill the contract asks your wallet’s code once more, with all the gas the taker gave the fill, and moves nothing until the answer is yes. A no costs the taker their gas and nothing else, and leaves your message live for the next taker. When a holder accepts your offer, the bond goes to your wallet without a question to its code, since the offer you signed already names the bond.
What a taker risks
Section titled “What a taker risks”A fill runs code the maker controls at the signature check. That code can burn gas and fail, and it can do nothing else, since the signature binds every field of the message and a failed fill reverts everything, the nonce included. The most it can cost the taker is the gas limit the taker submitted, which is why the app estimates the fill at the press and submits the estimate plus 175,000, never your wallet’s default. A seller’s wallet that cannot take ETH within 100,000 gas is paid in WETH instead, so a seller’s code cannot fail a fill either. The taker’s side is on Buy or accept.
Transactions from a contract wallet
Section titled “Transactions from a contract wallet”An approval, a buy, an accept, a cancel, a wrap, a redemption, each is a transaction your wallet sends its own way, with its owners’ confirmations where it needs them. The app waits for your wallet’s answer with the button reading Confirm in wallet, then for the receipt, however long that takes. Every write is pinned to the app’s chain, so a wallet on another chain sends nothing and reads “Wrong network. Switch your wallet to …, then try again.” with the network’s name filled in.
On a phone
Section titled “On a phone”The app runs in a phone browser as it is. On a narrow screen the bond’s page shows one pane at a time, NFT and Details, Details first, and you swipe or use the switcher above them. The wallet button sits at the top of the menu. There are two ways to connect. A wallet’s own in-app browser opens the app with the wallet already inside it, and the connect window lists it first as the installed wallet. WalletConnect, on since 2026-09-01, connects a wallet app on the phone to the app in an ordinary browser through a deep link into the wallet app, or a QR code when the app is on a desktop. The connect window offers five tiles, the installed wallet, MetaMask, Coinbase Wallet, Rainbow, and WalletConnect for every other wallet, Safe mobile and Ledger Live included.
A WalletConnect session runs through the Reown relay, end to end encrypted, and the relay sees the connection’s metadata. The makers of the connectors receive your IP address and the details of the connection, see the Privacy Notice. A wallet connected this way sends its transactions through its own RPC, so on the testnet it needs the chain added with an RPC it can reach, see Networks and addresses. On the wrong chain the header button reads Wrong Network and opens the chain window, and nothing is sent until the wallet is on the app’s chain.