Docs

How the desk works

LOOTBALE is an OTC desk for tokenized stocks on Robinhood Chain (chain id 4663). One contract, OtcOffers, holds sell offers in escrow. It has no owner, no pause and no upgrade, and the fee is fixed at 1%.

00Overview

Selling a large position through a thin order book pushes the price as it fills. On LOOTBALE a holder posts a fixed offer instead: a Robinhood Token, an amount, a USDG price and an expiry. The tokens are escrowed by the contract until filled or cancelled. A buyer takes all or part of the offer in one transaction: USDG moves to the seller and the desk, the stock tokens move to the buyer. No order book is moved.

Every number on the site is read from the chain in your browser. There is no database: the site reads the chain through a public RPC (lootbale.xyz/rpc forwards to the official Robinhood Chain RPC). The ledger of every offer, fill, cancel and fee withdrawal is on /proof.

01Create an offer

  1. Connect a wallet on Robinhood Chain that holds a Robinhood Token (NVDA and TSLA are listed; any other Robinhood Token address can be pasted).
  2. Enter the number of shares, your price per share in USDG, and the expiry (1, 7 or 30 days).
  3. Approve: lets the desk move exactly that amount of the token.
  4. Create: createOffer(token, amount, pricePerToken, expiry). The tokens move into the contract and the offer appears on the board.

The page converts shares to raw tokens and your per-share price to the per-token price the contract stores, using the token's live UI multiplier (see Pricing).

02Fill an offer

  1. Pick an open offer on the board. Check the token, both prices and the expiry yourself; DexScreener is linked as a reference.
  2. Enter shares, or press all. The page quotes the cost with the contract's own quote().
  3. Approve exactly that USDG cost (skipped if your allowance already covers it).
  4. Fill: fillOffer(id, amount). In that one transaction you pay the listed price, the seller receives 99%, 1% stays in the desk, and you receive the stock tokens.

If the offer was cancelled, sold out or expired before your transaction lands, the fill reverts (OfferNotActive or OfferExpired) and nothing moves except gas. A fill always executes at that offer's price; a seller cannot change the price of an existing offer.

03Cancel an offer

The seller can cancel the unfilled part at any time with cancelOffer(id); the remaining tokens go back to the seller. Only the seller can cancel. Offers expire: after expiry nobody can fill, and unsold tokens are not returned automatically, so the seller calls cancel to reclaim them. Filled parts are final.

04Fee

The buyer pays the listed price. 1% of it stays in the desk contract as the fee; the seller receives 99%. Anyone can call withdrawFees() to move the fee to the team wallet 0xFba2…0dC1.

FEE_BPS = 100 is a constant and the team wallet is immutable in the contract. Creating and cancelling carry no desk fee; every transaction pays network gas. The fee rounds down, so fills smaller than 0.0001 USDG carry no fee. The team calls withdrawFees() from time to time; there is also a button on /proof.

05Pricing: per token vs per share

Robinhood Tokens keep a fixed raw balance (18 decimals). Splits and dividends are shown through a UI multiplier (uiMultiplier): shares = raw tokens × multiplier. The contract stores the price per raw token, so an offer stays correct through a split. The site shows both numbers:

Example, NVDA with multiplier 1.000775. You sell 10 shares at 130.00 USDG per share.

valuecalculationresult
raw tokens escrowed10 ÷ 1.0007759.992256…
price per token (contract)130.00 × 1.000775130.100750 USDG
buyer pays for all9.992256 × 130.10075≈ 1,300.00 USDG
seller receives99%≈ 1,287.00 USDG

When the issuer schedules a new multiplier (newUIMultiplier at effectiveAt), the board shows when it changes. After the change the per-token price is the same and the per-share figure moves. Read both numbers before you fill.

06Which tokens are shown

The contract itself does not whitelist tokens: it accepts any ERC-20 except USDG. The board only shows offers whose token passes the beacon check: the token's EIP-1967 beacon slot (0xa3f0…3d50) must point to the Robinhood Token beacon 0xe10b6f6B275de231345c20D14Ab812db62151b00. Offers in other tokens still exist on-chain; the board hides them and states how many. Anyone calling the contract directly is not protected by this filter.

07Issuer controls

