Skip to content

Buy or accept

A listing and an offer are both settled by the other side in one transaction, the fill, and the one who sends it, the taker, pays the gas. As the buyer of a listing you pay the ask plus the marketplace fee in ETH and the bond is yours. As the holder accepting an offer you receive the amount in WETH, the bidder pays the fee, and the bond goes to them. This page walks through both. The button Buy Bond on a coffer’s page is another thing, the purchase of a fresh bond from its validator, see Buy a bond. How a listing and an offer come to exist is on List a bond and Make an offer, and the mechanism behind both is on How trading works.

A bond bought from another holder is the same bond as one bought from a coffer, with the terms it was minted with, and the checks on Before you buy apply in full. The one number the trade checks, the maturity value, binds the size of the claim and nothing about its backing. Two bonds with the same value can settle very differently, because what a claim can draw on is the coffer’s balance and its validator’s stake, and a coffer in default pays first come first served from whatever it holds. Read the coffer behind the bond, its coverage and its status, before you press anything. The app asks you to confirm those checks in a review before anything is sent, and the three boxes are in Review and confirm below. A matured bond is not traded in the app, so a buy card never shows on one.

On a listed bond’s page, with a wallet connected, the buy card sits above the offer card. Without a wallet the page shows the offer card alone, whose button connects one. The card reads Ask Price over the ask in ETH, with “Expires at maturity, …” under it, since a listing runs to the bond’s maturity. Two rows follow, Marketplace fee, which is 9 percent of your profit, and You pay, the ask plus the fee, which is what the transaction sends, exactly and with nothing to refund. Both figures are rounded up, so a figure read off the card is never short. Then the button Buy Bond.

You need ETH for the total plus gas. The card does not check your balance until you press. A press on a short wallet sends nothing and shows the red line “You need … ETH more, including the fee and gas.”, and the button stays held while the line shows. After gas means your balance less a reserve for the transaction at the current gas price, and the reserve is a cap and not a cost, the unused part is never charged.

Press Buy Bond and the Review Bond modal opens, “Review this trade’s terms and acknowledge the risks before buying.” At the top it recaps what you receive at unlock, the bond’s remaining maturity value, over the ask, the marketplace fee, what you pay and the maturity date. Under Please confirm before buying sit three statements, and all three must be ticked. Clicking a sentence ticks its box, the same as clicking the box itself.

  1. “I have verified that this validator’s withdrawal credentials point to its Coffer, and that its balance on both layers covers every bond outstanding, this one among them.”
  2. “I accept this trade’s terms, the ask and the marketplace fee I pay now, the remaining maturity value I will receive and the maturity date, all fixed at purchase, and I judge the validator’s buffer adequate for the time left.”
  3. “I understand that only the validator’s balance backs this bond, that penalties beyond the buffer, or a network-wide event that no buffer prevents, can leave it partly or fully uncovered, and that a defaulted Coffer pays first come first served from what it holds.”

The third one is the primary buy card’s third box word for word, because a bond bought here carries exactly the risk of one bought from its Coffer. The line under them, How to verify these: Before you buy, opens Before you buy in a new tab, where each box has its own section. Confirm in Wallet starts the purchase and Cancel closes the review with nothing sent.

Confirm in the review and the button walks five states. Checking… while the app asks the chain to estimate the fill from your account, Confirm in wallet while your wallet asks, Processing… while the transaction is in flight, Syncing… until your portfolio lists the bond, then Buy Bond again. The estimate matters, because a fill runs code the seller controls, and the gas limit you submit is the most that code can burn. The app submits the estimate plus 175,000 gas, never your wallet’s default, and a failed estimate is the fill’s own refusal, shown as a red note under the button with nothing sent and no wallet prompt.

On chain the contract checks, in this sequence, that you are not the seller, that the ask is above zero, that the seller’s nonces are current, and that the seller still holds the bond and has approved the marketplace. It checks that the listing has not expired, that the signature is the seller’s, that the bond is outstanding, that the signed maturity value equals the live one, and that your payment covers the ask plus the fee. Then it moves the seller’s nonce, so the listing can never be filled again. It sends the bond’s NFT to you, pays the ask to the seller in ETH, or in WETH if their wallet cannot take ETH within the gas the fill allows, and keeps the fee. The toast “Bond bought” appears at the receipt. If your portfolio does not list the bond in time, the card says “Transaction confirmed but server sync timed out. Please refresh.” and the bond is yours all the same.

Most refusals appear at Checking…, before your wallet opens, because the estimate runs the fill. “This listing was cancelled by its seller.” means the seller’s nonce moved, by a cancel or by an earlier fill. “The seller no longer holds this bond.” and “The seller has not approved the marketplace for this bond.” mean the seller’s side changed since the page loaded, and such a listing is hidden at the next check. “This listing has expired.” means the bond has matured. “The bond’s value changed after this listing was signed, so it is no longer valid.” means a redemption or a claim moved the remaining maturity value. “This bond is no longer outstanding.” means the bond was settled. “You cannot fill your own listing.” is the contract refusing a trade with yourself. “The signature is not valid.” and “The payment does not cover the price plus the fee.” should not appear from the app, since it sends the listing as it was signed and exactly the total. A transaction you decline in your wallet shows no red line. The button reads Rejected in wallet for a moment and is ready again. A wallet on another chain reads “Wrong network. Switch your wallet to …, then try again.” with the network’s name filled in.

