adland-1Monetize your building spaces, transparently, onchain.
One RPC call fetches all the onchain data, rendered by very lightweight packages — like the examples below.
Four ways to put it on a page, all live.
Paste it
no styling at all
adland-1<script src="https://cdn.jsdelivr.net/npm/@adland/embed@0.4.0/dist/adland.js" async></script>
<adland-slot slot-key="adland-1"></adland-slot>Theme it
30 CSS custom properties — hover it
adland-1<!-- same script as above -->
<adland-slot
slot-key="adland-1"
style="--adland-bleed: 10px;
--adland-bg: #FFE500;
--adland-fg: #000;
--adland-border: #000;
--adland-border-width: 2px;
--adland-radius: 0;
--adland-shadow: 6px 6px 0 #000;
--adland-shadow-hover: 2px 2px 0 #000;
--adland-transform-hover: translate(4px, 4px)"
></adland-slot>Style it with your own classes
render-mode=light — Tailwind reaches the card
adland-1<!-- same script as above -->
<adland-slot
slot-key="adland-1"
render-mode="light"
class="[&_.adland-card]:flex [&_.adland-card]:gap-3
[&_.adland-card]:rounded-xl [&_.adland-card]:border
[&_.adland-media]:size-12 [&_.adland-title]:font-medium"
></adland-slot>Or build the card
React — the markup is yours
adland-1npm i @adland/react
import { Ad, AdImage, AdTitle } from "@adland/react";
<Ad slotKey="adland-1">
<AdImage className="aspect-video w-full" />
<AdTitle className="font-medium" />
</Ad>All four are live and read the same slot on Base — one eth_call each, since the name and the creative come back together. They run with consent="denied" so this page does not count as impressions against the ad — leave it off and yours are tracked normally.
Link
linkAny URL. AdLand reads the page's Open Graph tags for the title, description and picture.
You supply url
{
"type": "link",
"data": {
"url": "https://blog.ethereum.org/"
},
"metadata": {
"title": "Home | Ethereum Foundation Blog",
"description": "Latest news and announcements from the Ethereum Foundation.",
"image": "https://blog.ethereum.org/images/ethereum-blog-og-image.png",
"icon": "https://blog.ethereum.org/images/favicon.png"
}
}Home | Ethereum Foundation Blog
Latest news and announcements from the Ethereum Foundation.
These six are the whole set — the same union @adland/data validates against, so a type that is not here cannot be placed. The card is a real component rendering static data, not a picture.
Access to your ad slot is always on sale.
You never set a price. Whoever wants the space says what it is worth to them, and pays rent on their own price for as long as they hold it.
Anyone can take it from them at that same price — which is what stops them lowballing you.
This slot charges 50% of the advertiser's own valuation per 30 days, and it accrues by the second — not on the 1st.
$3USDC
You earn
$1.50/ month
You collect, whenever
It piles up in the slot until somebody calls collect(), which pushes it to your recipient address. Permissionless — you can call it, we can call it, a bot can call it. Nobody can redirect it.
Or make it multiplayer
Point the recipient at a collective instead of a wallet and the revenue fans out over a split. Bring in whoever else earns it — someone placing the ads, someone else who publishes the slot too.
What that is, technically
- The rent
- taxOwed() = price × rate × seconds elapsed ÷ 30 days. A pure function of the clock, so a page can tick it exactly rather than poll for it.
- The price
- Self-assessed by the occupant, and binding: buy() lets anyone take the slot by paying exactly that, which is the part that keeps it honest.
- The deposit
- Escrow the advertiser funds it from. If that runs out, anyone can liquidate() and the slot falls vacant — their risk, never yours.
- The recipient
- Where collect() pushes to. A wallet, or a SlotCollective — a 0xSplits push split the slot names as recipient, fanned out by distribute().
The mechanism is a Harberger tax — self-assessed price, continuous rate, always for sale — settled by the slot contract on Base. None of it is enforced by us: the price, the accrual and the takeover are the contract's, and it keeps working whether or not this site is up.
Every attribute, every ad type.
The six kinds of ad a slot can hold, the full event payload, and a prompt you can hand to a coding agent.