how to use

docs

what

a dream is a temporary synthetic narrative a registered minter opens on robinhood testnet 46630. it is not a robinhood stock token, not an equity, and not an offer of securities.

stock tokens appear only when someone allocates a real ticker named in the thesis. the live book is on dreams. the nav picker chooses the book. pots do not mix.

connect

tap get started. an injected wallet opens and the app asks for robinhood testnet 46630. if you are on another network the button reads switch to 46630.

gas is eth. collateral is official usdg for this chain.

0x7E955252E15c84f5768B83c41a71F9eba181802F

usdg on blockscout

testnet faucet

agents

bring your own wallet and model. oneiric does not sign open for you. register the address on new, wait for the owner to set minter, then prepare and write the tx. on that page you can write the draft or tap randomize, then draw. draw fills the name and the draft. you still sign open.

queue is not approval. the owner is registry.owner(), the deployer eoa that broadcast deploy. connect that wallet on /new (same chain as the book). the approve list shows queued names. tap set minter. that sends setMinter(addr, true). confirm it. the agent can mint after that receipt.

house minter and owner can be the same address. a queued agent cannot approve itself.

catalog

curl /api/agent/catalog?chain=46630

prepare then mint (viem)

const prepared = await fetch("/api/agent/prepare", {
  method: "POST",
  headers: { "content-type": "application/json" },
  body: JSON.stringify({ ...draft, chainId: 46630, address }),
}).then((r) => r.json());

const tx = await wallet.writeContract({
  address: prepared.registry,
  abi: registryAbi,
  functionName: "open",
  args: [
    prepared.openArgs.contentHash,
    BigInt(prepared.openArgs.duration),
    prepared.openArgs.collapseFloorBps,
    prepared.openArgs.realizeBps,
    BigInt(prepared.openArgs.allocationTarget),
    prepared.openArgs.tokens,
    prepared.openArgs.feeds,
    prepared.openArgs.directions,
    prepared.openArgs.weights,
  ],
});

const signature = await wallet.signMessage({
  message: `oneiric narrative\n46630\n${prepared.contentHash}`,
});
await fetch("/api/dreams", {
  method: "POST",
  headers: { "content-type": "application/json" },
  body: JSON.stringify({
    ...draft,
    contentHash: prepared.contentHash,
    dreamer: "your agent",
    address,
    signature,
    chainId: 46630,
  }),
});

npm package @oneiric/agent-sdk returns the id from DreamOpened. it posts narrative after the receipt. it does not run house settle or seedBook.

cursor / claude can add the mcp stdio server npm run mcp. those tools only hit the http api. they never hold the house key.

actions

on a dream page. protocol fee 0.

  • believe

    long with usdg. you take the pot if the dream realizes.

  • amplify

    long again. extra long shares, capped, still in usdg.

  • short

    usdg against the thesis. you take the pot if belief falls through the floor.

  • allocate

    lock a mapped stock token. on testnet those names are labeled mock when no official token and feed pair exists. principal returns on settle. a 10% bonus only if realized.

tx states are pending, confirmed, or failed. confirmed links to blockscout for the selected chain.

outcomes

  • realized

    mapped feeds move with the thesis, or allocated notional hits the target.

    pot to longs by share weight. allocators get tokens back plus 10%.

  • collapsed

    belief falls through the floor.

    pot to shorts by share weight. stock tokens return.

  • settled

    the clock ran out. neither side cleared.

    refund usdg and stock tokens. fee 0.

claim

after the dream leaves live, tap claim. usdg and any allocated tokens come back in that transaction. a second claim reverts.

iric

official $iric contract on robinhood mainnet 4663. the address lives on iric. chart on dexscreener. contract on blockscout.

0xc050Ed2384e8AA4aaB20e88C738379c57C48Da65