Tokenized stocks are issued by Robinhood and USDG by Paxos. Both keep admin powers the desk cannot override:

issuer actionwhat happens to offers
Robinhood pauses a tokenCreate, fill and cancel for that token revert. Escrowed tokens stay in the contract until unpause; nothing is lost. The board shows "transfers paused by issuer" and disables buttons. Cancel still works after unpause, even past expiry.
Robinhood adminBurn from the deskThe issuer can burn tokens from any address, including the desk escrow. The desk balance would fall below the open offers, and the last seller(s) of that token to exit could not withdraw in full. /proof shows desk balance vs total remaining per token.
Paxos pauses USDGFills and fee withdrawal revert. Sellers can still cancel (cancel only moves the stock token).
Paxos freezes a buyer or sellerThat address cannot fill or receive USDG from a fill. A frozen seller can still cancel.
Paxos freezes the desk addressAll fills stop and fee withdrawal fails. Sellers can still cancel and take their stock tokens back.

08Addresses

NetworkRobinhood Chain · chain id 4663
Desk contract (OtcOffers)published at launch
Team wallet (fee recipient)0xFba224eCf3e7d0c472E4C029f53B2561a6F70dC1
USDG by Paxos (6 decimals)0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168
Robinhood Token beacon0xe10b6f6B275de231345c20D14Ab812db62151b00
Project token CAat launch · 1 Nov, 15:00 UTC

The desk contract has no owner, no pause and no upgrade; the fee is fixed at 1%. Its source is verified on Sourcify (exact match). Only trust addresses posted on this site and on @lootbale.

09CLI

Everything the site does can be done with Foundry's cast against the public RPC. <DESK> is the desk contract address above.

Quote (no wallet)

cast call <DESK> "quote(uint256,uint256)(uint256,uint256)" <id> 1000000000000000000 --rpc-url https://robinhood-rpc.publicnode.com

Returns cost and fee in USDG base units (6 decimals) for 1 raw token of offer <id>.

Fill

cast send 0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168 "approve(address,uint256)" <DESK> <cost> --rpc-url https://robinhood-rpc.publicnode.com --interactive
cast send <DESK> "fillOffer(uint256,uint256)" <id> <rawAmount> --rpc-url https://robinhood-rpc.publicnode.com --interactive

Move fees to the team wallet (anyone)

cast send <DESK> "withdrawFees()" --rpc-url https://robinhood-rpc.publicnode.com --interactive

10The token

LOOTBALE also has a token on Pons; its contract address is published at launch, 1 Nov 2026, 15:00 UTC, here and on @lootbale. The token has no function in the desk: holding the token pays nothing and unlocks nothing; it is the coin of the project on Pons. Desk fees go to the team wallet, not to holders. The Pons creator fee (2%) goes to the creator wallet and pays for infrastructure.

11Risks

  • Robinhood can pause and burn. The issuer can pause transfers and adminBurn from any address, including this desk. A burn from the desk means the last seller(s) of that token to exit cannot withdraw in full. /proof shows balanceOf(desk) vs total open offers per token.
  • Paxos can pause or freeze USDG. A frozen buyer or seller cannot fill. A frozen desk address stops all fills and fee withdrawal. Sellers can still reclaim their stock tokens, since cancel does not touch USDG.
  • No token whitelist. The contract accepts any token. The board filters by the Robinhood Token beacon; people calling the contract directly are not protected.
  • Per-share price moves. The per-share figure shifts when uiMultiplier changes on a split or dividend; the contract price is per raw token.
  • Cancel race. A cancel can land before your fill; you lose gas only, never funds. Fills always execute at the quoted price for that offer id.
  • Fee handling. The fee is 1% of the USDG paid, held in the contract until anyone calls withdrawFees(), then sent to the immutable team wallet. Fills smaller than 0.0001 USDG carry no fee (rounding).
  • Expiry uses chain time. Unsold tokens are not returned automatically after expiry; the seller calls cancel.
  • Not professionally audited. Unit, fuzz and invariant tests, a mainnet-fork lifecycle test, and a Sourcify exact match only.
  • Thin liquidity. An offer may sit unfilled, and a position you buy may be hard to sell later. The site shows no reference price of its own, only a DexScreener link.