Whitepaper · Version 1.0 · 2 October 2026
AdSkyline
An economic protocol on Solana, built on 318 Manhattan landmarks.
#01Abstract
AdSkyline is an economic protocol on Solana. Its 318 assets are Manhattan's landmarks, each one an NFT. Every landmark pays its owner three ways:
- Trading fees. A share of the protocol's trading fees, in SOL. Every buy and sell of $SKY in its pool pays 5%; 2% of the volume goes to building owners.
- Emission. A share of the 10,000,000 $SKY minted every day.
- Ad rent. Rent, in $SKY, from the ad space the building carries on the map.
The token, $SKY, started at 1,000,000,000 and was put in full into one Meteora pool against SOL, with the liquidity locked for good. Nobody received tokens at the start: there was no team allocation, no presale and no airdrop. Buildings Nos. 11 to 318 are bought with SOL: in one transaction the SOL buys the building's price in $SKY from the pool and the program burns it. If all 308 sell, 477,373,888 $SKY are burned, 47.74% of the starting supply. Nos. 1 to 10 were auctioned for SOL over the first 24 hours.
Each building's share of the rewards is fixed by its place on a price ladder and never changes. A building nobody owns earns nothing: its share of the emission is never minted and its share of the fees goes to the developer. Bonds let anyone buy $SKY from the program with SOL that becomes permanently locked liquidity. Owners rent out their ad spaces for $SKY. Buildings resell on the site's own market or on any NFT marketplace.
The program went live on 2 October 2026. Its admin key was given up the same evening and its upgrade authority removed, so no one, the developer included, can change a rule, pause anything, mint outside the rules or take the locked liquidity.
#02The map
The protocol lives on a 3D Manhattan rebuilt for the web browser, from the Battery to Inwood. You can fly over it, drop to street level, and watch it go from day to dusk to night. Every landmark stands on a shaft of light: click one and the panel shows its number, its terms, its NFT and its ad spaces.
2.1 What was built
| Part | Count | Notes |
|---|---|---|
| Ordinary buildings | 44,168 | From the city's footprint and 3D data, each with its real height and roof shape. About 4.5 million triangles in 208 tiles that load as you move. |
| Landmarks | 318 | Modelled one by one, from the Empire State Building to the Dakota. Facades generated to match photographs: window grid, materials, setbacks, crown. 7.4 million triangles, about 23,000 per building. |
| Triangles in all | ~12,000,000 | The whole island comes to about 110 MB. |
| Street trees | 130,782 | Each placed where the city's tree census found it. |
| Bridge spans | 21 | Brooklyn, Manhattan, Williamsburg, Queensboro, George Washington, RFK and the Harlem River bridges, with 1,956 lamps lit at night. |
| Cars, parked and moving | ~142,000 | |
| Street lamps | ~24,000 |
The rivers, the shoreline, Central Park's paths and lakes, sidewalks, plazas and medians come from city survey data. Lit windows at night and the light of the sun at dusk are worked out per building.
2.2 Data and credits
| Source | Used for | Terms |
|---|---|---|
| NYC Building Footprints (NYC Open Data) | Every building's outline and height | NYC Open Data terms of use |
| NYC 3D Building Model, CityGML (NYC DoITT) | Roof shapes and massing | NYC Open Data terms of use |
| NYC Planimetric Database | Roadbeds, sidewalks, medians, plazas, park features, inland water, bridge structures | NYC Open Data terms of use |
| 2015 NYC Street Tree Census | The 130,782 trees | NYC Open Data terms of use |
| NYC borough boundaries; US Census TIGER water areas | Shoreline and water | NYC Open Data; US Census (public domain) |
| OpenStreetMap | Building parts, names, park interiors | ODbL; © OpenStreetMap contributors |
| Wikimedia Commons | Reference photographs of every landmark | Each photograph's own licence, credited individually on the site |
#03The token
$SKY is a plain SPL token. It has no transfer fee, no freeze authority and no hooks: sending it from one wallet to another costs nothing beyond Solana's network fee, and it trades on every Solana terminal through its pool.
| Mint | 5q96w5CcRWZYzrzXHwwx6r1KBf77devYsoH5cougd5Po |
|---|---|
| Starting supply | 1,000,000,000 $SKY |
| Decimals | 6 (one $SKY = 1,000,000 base units) |
| Mint authority | The program's config account (a program address with no private key). Only the program's rules can mint. |
| Freeze authority | None. The program refused to be set up with a mint that had one. |
| Distribution at launch | All 1,000,000,000 into the pool. No team allocation, no presale, no airdrop. |
| Technical ceiling | 100,000,000,000 $SKY; nothing is ever minted past it |
Every $SKY outside the pool was bought from the pool, earned by a building, or bonded. The supply can grow in exactly two ways, both in the program: the daily emission to building owners (section 7) and bonds (section 8). It shrinks when buildings are bought (section 5), and whenever a holder burns tokens of their own accord.
#04The pool and the fee
$SKY trades in one Meteora DAMM v2 pool (Meteora's program cp-amm), $SKY against wrapped SOL. The pool charges 5% on every trade, buys and sells alike, and takes it in SOL only: on a buy the fee comes off the SOL going in, on a sell off the SOL coming out. When the program was pointed at the pool it checked all of this: the right two tokens, plain SPL tokens on both sides, fees in SOL only, a fee of exactly 5%, a pool open for trading, and every unit of its liquidity permanently locked.
The launch liquidity, all 1,000,000,000 $SKY and the launch SOL, is the program's own position in the pool. The position's NFT is held by the program's config account, the program has no instruction that removes liquidity, and the liquidity was moved into Meteora's permanent lock, which nothing in Meteora's program can undo. Bonds add to the same position and lock what they add.
4.1 Where the 5% goes
Meteora's program keeps a fifth of every pool's trading fees. At a 5% fee that is 1% of the trade, and 4% reaches the liquidity. The program collects its position's fees (harvest) and splits them in half: one half to building owners, one half to the developer.
| Share of every trade | Of volume | Goes to |
|---|---|---|
| Building owners | 2% | The owners' vault, credited to buildings by weight; claimed in SOL by each NFT's holder |
| Developer | 2% | The treasury wallet, plus the unsold buildings' part of the owners' 2% |
| Meteora | 1% | Meteora's protocol fee (0.8% when 0.2% comes back to the developer as a referral) |
The 4% assumes the program's position is all the liquidity. Meteora pays a position's fees in proportion to its share of the pool's liquidity. Anyone may add liquidity of their own to the pool, and their position then earns its share of the fees, which the program never sees. At the time of writing (2 October 2026, evening UTC) the program's locked position held about 96% of the pool's liquidity.
Fees handed in by anyone else go through the same split with deposit_fees: for example the fees of a liquidity position the program does not own, should its holder choose to share them.
#05Buildings
The 318 landmarks are numbered 1 to 318. Nos. 1 to 10, the best-known names, were sold by auction in SOL (section 6). Nos. 11 to 318 are bought from the program by burning $SKY. Each building is sold once by the program; after that it changes hands as an NFT.




Figure 3. Four of the 318 NFT pictures. Each is one render of the building from the 3D map.
5.1 The price ladder
No. 11 lists at 5,000,000 $SKY, 0.5% of the starting supply. Each next building costs 1% less than the one before. The program works the ladder in base units and rounds down at every step:
price(No. 11) = 5,000,000 $SKY
price(No. n+1) = ⌊ price(No. n) × 9,900 ∕ 10,000 ⌋base units, for n = 11 … 317
so price(No. n) ≈ 5,000,000 × 0.99n−11 $SKY
| Building | List price, $SKY | Share of rewards | $SKY a day, all sold |
|---|---|---|---|
| No. 11 | 5,000,000 | 0.857% | 85,748 |
| No. 25 | 4,343,729 | 0.745% | 74,494 |
| No. 50 | 3,378,645 | 0.579% | 57,943 |
| No. 100 | 2,044,101 | 0.351% | 35,056 |
| No. 150 | 1,236,693 | 0.212% | 21,209 |
| No. 200 | 748,207 | 0.128% | 12,832 |
| No. 250 | 452,670 | 0.078% | 7,763 |
| No. 318 | 228,547 | 0.039% | 3,920 |
| All of Nos. 11–318 | 477,373,888 | 81.87% | 8,186,810 |
The prices are in $SKY, so what a building costs in SOL or dollars moves with the price of $SKY. All 308 together list at 477,373,888 $SKY (477,373,887.58 exactly), 47.74% of the starting supply.
5.2 Weights and shares
Every building has a weight, and its share of all rewards (emission and the owners' fees alike) is its weight divided by the total of all 318 weights:
weight(No. n) = price(No. n)Nos. 11–318
weight(No. n) = 2 × ladder(No. n)Nos. 1–10: the 1% ladder continued upward from No. 11, then doubled
ladder(No. n−1) = ⌊ ladder(No. n) × 10,000 ∕ 9,900 ⌋
share(No. n) = weight(No. n) ∕ W, W = Σ weight = 583,101,242.903906 $SKY
No. 1 weighs 11,057,274 and holds 1.896% of all rewards, about 2.2 times what No. 11 holds. The ten auctioned buildings together hold 18.13%. The total weight is fixed in the program at setup, so a building's share is the same whether 1 building is sold or all 318.
| Building | Weight | Share | $SKY a day, all sold |
|---|---|---|---|
| No. 1 · Empire State Building | 11,057,274 | 1.896% | 189,629 |
| No. 2 · Chrysler Building | 10,946,701 | 1.877% | 187,732 |
| No. 5 · Flatiron Building | 10,621,573 | 1.822% | 182,157 |
| No. 10 · Guggenheim Museum | 10,101,010 | 1.732% | 173,229 |
| Nos. 1–10 together | 105,727,355 | 18.13% | 1,813,190 |
Payback in emission. For a burn building, price and weight are the same number, so every one of them earns its list price back in $SKY emission after the same time: W ∕ 10,000,000 = 58.3 days, if all 318 are owned. While some are unsold each owner earns exactly the same, because an unsold building's share is simply not minted.
5.3 Release and the wallet limit
- All of Nos. 11 to 318 went on sale together, 10 minutes after the launch call (RELEASE_SECS = 600).
- One wallet can buy at most 5 buildings from the program. The count is kept in a per-wallet account and never goes down. Auction wins and purchases on any market do not count.
- Building sales could be paused only by the admin key, which no longer exists. They cannot be paused now.
5.4 Buying with SOL, in one transaction
The buyer pays SOL and nothing else. The site puts four steps in one Solana transaction, so they all happen or none does:
The program's part (buy_building) does not care where the $SKY came from: it burns the list price from the buyer's token account. The swap is the buyer's own trade in the pool, so it pays the 5% fee like any trade and feeds the fee split. The quote the site shows is worked out with Meteora's own arithmetic; the most the swap may take is that quote plus 1%. The site names the developer's wrapped-SOL account as Meteora's referral on these swaps whenever that account exists; Meteora then returns 0.2% of the swap's volume to it out of Meteora's own cut. (At the time of writing the account did not exist, so no referral was being paid.)
A building starts earning the moment it is sold, not from the launch: the program records the reward accumulators at the moment of sale (section 7.3).
5.5 The NFT
- Standard. Metaplex Core: one asset per building, all in one collection named AdSkyline (6ycWr1…8bC). The collection's update authority is the program's config account, and the program has no instruction that changes an asset's name or link, so neither can ever change.
- Name and link. Set by the program from the building's number alone, so a cheap building cannot be dressed up as another: name AdSkyline No. n, link https://www.adskyline.xyz/nft/n.json.
- Metadata. The JSON at that link gives the display name (for example "No. 1 · Empire State Building"), a description, the picture (one 1000 × 1000 render from the map) and these attributes: Number, Sale (auction or burn), Share of rewards, Ad spaces, Neighbourhood, Address, Height and Completed.
- Royalty. The collection carries a 5% royalty to the developer's wallet, which marketplaces that follow the standard may charge. It is not enforced: a plain transfer between wallets pays nothing.
- The owner is whoever holds it. Every instruction that pays or acts for an owner reads the asset's current holder, so a building sold anywhere works for its new holder at once.
5.6 A destroyed NFT
A holder can destroy (burn) a building's NFT. The building would then earn for nobody, so anyone may call release_burned: the program checks that the asset no longer exists, removes the building's weight from the sold total, closes its account and puts it back on sale as if it had never been sold: at its list price for Nos. 11–318, or back to auction for Nos. 1–10 (the auction's 24 hours are long past, so it stays open until a first bid and ends 10 minutes after it). SOL fees credited to it and never claimed go to the developer. The caller gets the closed account's rent.
One consequence: a building sold again this way burns its price again. The 477,373,888 $SKY figure is the burn when each building is sold once.
#06Auctions
Nos. 1 to 10 were sold by auction in SOL. Nothing is burned in an auction; the winning bid goes to the developer. An auctioned building then earns by its doubled weight like any other building.
- All ten auctions opened at the launch call and were scheduled to run 24 hours (AUCTION_SECS = 86,400).
- Bids are in SOL and start at 1 SOL. Each bid must be at least 5% higher than the one before (and at least one lamport more).
- The bid is held in the auction's own account. The bidder who is outbid is paid back in the same transaction.
- A bid in the last 10 minutes moves the end to 10 minutes after that bid.
- After the end anyone can settle: the NFT goes to the highest bidder, the bid to the developer, and the auction's account is closed (its rent goes to whoever settles, who pays for the building's account).
- An auction nobody bid in stays open. The first bid after the 24 hours ends it 10 minutes later.
- Pausing building sales never stopped the auctions; they ran on their own clock from the launch.
least next bid = 1 SOLif nobody has bid
least next bid = bid + max(⌊ bid × 500 ∕ 10,000 ⌋, 1 lamport)otherwise
if end − now < 600 s: end ← now + 600 s
A top-10 building is resold like any other, by listing it (section 10); its auction never runs again unless its NFT is destroyed (section 5.6).
#07Rewards
Two streams are shared by weight among buildings that have an owner: the daily emission of new $SKY and the owners' half of the trading fees, in SOL. The third stream, ad rent, is paid directly by advertisers (section 9).
7.1 Emission
10,000,000 $SKY a day (1% of the starting supply), with no end date. Each unit of weight earns the same amount per second, so a building earns share × 10,000,000 $SKY a day from the moment it is sold. The share of a building nobody owns is never created, so the emission actually minted is 10,000,000 × (sold weight ∕ W) a day. It is minted when the holder claims, not before.
7.2 Fees
Every harvest or deposit of fees splits the amount in half. The owners' half is credited to all 318 buildings by weight; the vault receives the part that belongs to sold buildings (rounded up, so it always holds what it owes), and the part that belongs to unsold buildings goes straight to the developer with the other half.
7.3 How the program keeps the books
The program never loops over buildings. It keeps two running totals, acc_sky and acc_sol: what one unit of weight has earned since the start, scaled by 1018. Each building records the totals as they stood when it last claimed (or when it was sold). What it is owed is its weight times the difference.
acc_sky += ⌊ 10,000,000 × 106 × 1018 ∕ W ⌋ × Δt ∕ 86,400W in base units; brought up to date at every purchase, settlement, claim and release
acc_sol += ⌊ fees ∕ 2 ⌋ × 1018 ∕ Wat every harvest or deposit
owed $SKY = weight × (acc_sky − sky_paid) ∕ 1018
owed SOL = weight × (acc_sol − sol_paid) ∕ 1018
on sale and on each claim: sky_paid ← acc_sky, sol_paid ← acc_sol
7.4 Claiming
- Only the wallet that holds the building's NFT at that moment can claim. The program reads the holder from the asset itself.
- There is no fee and no deadline. Rewards build up every second and keep building up until claimed.
- Unclaimed rewards go with the NFT when it changes hands. A seller who wants them claims before the sale.
- $SKY is minted to the holder's token account; SOL is paid from the owners' vault, never more than the vault holds above its rent minimum (anything short stays owed; with the vault's rounding up this does not happen in practice).
- Emission that would take the supply, with bonded tokens still unlocking, past 100,000,000,000 $SKY is not minted and not owed later.
7.5 Unsold buildings
A building nobody owns earns nothing. Its share of the emission is never minted; its share of the owners' fees goes to the developer at each harvest. This is why a building's income does not depend on how many others are sold.
7.6 Harvest
The trading fees sit in the pool until someone collects them. harvest can be called by anyone: it claims the program's position's fees from Meteora into a temporary wrapped-SOL account, unwraps them, and puts them through the split. The caller puts up that account's rent for the length of the call and gets it back. The keeper (section 12) calls it every 15 minutes when there are fees waiting. It works even if Meteora's operators disable the pool, since Meteora does not stop fee claims.
#08Bonds
A bond is a way to buy $SKY from the program instead of from the pool. The bonder pays SOL and receives $SKY that unlocks evenly over 24 hours, at the market rate, plus a bonus only when the pool has grown. There is no price impact and no slippage on the bonder's side, up to a daily cap. The SOL becomes liquidity locked in the pool for good. Bonds opened 1 hour after the launch call.
8.1 The rate
P = max( spot↑, daily average, fast average )lamports per base unit; spot from the pool's sqrt price, rounded up
out = ⌊ ⌊ SOL in ∕ P ⌋ × (10,000 + bonus) ∕ 10,000 ⌋bonus in hundredths of a percent, 0 … 2,000
Using the highest of the three prices means that pushing the pool's price down for one transaction before bonding buys nothing. Pushing it up only lowers the bonder's own amount, which the bonder guards with a minimum amount out.
8.2 The bonus
The bonus rewards a pool that has grown, and only that. It equals how far the pool's SOL stands above its one-day average, capped at 20%. If the pool has not grown, there is no bonus. Bonders who sell shrink the pool and switch their own bonus off.
sol′ = min( slow SOL, SOL in the pool now )
bonus = min( (sol′ − average SOL) ∕ average SOL, 20% )0 if sol′ ≤ the average
8.3 The daily cap
Bonds can create between 10% and 20% of the current supply a day. The cap is 10% when the price is at or below its daily average and rises in a straight line to 20% when it is 25% or more above it. The allowance refills evenly through the day rather than all at once: what has been used drains away over 24 hours, so two days' allowance cannot be taken a second apart, and at most about twice the allowance can be bonded within any 24 hours.
p′ = min( slow price, spot ), above = min( (p′ − daily average) ∕ daily average, 25% )
cap = supply × (10% + 10% × above ∕ 25%)10% if p′ ≤ the average
used ← used − max(used, cap) × min(Δt, 1 day) ∕ 1 day, then used + out ≤ cap
An example, with made-up numbers. Spot price 0.000000200 SOL per $SKY, daily average 0.000000180, fast average 0.000000210, slow price 0.000000190. Pool SOL 60, slow SOL 57, average SOL 50. Supply 1,000,000,000.
Price used: 0.000000210 (the fast average). Bonus: (57 − 50) ∕ 50 = 14%. A bond of 1 SOL: 1 ∕ 0.000000210 = 4,761,904 $SKY at market, × 1.14 = 5,428,571 $SKY, unlocking over 24 hours. Cap: the slow price is 5.55% above the average (the program counts in hundredths of a percent, rounding down), so the cap is 10% + 10% × 5.55 ∕ 25 = 12.22% of supply, 122,200,000 $SKY a day.
8.4 The three averages
Meteora's pool keeps no average of its price, so the program keeps its own figures, updated whenever it looks at the pool: on every purchase, bid, claim, bond and poke. Updates less than a minute apart are left to add up.
| Figure | Moves up | Moves down | Used for |
|---|---|---|---|
| Daily average (price and pool SOL) | Toward the current value by Δt ∕ 86,400 of the gap, Δt counted at most 3,600 s per update: a price pushed for a moment moves it by 1/24 at most | Bond price floor; the base of the bonus and the cap | |
| Fast average (price) | To the price at once | By at most 1/60 of the gap a minute | Bond price floor after a fast rise |
| Slow figures (price and pool SOL) | By at most 1/60 of the gap a minute | To the current value at once | The bonus and the cap: growth has to last to count |
Liquidity added for one transaction, or a price pushed up for one, moves neither the bonus nor the cap. A price pushed down while nobody else calls the program gains under 2% a minute on the fast average, and any honest call puts it back. These figures only move when the program looks at the pool, which is why a keeper pokes it every minute (section 12): without it they would rise too slowly, and the bonus would stay at 0 and the cap at 10%.
8.5 Vesting and a second bond
The $SKY unlocks evenly over 24 hours and is minted as the bonder claims it (claim_bond). A new bond from the same wallet first pays out what has unlocked, then restarts the 24 hours for the rest plus the new amount. Tokens promised but not yet minted count toward the 100B ceiling.
8.6 Where the SOL goes
The program wraps the SOL and swaps a little over half of it for $SKY through the pool: the exact part is worked out so that what is bought and what is left go into the pool together with little to spare (the fee comes out of the swapped part, and the swap moves the price). With a = 1 − fee = 0.95 and M the pool's SOL as its liquidity sees it:
x = 2L ∕ ( (1 + a) + √( (1 + a)² + 4a²L ∕ M ) )L = lamports to put in; x = lamports swapped, ≈ 0.513 L for a small bond
The swap must return at least 99% of what the pool's state, read in the same instruction, says it will, or the bond is refused. Both halves are then added to the program's position and the added liquidity is locked permanently (liquidity added to a locked position is not locked by itself, so the program locks it explicitly). Any dust left over waits in the program's two accounts for the next bond. A pool that Meteora's operators have disabled cannot take liquidity, so bonds are refused while it is.
#09Ad spaces
Each of the ten auctioned buildings has 2 ad spaces; every other building has 1. That is 328 spaces. On the map an empty space is a framed board with a soft glow by day and a neon outline at night; a rented space shows the advertiser's image on the building, lit at night, and larger on a board on the building's shaft of light. All 328, with their asking prices, the ads showing and the offers waiting, are in the Ad market on the site.
9.1 The money side, in the program
- The holder of the building sets an asking price per space, in $SKY. A price of 0 takes the space off the market (an ad showing stays).
- Anyone makes an offer in $SKY: at least the asking price, and if an ad is showing, at least 10% more than it paid. The program holds the $SKY in escrow. One offer per wallet per space; the offerer can take it back at any time before it is accepted.
- The holder accepts an offer, stating its amount (so an offer swapped for a smaller one just before is refused). 5% (rounded up) goes to the developer, 95% to the holder, and the offerer becomes the space's renter.
- An accepted ad keeps its space for 3 days. After that the holder may accept a new offer only if it pays at least 10% more than the ad showing (and meets the asking price). The renter who is replaced gets nothing back.
- If the building has changed hands since the ad was accepted, the new holder can clear the ad once its 3 days are over; the next ad then only has to meet the asking price. So a seller cannot lock a space by accepting a huge offer from himself before selling.
9.2 The picture side, on the site
The program keeps only the money: the asking price, the offers in escrow, who rents each space, what they paid and since when. What is shown, an image and an optional link, is the website's business. The site's ad server lets the wallet recorded as renter post its ad:
- The advertiser signs a message with the renting wallet; the server checks the signature and reads the space's account on Solana: the signer must be the renter and the space must be paid for. A signed message is good for 10 minutes and cannot be used twice.
- Images: PNG or JPEG, twice as wide as tall (2:1, within 2%), at least 512 × 256, under 1 MB. Links up to 200 characters. The site checks these before upload.
- Images are stored by their content hash and served from public storage. An ad shows only while the chain still names its poster as renter: once the space is re-rented or cleared, the old ad disappears.
- Moderation is a block list kept by the site, since the program has no keys left to hide anything. A block applies to one renter's ad in one space.
#10The market
Buildings resell on the site's own market, built into the program, for all 318 alike.
- List. The holder lists the building at any price in SOL, 0.02 SOL at least, and can change the price at any time. The NFT stays in the holder's wallet and goes on earning; the holder can still claim. The program is named as the one allowed to move the NFT, using Metaplex Core's TransferDelegate plugin. A delegate left by another marketplace is replaced.
- Cancel. The seller takes the listing down; if the seller still holds the NFT, the program's right to move it is removed again.
- Buy. The buyer pays the listed price, stating it (so a price raised just before is refused). 5% (rounded up) goes to the developer, the rest to the seller, and the NFT moves to the buyer in the same transaction. The transfer itself removes the program's right to move it. Rewards the seller has not claimed go with the building.
- Stale listings. If a listed building is sold or moved elsewhere, its listing here stops working; the new holder can list it afresh.
A building is an ordinary Metaplex Core NFT, so it can also be sold on outside marketplaces. The collection carries a 5% royalty to the developer there, which those marketplaces may or may not charge.
developer = ⌈ price × 500 ∕ 10,000 ⌉, seller = price − developer, price ≥ 0.02 SOL
#11Supply
Three things move the supply of $SKY:
| Mechanism | Direction | Size |
|---|---|---|
| Building purchases | Burn | Each building's list price, once per sale: 477,373,888 $SKY (47.74%) if all of Nos. 11–318 sell once |
| Emission | Mint | Up to 10,000,000 $SKY a day, forever; only the owned share is minted, when claimed |
| Bonds | Mint | Up to 10–20% of the supply a day, refilling evenly; paid for with SOL that is locked in the pool |
Nothing is ever minted past 100,000,000,000 $SKY. That is a technical ceiling, so the arithmetic can never run out of room; it is not a target.
| Day | Supply, $SKY | Against the start |
|---|---|---|
| 0, after the sales | 522,626,112 | 52.3% |
| 30 | 822,626,112 | 82.3% |
| 90 | 1,422,626,112 | 142.3% |
| 180 | 2,322,626,112 | 232.3% |
| 365 | 4,172,626,112 | 417.3% |
| 730 | 7,822,626,112 | 782.3% |
| ~9,948 (27 years) | 100,000,000,000 | the ceiling |
The emission is a fixed amount a day, not a percentage of supply, so it adds the same 10M a day however large the supply grows; as a share of supply it shrinks year by year.
Live, read from Solana when this page opened
- Supply
- …
- Buildings sold by the program
- …
- Burned by purchases
- …
- Emission minted (claimed)
- …
- Fees harvested
- …
- SOL in the pool
- …
- Admin key
- …
#12The keeper
The keeper is a small always-on process with two jobs, both open to anyone and neither needing any authority:
- Poke, once a minute. The program's averages and slow figures move only when it looks at the pool, at most once a minute and by at most a minute's worth. A poke a minute keeps them current, so the bond's bonus and cap follow real growth.
- Harvest, every 15 minutes when there are fees to collect, so owners' SOL reaches the vault and can be claimed.
The keeper signs with its own wallet, which pays only network fees (about 1,440 pokes a day at 5,000 lamports each, 0.0072 SOL a day). It holds no authority over the program: if it stopped, nothing would be lost or locked; anyone could call poke and harvest in its place, and every purchase, bid, claim and bond looks at the pool anyway.
#13Launch
Everything happened on 2 October 2026. Times are UTC and taken from the chain.
Before the real launch, the whole sequence was run on mainnet from a throwaway wallet, with a throwaway program and token and a 0.2 SOL pool. It found two practical things: Solana's public RPC refuses requests from web pages, so the site got its own relay (section 15); and trackers list a new pool within seconds and flag a 5% pool fee as a "high tax".
#14Security and trust
14.1 What nobody can do
The admin key was set to nothing by renounce_admin, which the program allowed only after launch and only with sales and bonds both switched on, so they can never be switched off. The program's upgrade authority has been removed, so its code can never change. Since then, nobody, the developer included, can:
- mint $SKY outside the emission and bond rules
- take SOL or $SKY from any of the program's accounts
- remove the locked liquidity
- change a price, a weight, a share, a rate, a fee or the pool
- pause sales or bonds
- move or rename anyone's building
- freeze anyone's $SKY
- change the program
Every check is in the program. A few that matter: one account per building, so a building sells once; the wallet limit kept per wallet; claims only by the asset's current holder; amounts stated by the buyer or the accepting holder, so a price or an offer changed just before is refused; a minimum out on bonds and a 99% floor on the bond's own swap; arithmetic in 128 and 256 bits with checks against overflow; the averages unable to overflow whatever the pool shows; purchases, bids and claims that never fail because of the pool's state.
14.2 Tests
The program passes 217 automated tests in four files, run against the real Meteora DAMM v2 program on a local Solana VM:
| File | Tests | What it covers |
|---|---|---|
| test_skyline.rs | 39 | Each instruction, its rules and its errors |
| test_security.rs | 59 | Attacks: wrong accounts, replays, manipulated prices, authority checks |
| test_maths.rs | 95 | The arithmetic: ladder, weights, accumulators, rounding, caps, extremes |
| test_lifecycle.rs | 24 | Whole lives of the program, checked against a model after every step |
The lifecycle file runs one scripted life, from setup through the ten auctions and the sale of all 308 burn buildings to eleven years on, and eight seeded random runs of 2,000 steps each (16,000 random steps) across 30 wallets, with valid and invalid arguments and time steps from 0 seconds to weeks. After every step it compares what is on chain with a plain model and checks the books: every token and lamport accounted for. Every 500 steps it copies the world and checks that everything that should be possible still is, including with the pool disabled or gone. The program was also read line by line. These reviews were internal; this paper does not claim an outside audit.
14.3 Known limits
- 5 per wallet stops a wallet, not a person. Someone with many wallets can buy more than 5 buildings.
- Scanners may show less than 100% of liquidity locked. Anyone may add their own liquidity to the pool, and that part is theirs to remove. The launch liquidity and everything bonds add are locked for good.
- Fee income depends on the program's share of the liquidity (section 4).
- Meteora's operators can change a pool's fee (between 0.01% and 10%) or disable it. A disabled pool takes no trades and no bonds; harvest, claims and the rest keep working.
- The averages need looking at. Without regular calls the bond bonus stays at 0 and the cap at 10%; the keeper exists for this.
- The site's parts are not on chain. NFT pictures and metadata, ad images and the block list live on the website. The program does not depend on them, and the NFT's on-chain name and link cannot change.
- If the developer's wallet were ever completely empty, very small fee deposits to it would fail until it holds anything. It is kept funded.
- Everything is cheapest in the first minutes, because the token is. This was a deliberate choice: being early pays.
#15Architecture
15.1 The program's accounts
All accounts are program-derived addresses (PDAs) of the program, with no private keys.
| Account | Seeds | Holds |
|---|---|---|
| Config | "config" | Settings, the accumulators, the averages, the bond allowance, running totals. Mint authority of $SKY; update authority of the collection; holder of the pool position's NFT |
| Vault | "vault" | The owners' SOL fees until claimed |
| Ad escrow | "ad_escrow" | $SKY of ad offers until accepted or withdrawn |
| LP accounts | "lp_sky", "lp_wsol" | The program's $SKY and wrapped SOL on their way into the pool |
| Fee account | "fee_wsol" | Made and closed within each harvest |
| Building | "building", No. (u16) | Its NFT, weight and reward records; exists once sold |
| Purchases | "purchases", wallet | How many buildings a wallet bought from the program |
| Auction | "auction", No. | Highest bid (in its own balance), bidder, end; closed at settlement |
| Listing | "listing", No. | Seller, NFT and price in SOL |
| Ad space | "ad", No., slot | Asking price, renter, paid, since, accepted by |
| Ad offer | "ad_offer", No., slot, wallet | One offer's amount |
| Vest | "vest", wallet | A bonder's total, claimed, start and end |
15.2 Instructions and who may call them
| Instruction | Who | What it does |
|---|---|---|
| initialize | Admin, once (done) | Set up; take the mint authority; create the collection with the royalty |
| set_pool | Admin, once (done) | Name the pool after checking it; lock the position's liquidity; start the averages |
| launch | Admin, once (done) | Start the release clock and the auctions |
| set_switches | Admin (gone) | Pause or resume sales and bonds; can no longer be called |
| renounce_admin | Admin, once (done) | Give up the admin key for good |
| buy_building | Anyone | Burn the list price, receive the NFT (Nos. 11–318) |
| bid | Anyone | Bid SOL for Nos. 1–10; refund the outbid bidder |
| settle_auction | Anyone, after the end | NFT to the winner, bid to the developer |
| claim | The NFT's holder | Take the building's $SKY and SOL |
| harvest | Anyone | Collect the position's fees and split them |
| deposit_fees | Anyone | Put SOL through the same split |
| poke | Anyone | Bring the averages up to date |
| bond | Anyone | Pay SOL for $SKY unlocking over 24 hours; lock the SOL in the pool |
| claim_bond | The bonder | Take what has unlocked |
| set_ad_price | The NFT's holder | Set a space's asking price (0 = off the market) |
| offer_ad | Anyone | Offer $SKY for a space, held in escrow |
| withdraw_ad_offer | The offerer | Take an offer back |
| accept_ad | The NFT's holder | Accept an offer: 95% to the holder, 5% to the developer |
| clear_ad | A later holder | Clear an ad accepted by an earlier holder, after its 3 days |
| release_burned | Anyone | Put a building whose NFT was destroyed back on sale |
| list_building | The NFT's holder | List at a price in SOL (≥ 0.02) |
| cancel_listing | The seller | Take a listing down |
| buy_listed | Anyone | Buy a listed building: 95% to the seller, 5% to the developer |
15.3 Off-chain parts
- The site is a static Vite build on Vercel: the 3D map (three.js, tiles loaded as you move), the panels, the wallet flows, and this page. The chain code loads only when first needed, and its arithmetic follows the program step for step, so what the site quotes is what the program will do.
- The RPC relay (/api/rpc) passes the site's calls to a Solana RPC from the server, so the RPC's key never sits in the page. It passes only the calls the site makes. The large reads every visitor repeats go as GET requests that Vercel's edge keeps for 5 seconds, so any number of visitors cost the RPC about one such read every 5 seconds.
- The ad server (/api/ads) is described in section 9.2.
- The keeper is described in section 12.
- The Telegram feed reads the chain every 20 seconds and posts to the group when a building is sold (with its NFT picture, what was paid and the $SKY burned), when a new whole percent of the supply has been burned, and when an auction gets a new highest bid. It sends no transactions.
#16What the developer receives
All of it goes to one wallet, the treasury, fixed for good at setup: DpMcWe…iss. The developer received no $SKY at launch.
| Source | Amount |
|---|---|
| Trading | 2% of the volume (through the program's position), plus the unsold buildings' part of the owners' 2% |
| Referral | 0.2% of the volume of swaps made through the site, returned by Meteora out of its cut, when the developer's wrapped-SOL account exists (section 5.4) |
| Auctions | All ten winning bids |
| Ads | 5% of every accepted ad offer, in $SKY |
| Market | 5% of every sale on the site's market; the 5% royalty on outside marketplaces that charge it |
| Destroyed NFTs | Fees credited to a destroyed building and never claimed |
#17Risks and disclaimers
This is not financial advice. This paper describes how a piece of software works. It is not an offer of anything, it makes no promise of income or returns, and nothing in it is a recommendation to buy, hold or sell $SKY or a building.
- Price risk. $SKY trades freely and its price can fall to near zero. What a building earns in $SKY and SOL depends on trading volume and on the price of $SKY, neither of which anyone controls. Emission adds up to 10M $SKY a day forever and bonds add more; if demand does not keep up, the price falls.
- Smart-contract risk. The program is tested but may still contain a fault. Because it cannot be changed, a fault cannot be fixed either. It depends on Meteora's, Metaplex's and Solana's own programs, which carry their own risks.
- Third parties. Meteora's operators can change the pool's fee or disable it. Outside marketplaces may ignore the royalty. Wallets, RPC providers and the website can fail.
- Liquidity. A building is a unique asset; there may be no buyer at the price you want.
- No recourse. Transactions on Solana are final. A mistake, a lost key or a malicious transaction you sign cannot be undone by anyone.
- Legal. Rules on tokens and on income-sharing assets differ by country and are changing. Check what applies where you live.
#18Glossary
- $SKY
- The protocol's token: a plain SPL token with 6 decimals.
- Base unit
- The smallest amount of $SKY: one millionth.
- Lamport
- The smallest amount of SOL: one billionth.
- wSOL
- Wrapped SOL: SOL held in a token account so a pool can trade it.
- Meteora DAMM v2
- The pool program ($SKY's pool runs on it), also called cp-amm.
- Position
- A share of a pool's liquidity, owned through an NFT. The program's position holds the launch liquidity and everything bonds add.
- Permanent lock
- Meteora's lock for liquidity that can never be removed. Its fees can still be collected.
- Weight
- A building's fixed measure: its list price, or double the continued ladder for Nos. 1–10.
- Share
- A building's weight over the total of all 318 weights (583,101,243). Its part of every reward.
- Emission
- The 10,000,000 $SKY a day minted to owned buildings by share.
- Accumulator
- A running total of what one unit of weight has earned (acc_sky, acc_sol).
- Harvest
- Collecting the program's position's fees from the pool and splitting them.
- Poke
- A call that only makes the program look at the pool, to update its averages.
- Keeper
- The process that pokes and harvests. It holds no authority.
- Bond
- Buying $SKY from the program with SOL that becomes locked liquidity; the $SKY unlocks over 24 hours.
- Daily, fast and slow figures
- The program's own averages of the pool's price and SOL (section 8.4).
- PDA
- Program-derived address: an account address owned by a program, with no private key.
- Metaplex Core
- The NFT standard the buildings use: one account per asset, with plugins.
- TransferDelegate
- A Metaplex Core plugin naming who besides the holder may move an NFT; the market uses it.
- Ad space
- A place on a building where an image is shown; 328 in all.
- Renter
- The wallet whose accepted offer holds an ad space.
- Escrow
- The program's account holding offers until accepted or withdrawn.
- Treasury
- The developer's wallet, fixed at setup.
- Admin key
- The key that could set up, launch and pause. Renounced on 2 October 2026.
- Upgrade authority
- The key that could replace the program's code. Removed.
#19Addresses
All on Solana mainnet. Check them before you send anything.
| Program | zrFtfZmgju53xsee8bZGohoJFysRTtKXpCSQT66NLWvSolscanExplorer |
|---|---|
| $SKY mint | 5q96w5CcRWZYzrzXHwwx6r1KBf77devYsoH5cougd5PoSolscanExplorer |
| Meteora DAMM v2 pool | EhLkcyvUQExQiQG43zihg589tj765MCXRLckefmK3AnPSolscanExplorer |
| Config (program state) | xMT1Mm5AzAR6wVhVmQKrYRcebhoHcGNLeqMhJT8PDqySolscanExplorer |
| NFT collection | 6ycWr1a6T4L56wVzfpthjgpP2HzaUatsRhouNqevr8bCSolscanExplorer |
| Treasury (developer) | DpMcWeGFGKkRteEHXp5WeZymb6FBDoFUeJWQzGTkCissSolscanExplorer |
Also: Meteora's program cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG; Metaplex Core CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d. The site: www.adskyline.xyz · X @adskyline · Telegram @adskyline.
#AThe program's constants
As written in the deployed program. Amounts of $SKY in whole tokens, SOL in SOL; "bps" are hundredths of a percent.
| Constant | Value | Meaning |
|---|---|---|
| DECIMALS | 6 | $SKY decimals |
| BUILDINGS | 318 | Buildings |
| ANCHOR_PRICE | 5,000,000 | Price of No. 11 |
| STEP_BPS | 100 | Each building 1% cheaper |
| AUCTIONED_WEIGHT_MULT | 2 | Nos. 1–10 weigh double the continued ladder |
| EMISSION_PER_DAY | 10,000,000 | $SKY a day to owned buildings |
| OWNERS_FEE_BPS | 5,000 | Half of harvested fees to owners |
| MAX_SUPPLY | 100,000,000,000 | Nothing minted past it |
| WALLET_LIMIT | 5 | Purchases per wallet from the program |
| RELEASE_SECS | 600 | Nos. 11–318 on sale 10 minutes after launch |
| AUCTIONED | 10 | Nos. 1–10 auctioned |
| AUCTION_SECS | 86,400 | Auctions run 24 hours |
| AUCTION_START_LAMPORTS | 1 SOL | First bid at least |
| AUCTION_RAISE_BPS | 500 | Each bid at least 5% more |
| AUCTION_EXTEND_SECS | 600 | Late bids extend to 10 minutes after |
| BOND_DELAY_SECS | 3,600 | Bonds open 1 hour after launch |
| VEST_SECS | 86,400 | Bonds unlock over 24 hours |
| BOND_BONUS_MAX_BPS | 2,000 | Bonus at most 20% |
| BOND_CAP_MIN_BPS · MAX | 1,000 · 2,000 | Daily cap 10% to 20% of supply |
| BOND_CAP_FULL_AT_BPS | 2,500 | Cap at 20% when the price is 25% over its average |
| BOND_SWAP_SLIPPAGE_BPS | 100 | The bond's swap returns at least 99% of expected |
| AVERAGE_SECS | 86,400 | Time constant of the daily average |
| AVERAGE_STEP_MAX_SECS | 3,600 | One update counts for an hour at most |
| AVERAGE_STEP_MIN_SECS | 60 | Updates less than a minute apart add up |
| FAST_SECS · FAST_STEP_MAX_SECS | 3,600 · 60 | Fast and slow figures move 1/60 of the gap a minute at most |
| AD_FEE_BPS | 500 | 5% of an accepted ad to the developer |
| AD_RAISE_BPS | 1,000 | A replacing ad pays 10% more |
| AD_TERM_SECS | 259,200 | An ad's guaranteed 3 days |
| MARKET_FEE_BPS | 500 | 5% of a market sale to the developer |
| MARKET_MIN_LAMPORTS | 0.02 SOL | Lowest listing price |
| ROYALTY_BPS | 500 | Collection royalty, 5% |
| POOL_FEE_NUMERATOR | 50,000,000 ∕ 10⁹ | The pool's 5% fee, checked at set_pool |