what is obsrvtry
a sky without an edge. an observatory on a mountain logs the night one star after another, with no pause and no last number. you can find a star with your browser for free, or buy a dim one for a few dollars. every star ever recorded after yours pays you a share.
obsrvtry is an NFT collection on Robinhood Chain. every token is an observation: a real object of the deep sky, a star, a double, a cluster, a galaxy, a nebula. what it is, what colour it has and where it sits on the map all come from one thing: the hash that made it. nothing is uploaded, nothing is drawn by hand; the contract draws the plate itself.
observe. your browser looks for a hash below the mark of the moment. the
hash is your star. the more zero bits it has above the mark, the brighter it is. brightness is weight, and weight is
how much of every future purchase lands in your pocket. the sky never closes, it only gets darker.
three things obsrvtry does not have: a gate, a token, a watchman. nothing waits for a timer, nothing needs a bot to run, nothing is minted by the team ahead of you. the contract has no owner and no pause button. the one thing that reads the time is the fever, and it only ever makes the sky cool down.
quick start
for people who want a star and do not care how the sausage is made.
- open the map and press
connect. a wallet with Robinhood Chain is needed (MetaMask, Rabby, and friends). the site offers to add the chain if your wallet has never seen it. - press
observe. your browser starts looking for a star. the status line shows the speed and how long it should take at this pace. on the first rings a phone finds one in seconds, a laptop in a blink. - sign the transaction when a star is found. gas on Robinhood Chain costs a fraction of a cent. that is all a found star costs: gas.
- see it on the map. the site flies to your new star, opens its plate and puts a gold frame around it. its number, class, brightness and position are yours for good.
- come back and press
collectwhenever you like. every purchase made after your star put a share in yourwaiting. it never expires.
in a hurry, or the pace is too slow for your device? press or buy one. a bought record is a dim dwarf
with a place on the map like any other, and it earns like any other record of weight 1.
why it has value
the honest question about a collection with no last number: why would a star be worth anything if there can always be another one? four answers.
1. the sky gets darker
every 500 records, one ring of the galaxy, the mark doubles. ring 0 wants about a million hashes, a phone does that in a couple of seconds. ring 10 wants a billion, a phone needs most of an hour. ring 20 wants a trillion, a farm needs twenty minutes and a phone a month. ring 30 wants a quadrillion. the sky has no edge, but past a point nobody can reach it. the supply is bounded by physics, not by a number in a contract, and every star that exists sits on the near side of that wall.
2. every later star pays every earlier one
70 percent of every purchase and half of every royalty is split, at once, among all records that already exist: half of it equally, one share per record, and half by weight. every star gets a share, a bright star gets a bonus. the earlier your star, the more purchases happen after it, the more it earns over its life. an early star is a claim on the whole future of the sky. that is the same engine that put a floor under prspct: a paper that pays does not go to zero.
3. the object is the hash
class, colour, shape and place come from the hash, and the hash comes from work. a quasar or a planetary nebula cannot be bought, chosen or minted by the team: it can only be found, and only with a hash at least eight bits below the mark. the rare things are rare because they are hard, not because a table says so.
4. the map is the product
one galaxy grows record by record. early stars sit near the core, late ones on the outer arms. your star has an address you can send as a link. a collection that people open to look at, not only to trade, holds attention longer than a grid of thumbnails.
a sky without an edge
records are numbered from 1 upward without end. there is no total, no sold out, no phase two. the only gates are
openAt, the moment the sky starts taking records, and the mark, which rises forever.
rings
500 records make a ring: on the map they lie in one ring of the galaxy around the core, and the plate carries the ring's number. on the border of a ring two things step: the mark doubles (one more zero bit) and the price grows by fifteen percent. the ring is a label, not a gate. record 501 can be made in the same block as record 500.
what stops it
nothing stops it. the mark has a ceiling far beyond any hardware (200 bits above the base) and the price stops climbing after ring 64 (about 2.3 ETH per record). long before either, the pace of new records falls to a trickle: each new star is a real achievement or a real purchase, and both pay everyone who came before.
| ring | records | hashes a star needs | a phone (400 kH/s) | a laptop (4 MH/s) | a farm (1 GH/s) | price to buy |
|---|---|---|---|---|---|---|
| 0 | 1 to 500 | 2^20 | 3 s | instant | instant | 0.0003 ETH |
| 5 | 2 501 to 3 000 | 2^25 | 84 s | 8 s | instant | 0.0006 ETH |
| 10 | 5 001 to 5 500 | 2^30 | 45 min | 4.5 min | 1 s | 0.0012 ETH |
| 15 | 7 501 to 8 000 | 2^35 | 24 h | 2.4 h | 34 s | 0.0024 ETH |
| 20 | 10 001 to 10 500 | 2^40 | 32 days | 3 days | 18 min | 0.0049 ETH |
| 30 | 15 001 to 15 500 | 2^50 | never | 9 years | 13 days | 0.0199 ETH |
| 40 | 20 001 to 20 500 | 2^60 | never | never | 36 years | 0.0804 ETH |
work: find a star
the site builds a 120 byte message and hashes it with keccak256 over and over, changing only the last eight bytes (the nonce), until the result is below the mark. that is the whole miner. it runs in web workers, one per core minus one, so your browser stays usable.
message = "obsrvtry" | chainId (32 bytes) | observatory (20) | ringSeed (32) | you (20) | nonce (8) star = keccak256(message) found = star < 2^256 / 2^(baseBits + ring + fever)
the message holds your address, so a star found by you cannot be filed by anyone else. it holds the ring seed, a
block hash taken the moment the ring opened, so nobody can mine the next ring today. when you sign
observe(nonce) the contract recomputes the hash and checks it against the mark of that moment.
what work costs
gas and electricity. on Robinhood Chain a record costs well under a cent of gas. the electricity is the real price of a late star, and that is the point: it is what keeps the sky scarce.
buy: a dim one
send the price of the moment with observe and the contract records a purchase instead of checking a
hash. change comes back. observeMany(n) buys up to ten in one transaction, each at the price of its moment
(the site adds them up for you, including a ring border inside the batch).
a bought record has brightness 0 and weight 1. it gets a hash of its own (from the ring seed, its number and the buyer), and that hash picks its class from the bottom rung of the ladder, exactly like a found star of brightness 0: a dwarf, a star, a double, or now and then a comet. it has a place and a colour like any other record and it earns like any record of weight 1. what it cannot be is bright or rare.
who buys? people on a phone past ring 10, people who want ten records in one go, people who value their time over their electricity. and every purchase is the event that pays everyone else.
brightness and weight
brightness (magnitude on the plate) is how many zero bits your hash has above the mark. a hash that just scrapes under the mark is brightness 0. one that is twice as small is brightness 1, four times is 2, and so on. each step is twice as unlikely: a brightness 8 star is one in 256 among stars found at the same mark.
weight is 2 to the brightness, capped at 8 bits: 1, 2, 4, 8, 16, 32, 64, 128, 256. weight is your share of the weighted half of the till. the other half is split equally, one share per record, so a brightness 8 star earns 256 times what a dwarf earns from the weighted half, and exactly the same from the equal half.
| brightness | odds among found stars | weight | what it opens |
|---|---|---|---|
| 0 | 1 in 2 | 1 | dwarf, star, double, comet |
| 1 | 1 in 4 | 2 | + open cluster |
| 2 | 1 in 8 | 4 | + giant, globular |
| 3 | 1 in 16 | 8 | + elliptical |
| 4 | 1 in 32 | 16 | + spiral |
| 5 | 1 in 64 | 32 | + emission nebula |
| 6 | 1 in 128 | 64 | + barred spiral |
| 7 | 1 in 256 | 128 | + planetary nebula |
| 8 and up | 1 in 512 or rarer | 256 (cap) | + remnant, quasar |
the cap matters: a farm that finds a hash 20 bits below the mark gets weight 256, not a million. one lucky hash cannot own the sky.
overhype: the sky runs hot
the rings set the long slope of the night. the fever handles the bursts. every record, found or bought, adds 10 heat to the sky. heat cools by 20 every second. every 300 heat that has not cooled puts one more zero bit on the mark, twelve bits at most. heat itself is capped at 4 000, so no burst can leave a wall standing for longer than three minutes after it stops. that is the whole rule.
| who | records a second | what the sky does |
|---|---|---|
| a crowd of people, a few thousand an hour | under 1 | nothing: heat cools faster than it comes |
| the break-even pace | 2 | heat holds still, the mark does not move |
| a bot buying or a farm bursting | 20 | one more bit every 1.7 seconds, the wall of +12 bits in half a minute |
| after the burst stops | 0 | the fever fades one bit per 15 seconds, gone within three minutes however long the burst |
the map shows a red overhype chip with the extra bits and the seconds until the sky is cool. your
browser keeps looking through a fever; if the mark moves while a star is on its way, the site simply looks again.
the price is never touched by the fever: buying stays open at the ring's price, and every purchase pays the sky.
heat = min(4000, max(0, heat - 20 * secondsSinceLast) + 10 per record) fever = min(12, heat / 300) bits = baseBits + ring + fever
objects and rarity
the last byte of the hash picks the class from a ladder that depends on brightness. the brighter the hash, the more of the ladder is open. a bought record draws from the bottom rung, like a found star of brightness 0. fourteen classes:
| class | opens at brightness | what you see on the plate |
|---|---|---|
| dwarf | 0 | a point with a short cross in its spectral colour |
| star | 0 | a disc and rays that grow with brightness, spectral colour from blue to red |
| double | 0 | two stars of different colours, a few pixels apart |
| comet | 0 to 1 | a bright head and a dithered tail |
| open cluster | 1 | a scatter of blue-white stars |
| giant | 2 | a big disc with a halo and long rays in eight directions |
| globular | 2 | a dense core falling off into a ball of stars |
| elliptical | 3 | a smooth warm oval in three tones, tilted |
| spiral | 4 | gold arms with a dust edge and blue knots, seen at a tilt from the hash |
| emission nebula | 5 | a crimson cloud with a teal edge, dark pillars, hot stars inside |
| barred spiral | 6 | a spiral with a bar through the core |
| planetary nebula | 7 | a teal ring around a white dwarf |
| remnant | 8 | a torn shell in red and teal around a blue pulsar |
| quasar | 8 | a point with two straight jets |
colour is the spectral class, O B A F G K M, weighted toward the middle like a real sky. tilt, arm count, the gap of a double, the pillars of a nebula, the tail of a comet: all from bytes of the hash. two records of the same class never look the same.
the plate is 96 by 96 pixels, drawn by the contract from integer arithmetic on the hash. the site draws the same
object on the map with the same code; the prototype lives in the repository as art/plate.py and the
contract must match it byte for byte.
the map
one galaxy, growing. record number n lies at a radius proportional to the square root of
n, on one of four spiral arms chosen by its hash, with a little scatter also from the hash. early records
crowd the core; the newest are always on the rim. the galaxy gets bigger as the night goes on and never runs out of
room.
- drag to pan, wheel or pinch to zoom. far out, records are coloured points by class and brightness; close in, they become their plates.
- click an object for its card: plate, class, brightness, ring, weight, position, holder, waiting.
- find: type
No. 421to fly to a record, or paste an address to list what it holds. - my stars: every record your wallet holds, with waiting per record, one click to fly, one to collect all.
- the address bar keeps your place:
#No.421or#x,y,zoom. send it to a friend.
the map reads the chain directly through two public views, sky() and stars(from). no
server, no indexer, no account. the whole site is one file.
how the money flows
there is no pot that waits. every purchase is split the moment it arrives:
| from a purchase | share | to whom |
|---|---|---|
| the till | 70 % | every record made before this one: 35 % equally, 35 % by weight |
| the observatory | 30 % | the keeper (the author) |
| from a royalty (5 % of a sale) | share | to whom |
|---|---|---|
| the till | 50 % | every record that exists: 25 % equally, 25 % by weight |
| the observatory | 50 % | the keeper |
"equally" means the money is divided by the number of records; "by weight" means it is divided by the total weight
and each record gets its weight's worth. the contract keeps two running numbers, perRecord and
perWeight, the wei one record and one unit of weight have been owed since the beginning. your record's
earnings are the growth of those numbers since it was made, times one and times its weight. this is why a purchase
costs the same gas whether the sky holds ten records or ten million.
a new record does not share in its own purchase. the very first purchase of the sky goes to the observatory in full, because there is nobody to share with yet.
collecting
earnings sit in the contract until the holder takes them. collect(ids) pays out everything owed on the
records you list, in one transfer. the card shows waiting for one record; my stars shows the
sum and has collect all.
earnings belong to the paper, not to the person. sell a star and its future earnings, and whatever is still waiting on it, go to the buyer. that is deliberate: it is what makes a star with a history worth more than a fresh one, and it is what puts a floor under the price.
trading and royalties
obsrvtry is a standard ERC-721 with ERC-2981 royalties of 5 percent and the ERC721-C transfer validator that the marketplaces on Robinhood Chain honour. list and trade on any marketplace that supports the chain; OpenSea is the first.
half of every royalty is shared with every record in existence, forever, and half goes to the observatory. a lively
secondary market is therefore income for every holder, not only for the author. the plate's earned trait
updates live and shows what a record has made in its life.
receive() splits ETH the moment it arrives, and there is no
function to move anything else out. marketplaces pay royalties in the currency of the sale. on Robinhood Chain that
means: a listing bought in ETH pays its 5 percent in ETH, and the sky gets its half at once, with nobody in between.
an offer or a collection offer is settled in WETH, and a sale in USDG pays in USDG: those royalties are tokens, the
contract cannot receive them, and they are lost for good, to the sky and to the keeper alike. the collection's
secondary currency on OpenSea is set to ETH/WETH so that listings pay in ETH. nothing is hidden here: the choice is
a trustless split for ETH sales at the price of losing the royalty on WETH and USDG sales.every number
| thing | value |
|---|---|
| records | 1 and up, without end |
| ring | 500 records |
| mark | 2^256 divided by 2^(baseBits + ring + fever); baseBits 20 on the real sky |
| fever | heat / 300, at most 12 bits; heat is +10 a record, cooling 20 a second, capped at 4 000 |
| mark ceiling | baseBits + 200 bits |
| price | 0.0003 ETH times 1.15 to the ring |
| price ceiling | flat after ring 64 (about 2.3 ETH) |
| brightness | zero bits above the mark; 0 for a purchase |
| weight | 2 to the brightness, capped at 256 |
| purchase split | 70 % records (35 % equally, 35 % by weight), 30 % observatory |
| royalty | 5 % of every sale; 50 % records (25 % equally, 25 % by weight), 50 % observatory |
| first hour | 3 records an address, counted from the first record of the sky |
| after the first hour | no cap |
| purchases in one transaction | up to 10 |
| premint | none |
| owner, pause, upgrade | none |
farms, bots and the first hour
yes, farms will come. a GPU farm at 1 GH/s clears ring 0 in milliseconds per star and stays comfortable until page 20. the rules assume that and make it fair rather than pretend it will not happen.
- the first hour after the first record allows 3 records an address. a farm can rotate addresses, but each costs gas and time, and the hour ends. it exists to give humans the core of the galaxy, not to stop farms.
- the weight cap means a farm earns by making many records, not by one absurd hash. many records means many gas payments and, past ring 15, real electricity.
- the equal half of the till does not care about weight at all: a phone's dwarf and a farm's brightest star get the same coin from it. the farm's edge is only in the weighted half and in how many records it can make.
- farms pay everyone before them. every star a farm finds is a new mouth at the till, and its purchases (if it buys to keep up) pay you. a farm on ring 30 is the best thing that can happen to a record from ring 0.
- the fever is the only clock in the sky, and it only runs hot: bursts above two records a second raise the mark within seconds, and it falls back within minutes. a farm cannot sprint; it can only walk at the sky's pace, and the sky's pace is set by the rings.
- the seed is set the moment a ring opens, so nobody can precompute the next ring. the ring closes in the
same transaction as the 500th record; a bot watching for
RingOpenedgets the new seed as fast as anyone.
write your own miner if you like. the message layout is above, the target is target(), the seed is in
sky(). send observe(nonce) from the address in the message.
formulas and ABI
// the mark ring = count / 500 heat = min(4000, max(0, heat - 20 * dt) + 10 per record) fever = min(12, heat / 300) bits = baseBits + min(ring, 200) + fever target = type(uint256).max >> bits // the price price = 0.0003 ether * 1.15 ^ min(ring, 64) // brightness and weight brightness = zero bits of the hash above the mark weight = 2 ^ min(brightness, 8) // sharing: half of the till equally, half by weight perRecord += (till / 2) * 1e18 / count perWeight += (till / 2) * 1e18 / totalWeight owed(id) = (perRecord - debtR(id)) + weight(id) * perWeight - debt(id)
function observe(uint64 nonce) payable // work, or a purchase when msg.value >= price()
function observeMany(uint8 n) payable // up to 10 purchases
function collect(uint32[] ids) // take what your records earned
function keeperCollect() // the observatory takes its share
function sky() view returns (uint32 count, uint256 price, uint256 target, uint256 totalWeight,
uint256 perWeight, uint256 perRecord, bytes32 seed, uint256 heat, uint256 fever)
function heatNow() view returns (uint256)
function fever() view returns (uint256)
function coolsIn() view returns (uint256)
function stars(uint32 from) view returns (bytes32[] hashes, bytes magnitudes) // 500 at a time, 255 = bought
function waiting(uint32 id) view returns (uint256)
function starHash(address observer, uint64 nonce) view returns (bytes32)
function target() view returns (uint256)
function price() view returns (uint256)
event Observed(uint32 indexed id, address indexed observer, bytes32 star, uint8 magnitude, bool bought, uint256 paid)
event RingOpened(uint32 indexed ring, bytes32 seed, uint256 price, uint256 target)
event Shared(uint256 eth, uint256 perWeight, uint256 perRecord)
event Collected(uint32 indexed id, uint256 eth)
contracts
| contract | what | address |
|---|---|---|
| Observatory | records, the mark, the price, the till, collecting | not deployed yet |
| obsrvtry | the ERC-721 (symbol OBSRV), royalties, ERC721-C | not deployed yet |
| Plate | the press: draws the plate and the metadata | not deployed yet |
chain: Robinhood Chain, id 4663. explorer: robin.etherscan.io. the contracts are verified and have no owner functions beyond naming the transfer validator on the ERC-721.
the observatory
a mountain observatory at the end of the nineteenth century, one long clear night. the logbook is open and the entries go in one after another, and nobody knows how long the night will last. whoever wants a line in the almanac either sits at the eyepiece and finds a star (work), or pays the keeper for a line (a purchase). the keeper splits the money on the spot among everyone already in the book: the brighter your star, the bigger your cut of every line that follows. every five hundred lines the keeper draws one more ring on the chart: the telescope is stopped down, the sky is darker, the stars are further, the line costs more, but the pen does not stop.
faq
- is there a whitelist, a presale, a team allocation?
- no, no, and no. the team finds stars like everyone else, after
openAt, under the same first hour cap. - what does it cost to mint?
- gas, if you find a star. gas plus the price of the moment, if you buy.
- can i lose my star?
- only by selling or sending it. the contract cannot take it back; nobody can.
- what if my browser finds a star and the transaction fails?
- the site keeps the nonce and shows it. send again while the ring is the same. if the ring closed, the star is void and you look again.
- why is a bought record always dim?
- because brightness is proof of work, and a purchase has none. a bought record draws its class from the bottom rung (dwarf, star, double, comet), earns like any weight 1 record, and has its place and colour like any other.
- does the collection ever end?
- no. it gets darker. by ring 40 nobody alive can find a star and a purchase costs 0.08 ETH; new records slow to a trickle and each one pays everyone before it.
- where does the art live?
- in the contract. the plate is drawn from the hash on every
tokenURIcall. no IPFS, no server. - can i run my own miner?
- yes, see farms and formulas above. the site's miner is just the convenient one.
- why is the royalty receiver a contract, and what happens to WETH royalties?
- so that half of every royalty reaches the sky without anyone's hands on it. the price of that is real: the contract only understands native ETH, so royalties paid in WETH (offers) or USDG are lost. list in ETH, buy listings in ETH, and the sky gets paid.
- is the site a server?
- no. one HTML file on static hosting that talks to the public RPC. you can download it and open it locally.
glossary
| observation, record | one token, one line in the almanac |
| the mark | the number a hash must be below to count as a star |
| heat, fever, overhype | heat is +10 a record cooling 20 a second; fever is heat / 300 in extra bits, 12 at most |
| ring | 500 records, one ring of the galaxy on the map; the mark and the price step on the border |
| ring seed | a block hash taken when the ring opened, part of every hash of that ring |
| brightness, magnitude | zero bits of a hash above the mark |
| weight | 2 to the brightness, capped at 256; your share of the weighted half of the till |
| the till | the part of every purchase and royalty shared with the records |
| waiting | what a record has earned and not yet collected |
| the keeper, the observatory | the author's share and address |
| plate | the picture of a record, drawn by the contract from its hash |