The bond lands in your portfolio, its history gains the line Sold with the ask, and in Browse its Ask cell goes to a dash, since the listing is filled. The seller gets no toast, their page refreshes on its own. You are the holder now, with the bond’s maturity and claim, and you can list it in turn or accept offers on it. If you had an offer of your own on this bond, it stays live and the bond’s page says so, see Make an offer.

Nothing pops up when someone makes an offer on your bond. Your bond’s NFT card wears an Offer received pill while an offer is shown on it, in your portfolio and on the bond’s page, and only you see it. Browse and your portfolio show the best offer on each bond in the Offer column. The offers themselves are on the bond’s page, in the Offers table, which only the holder sees.

The table shows while you hold the bond and at least one offer is shown, headed Offers with ”… total” for the rows it shows, up to 50 of them. Each wallet appears once, since a better replacement supersedes the earlier one. Hidden offers are not in it. Each row is the amount in WETH, the bidder’s address, the time left in days and hours with the exact time on hover, and Accept. The rows are sorted by amount, the highest first, and you may accept any of them. The footer says who pays, “You receive the offer amount in WETH. The bidder pays the marketplace fee on top.” There is no fee row on your side, since the fee is the bidder’s.

Accepting needs the same approval as listing, the one Approve Marketplace grants for all your bonds, see List a bond. Without it the footer reads “Approve the marketplace above to accept offers.” and every Accept is held. Accept is also held while the approval is still being read, while another accept of yours runs, and on an expired row, whose time left reads “expired” until the row leaves the table. An offer of your own, made before you held the bond, shows as Your offer with Cancel in its place, since the contract refuses a trade with yourself.

Press Accept on the row you want. The row’s button reads ”…” from the press until the sync ends, while the app estimates the fill from your account, your wallet asks, the transaction is in flight and the page catches up. Every other Accept is held meanwhile. The gas limit is the estimate plus 175,000, for the same reason as on a buy, the bidder’s code can run inside your accept and the limit you submit is the most it can burn. A failed estimate is the fill’s own refusal, shown as a red note under the table with nothing sent. You send no ETH, your only cost is the gas.

On chain the contract checks, in this sequence, that you are not the bidder, that the amount is above zero, that the bidder’s nonces are current, and that you hold the bond and have approved the marketplace. It checks that the offer has not expired, that the signature is the bidder’s, that the bond is outstanding and that the signed maturity value equals the live one, and it computes the fee. Then it moves the bidder’s nonce, reads their WETH balance and allowance, and only now moves the amount from the bidder to you, the fee from the bidder to the marketplace, and the bond’s NFT from you to the bidder. The toast “Offer accepted” appears at the receipt, and the sync ends when the bond’s page shows a holder other than you. If that takes too long, the note “Transaction confirmed but server sync timed out. Please refresh.” shows under the table.

Again most refusals appear at the estimate, before your wallet opens. “The buyer’s WETH no longer covers this offer plus the fee.” means the bidder spent or moved their WETH, or lowered the allowance, since the page loaded. Such an offer is hidden within seconds, so the row is usually gone before you can press. “This offer was cancelled by its maker.” means the bidder’s nonce moved. “This offer has expired.” means the time ran out between the page and the chain. “The bond’s value changed after this offer was signed, so it is no longer valid.” means a redemption or a claim moved the remaining maturity value. “This bond is no longer outstanding.” means the bond was settled. “You do not hold this bond.” and “The seller has not approved the marketplace for this bond.” are about you, the bond moved or the approval was revoked. “You cannot fill your own offer.” is the contract refusing a trade with yourself, which the table prevents by showing Cancel on your row. “The signature is not valid.” should not appear from the app, since it sends the offer as it was signed. A transaction your wallet declined reads “Transaction was rejected by the user.”, and a wallet on another chain reads “Wrong network. Switch your wallet to …, then try again.”

The WETH is in your wallet. The wallet menu shows it on its WETH card, and Unwrap WETH there turns it back into ETH. The bond leaves your portfolio, its history gains the line Offer accepted with the amount, and the Offer received pill and the Offers table go with your holding. The other offers on the bond stay live for the new holder.

If your bond was listed when you accepted, the accept did not revoke your listing. It is no longer shown because you no longer hold the bond, a fill of it fails for the same reason, and the app shows you no cancel for it once you are not the holder. Its signature stays valid until the bond’s maturity all the same, at a nonce the accept did not move. If the bond ever comes back to you before then, the old ask is fillable again by anyone who kept the signed message. Press Cancel Listing before you accept if that matters to you. An offer of your own on the bond, made before you held it, is the mirror case and stays live for the next holder, see Make an offer.