Verus Marketplace

A native, on-chain atomic-exchange protocol for identities, currencies, NFTs, rights, and other Verus assets. There is no marketplace operator holding funds: offers and acceptances are assembled and signed by the participants' own wallets.

Marketplace in brief

The Verus Marketplace is a native, on-chain atomic exchange. An offer states what its maker will deliver and what they want in return; the buyer's wallet constructs the matching transaction locally. Nothing is held by a marketplace operator: when the transaction is confirmed, payment and the asset move together or neither moves.

Worked example: buying tip@

This is the complete mainnet purchase made on 21 July 2026. It is a record to help you recognise each value and output; do not run the acceptance command below now because this offer is already closed. Start new purchases at Scan Verus Offers ↗, then replace every value with a current local getoffers result.

1. Look up the asset

First resolve the name. The identity address is the stable identifier to use with getoffers.

Command used
{
  "fullyqualifiedname": "tip.VRSC@",
  "identity": {
    "primaryaddresses": ["RJmcYhAATaiNLseh6KKB9aBnZvqLAjDJfo"],
    "name": "tip",
    "identityaddress": "iGte6ebLtER1wui2wwon3fLYKpknuLGCwD"
  },
  "status": "active"
}

2. Inspect the live offer before accepting it

At the time, this command returned offer transaction 3173d45e…f334610 and a price of 21 VRSC. Those are the two values copied into the acceptance request.

Command used
# Relevant values returned at the time
offer transaction: 3173d45e1edd0a064e7dd4bc85090b5fbced72ee5ce6940c54cbb6744f334610
asset received:     tip@
payment requested:  21 VRSC

3. Check the wallet address that will pay

The address must be controlled by your local wallet and have enough VRSC for the price and transaction fee.

Command used
{
  "balance": 39.00000000,
  "currencybalance": { "i5w5MuNik5NtLcYmNzcvaoixooEebB6MGV": 39.00000000 }
}

4. Build the acceptance locally — do not broadcast yet

The final true asks the wallet to return a transaction for review. It does not send it. This exact example assigns tip@'s primary address to the buyer's address.

Draft command used
{
  "tx": "0400008085202f89…"
}

5. Decode the draft and read what it will do

Save the draft result, then decode its tx field. The important outputs in this purchase were:

Decode command
{
  "vout": [
    { "value": 21.00000000, "addresses": ["RNW1mZKsWS2vhznzc2Z3DzBYKmgXY9MHPQ"] },
    { "identityprimary": { "name": "tip", "primaryaddresses": ["RJmcYhAATaiNLseh6KKB9aBnZvqLAjDJfo"] } },
    { "value": 29.00000000, "addresses": ["RJmcYhAATaiNLseh6KKB9aBnZvqLAjDJfo"] }
  ]
}

That reads as: 21 VRSC to the seller, the identity to the buyer, and 29 VRSC change back to the buyer. Stop if any recipient, amount, identity authority, or change address is not what you expect.

6. Broadcast the reviewed transaction, then verify ownership

Only after the decoded outputs are correct, run the same command with its final word changed from true to false. The returned ID is the transaction you can inspect locally and on Scan.

Broadcast command used
81d60eafce677f3c916b0c7b370331023182c7feb2c4056a6b34e0c116b8a07c

# Confirmed result
height: 4160183
primary address: RJmcYhAATaiNLseh6KKB9aBnZvqLAjDJfo
What to reuse: the sequence. What to replace every time: the asset name, identity address, offer transaction ID, amount, payment address, change address, and the identity definition you accept. Scan helps discover an offer; your local wallet is the source of truth before it signs anything.

Worked example: create an offer

This is a local draft made after buying tip@. It offers the identity for 21 VRSC and uses true, so it is only a reviewable transaction and was not posted. The important field that is easy to miss is for.address: it is where you want to receive payment.

Draft offer command used
{
  "signstatus": "complete",
  "hex": "0400008085202f89…"
}

To make your own offer, replace the funding address, change address, identity, payment address, and amount. Decode the returned hex before posting it:

Decode offer draft
Posting an offer: only after checking the identity, payment destination, amount, and expiry should you rerun the same makeoffer request with false instead of true and without > offer-draft.json. That publishes a live on-chain offer.

Close your offers

closeoffers closes offers that belong to your wallet. Calling it with no parameters closes expired offers; pass a list of offer transaction IDs when you want to close specific live offers.