OpenSwarm pays a seeder per verified piece served, and nothing pays anyone to stay. An archive, a backup, a dataset waiting for its buyer or a podcast's back catalogue earns nothing the month nobody downloads it, so it dies the way every swarm always has. And nothing in BitTorrent says who put a swarm there or whether they were allowed to, which is why a seeder is presumed to be doing something wrong. pay2seed is the member document for both halves. An attestation, signed at upload with a fixed basis (own, licensed, open-license, public-domain, personal) and a notice endpoint, is what a hub requires before it will list anything; public claims get a claim window and a standing, and a notice voids them. An offer escrows a budget at an ippay hub for a swarm, public or private, to be held by M seeders for N days at a price per GiB-month, bought over x402 exactly as a pass is. Seeders take leases, prove each period by storage challenge or by a probe over the ordinary wire, and are paid through the payee they already have. Public feeds ride on ipdb; ipfile.pin on c0mpute is the same offer on the auction. Also: the family table, stack diagram and registry rows; the ip seed command group; PRD 0006; the protocol row on /openswarm. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SKAohrRkqLKVQL2cGCAkR5
28 KiB
pay2seed: Consent, Seed Offers and the Seed Market
Status: 0.1 draft. Member of the OpenSwarm family.
Depends on the core, ipfile, ippay
and ipdb.
1. Scope
pay2seed is how somebody pays to have data kept alive on a swarm by
machines they do not control, and how the people running those machines are
paid for it. It turns a torrent client into a legitimate file sharer: every
swarm on the market carries a signed statement of who put it there and on
what basis, every seeder holds a lease that says what they were asked to
keep and for how long, and every payout is backed by proof that the bytes
were held and served.
It covers:
- Consent. A signed attestation, made when the data is added, that the requester has the right to distribute it and accepts notice. A hub MUST NOT list an offer without one. This is the part BitTorrent never had.
- Offers. A request to store, archive or share a swarm for a period, with
a budget, a minimum number of seeders and a proof cadence. Public offers
cover vanilla torrents and
ipdbfeeds; private offers coveripfileswarms, whose ciphertext a seeder holds without ever being able to read. - Leases. The hub's binding of one seeder to one offer for one period at one price.
- Proof of seeding. Storage challenges answered from the held pieces, and probes in which a verifier fetches pieces over the ordinary wire. Both work on a vanilla torrent, which is what makes public seeding payable.
- Settlement. GiB-month accrual per proven period, receipts, and payout
through an
ippayhub. Served-byte vouchers, where the swarm charges for them, are separate and additive. - The market. A hub API that lists open offers so a client can pick work, and a seeder client's expected behaviour.
ipfile.pin (c0mpute §3.1) is this document's offer shape
carried on c0mpute's job auction. pay2seed is the same request opened to
any seeder: a torlink daemon on a seedbox, a laptop that is on most of the
day, a c0mpute node. A node MAY treat a pay2seed.offer as an ipfile.pin
job and vice versa; §11 gives the mapping.
Non-goals
Judging content. A hub sees an attestation, an infohash and, for a private
swarm, nothing else. It enforces that the attestation exists, is signed and
is honoured on notice; whether the attestation is true is the requester's
liability, and §9 is how a false one is undone. Not a DRM: a public swarm is
public, a private swarm is ipfile's encryption and no more. Not a token.
Not a replacement for ippay vouchers: a swarm that charges leechers keeps
charging them, and its seeders earn both ways.
2. Terminology
- Requester. The identity that posts an offer and funds it. Usually the publisher of the swarm; for a public torrent it may be anyone who wants it kept alive, subject to §3.
- Seeder. An identity that holds a lease and serves the swarm.
- Hub. An
ippayhub that also implements this document's API (§7). bittorrented.com is the reference hub. - Verifier. Whoever issues challenges and probes: the hub, a c0mpute verifier node, or the requester. A lease names who may.
- Attestation. The consent record (§3).
- Offer. The request (§4). Lease. One seeder's share of it (§5).
- Period. The unit of accrual and proof,
proof.everyHourslong. - Visibility.
public(a vanilla torrent or anipdbfeed, readable by anyone) orprivate(anipfileswarm; ciphertext only).
Keys, records, signatures, amounts and times are as in the core. Every
record below is a core §3 record with the type shown.
3. Consent: the attestation
An attestation is the requester saying, under signature, what the data is and why they may distribute it. It is made once per swarm, before the first offer, and every offer for that swarm references it.
3.1 Record
{
"openswarm": "0.1",
"type": "pay2seed.attestation",
"subject": { "infohashV1": "4330ddb304b78b1398a77297f57ea22c1ef3fb56", "infohashV2": null, "file": null },
"visibility": "public",
"basis": "own",
"license": "CC-BY-4.0",
"description": "Field recordings, Dartmoor, 2026",
"notice": "https://example.com/.well-known/pay2seed-notice",
"acceptsTakedown": true,
"createdAt": "2026-09-05T18:00:00.000Z",
"sigs": [{ "alg": "ed25519", "key": "ed25519:0d87…", "sig": "…" }]
}
| Field | Rule |
|---|---|
subject |
Exactly one of file (an ipfile file key; visibility MUST be private) or infohashV1/infohashV2 (at least one; visibility MUST be public). A feed offer (§4.4) attests the feed key in file. |
visibility |
public or private. Fixed for the life of the swarm; changing it is a new swarm. |
basis |
Why the requester may distribute this. One of the values in §3.2. |
license |
REQUIRED when basis is open-license: an SPDX identifier. Otherwise OPTIONAL. |
description |
OPTIONAL, at most 280 characters, shown on public listings. |
notice |
An HTTPS URL or mailto: at which the requester receives notices (§9). REQUIRED for public; OPTIONAL for private, where the hub's own contact for the requester's account stands in. |
acceptsTakedown |
MUST be true. Present so the acceptance is in the signed bytes. |
Signer: the requester key. For an ipfile subject the attestation MUST also
carry a signature by the file's publisher key, which is how a stranger is
prevented from attesting somebody else's private swarm. For a public
infohash no such proof of authorship exists; §3.3 is what stands in for it.
3.2 Basis values
basis |
Meaning | Allowed visibility |
|---|---|---|
own |
The requester made it or holds the rights outright. | either |
licensed |
The requester holds a licence that permits redistribution. | either |
open-license |
Released under the SPDX licence in license. |
either |
public-domain |
No rights subsist, or they were waived. | either |
personal |
The requester's own data, kept for themselves: backup, archive, sync. Nobody else is meant to read it. | private only |
A hub MUST reject an attestation whose basis and visibility disagree
with this table, and MUST reject any attestation with an unlisted basis.
Hubs MAY refuse to list particular bases (a hub for personal backup only, a
hub for open data only); the hub record says which (§7.1).
3.3 Public infohashes and the claim window
Anyone can attest a public infohash, so the attestation is a claim, not a
proof. A hub lists a public offer only after a claim window (claimHours
in the hub record, default 24) during which the infohash and the
attestation are visible at GET /offers/<id> and to anyone following the
hub's pay2seed.offer.listed event, and a notice (§9) voids it. An offer
for a swarm that already has an honoured attestation from a different key
is refused unless the new attestation's basis is open-license or
public-domain, which are the two bases that do not depend on who is
asking.
A requester's standing (§7.5) records every attestation of theirs that was voided. A hub SHOULD refuse new public attestations from a key whose voided count exceeds its accepted count, and MUST refuse them from a key with three or more voided attestations in the last year.
4. Offers
An offer is money on the table for a swarm to be kept for a period. It is
bought from the hub exactly as an ippay pass is bought, so the budget is
settled before anyone starts seeding.
4.1 Record
{
"openswarm": "0.1",
"type": "pay2seed.offer",
"hub": "ed25519:c9f1…",
"requester": "ed25519:0d87…",
"attestation": "sha256:8e1c…",
"subject": { "infohashV1": "4330ddb304b78b1398a77297f57ea22c1ef3fb56", "infohashV2": null, "file": null, "feed": null },
"visibility": "public",
"sizeBytes": 7462331904,
"days": 30,
"seeders": { "min": 3, "max": 10 },
"priceUsdPerGibMonth": "0.150000",
"budgetUsd": "12.000000",
"proof": { "everyHours": 6, "verifiers": ["hub"] },
"pass": null,
"trackers": ["udp://tracker.opentrackr.org:1337/announce", "wss://tracker.openwebtorrent.com"],
"startsAt": "2026-09-05T18:00:00.000Z",
"expiresAt": "2026-10-05T18:00:00.000Z",
"payment": { "network": "eip155:8453", "nonce": "0x2f0a…" },
"createdAt": "2026-09-05T18:00:00.000Z",
"sigs": [{ "alg": "ed25519", "key": "ed25519:c9f1…", "sig": "…" }]
}
| Field | Rule |
|---|---|
hub |
The hub that sold it and holds the budget. Signer of the record. |
requester |
Who paid, bound at purchase as ippay §3.3 binds a payer. |
attestation |
Record id of an attestation whose subject and visibility match this offer's. |
subject |
As the attestation, plus OPTIONAL feed: an ipdb feed key (§4.4). |
sizeBytes |
Ciphertext or torrent payload size. For a feed, the size at posting; §4.4 says how growth is paid. |
days |
Period the swarm is to be held from startsAt. |
seeders.min |
Leases the hub will hand out before the offer is active. max caps them; extra seeders beyond max earn only vouchers. |
priceUsdPerGibMonth |
What one seeder earns for holding the whole swarm for 30 days, pro rata. |
budgetUsd |
Escrowed. MUST be at least max * priceUsdPerGibMonth * sizeBytes/2^30 * days/30, rounded up to six places. |
proof.everyHours |
Period length. 1 to 168. |
proof.verifiers |
Who may challenge: hub, requester, or c0mpute (any node with c0mpute:role:verifier). |
pass |
For a private swarm whose pricing.perGib is non-zero: an ippay.pass scoped to the file, so a seeder can fetch it as a paying peer. null otherwise. |
trackers |
Announce URLs the seeder MUST add. At least one wss:// tracker when the requester wants browser peers to find it. |
startsAt, expiresAt |
expiresAt is startsAt + days. Leases never outlive it. |
payment.nonce |
The settlement that funded budgetUsd. |
4.2 Purchase
POST /offers with an unsigned draft (every field but hub, payment,
sigs, createdAt) and no X-PAYMENT header answers 402 with an x402
offer for budgetUsd plus the hub's fee (§6.3), exactly as ippay §3.2
answers a pass purchase, and with the same X-OpenSwarm-Payer binding.
Repeating the request with a valid proof answers 201 with the signed
offer. A hub MUST verify the referenced attestation before quoting, and MUST
refuse a private offer whose sizeBytes disagrees with the manifest.
An offer is pending until seeders.min leases exist, active from then
until expiresAt, and then settled. It is voided by a notice (§9) or by
the requester (DELETE /offers/<id>, signed), in which case the unearned
budget is refunded to the requester's registered payout address, less what
leases have accrued.
4.3 Public swarms
A public offer is a vanilla torrent. The seeder fetches it from the swarm
like any client, using trackers and the DHT, and serves plaintext. Nothing
in the wire changes; the only new thing on the network is another well
behaved seeder that stays. This is how a podcast archive, a dataset, a
software release or an out-of-print recording with a clean basis gets kept
alive by strangers who are paid for it.
4.4 Public feeds
An offer whose subject.feed is set covers an ipdb feed: every segment
swarm the feed publishes, present and future, and the duty to keep the
feed's head reachable. A leased seeder MUST follow the feed (ipdb §5.4),
fetch each new segment within one period of its appearance in the head,
seed all of them, and re-announce the head as a BEP 44 mutable item at least
once per period so the catalogue stays findable when the publisher is
offline. sizeBytes is the feed's size at posting; each new segment is
added to the lease's accrual base at the period in which it was proven, and
the hub MUST NOT hand out leases whose projected accrual exceeds
budgetUsd. The requester tops up with a further offer for the same feed.
4.5 Private swarms
A private offer is an ipfile swarm. The seeder holds ciphertext and,
unless it also holds a grant, cannot read a byte of it. Where the manifest
has keys.public set the data is readable by anyone with the manifest, and
the offer is still private in this document's sense: what is being paid
for is storage of a specific swarm, and what the attestation says is that
the requester may store it. personal is the basis for a backup nobody else
is ever meant to read; the swarm's pricing SHOULD be zero and its manifest
SHOULD not be catalogued.
5. Leases
5.1 Record
{
"openswarm": "0.1",
"type": "pay2seed.lease",
"hub": "ed25519:c9f1…",
"offer": "sha256:1b7f…",
"seeder": "ed25519:a41e…",
"slot": 1,
"priceUsdPerGibMonth": "0.150000",
"startsAt": "2026-09-05T18:30:00.000Z",
"endsAt": "2026-10-05T18:00:00.000Z",
"graceHours": 24,
"createdAt": "2026-09-05T18:30:00.000Z",
"sigs": [{ "alg": "ed25519", "key": "ed25519:c9f1…", "sig": "…" }]
}
| Field | Rule |
|---|---|
offer |
Record id of the offer. |
seeder |
The seeder key. It MUST be a registered ippay payee (§6.4), which is where the money goes. |
slot |
1-based, at most offer.seeders.max. A seeder holds at most one lease per offer. |
priceUsdPerGibMonth |
Copied from the offer at lease time so a later offer edit never changes what was agreed. |
graceHours |
Time from startsAt in which the seeder MUST pass its first proof, or the lease is abandoned and the slot reopens. Long enough to fetch the swarm. |
A lease is fetching until its first proof, proven while its most recent
period passed, lapsed when a period failed, abandoned after
graceHours without a first proof, ended at endsAt, and voided with
its offer.
5.2 Taking a lease
POST /leases with { "offer": <id>, "seeder": <key>, "sig" }, sig by
the seeder key over "openswarm:pay2seed:lease:v1" || offer id. The hub
answers 201 with the lease, or 409 when the offer has no free slot or
this seeder already holds one, or 403 when the seeder's standing (§7.5)
is below the offer's or hub's floor.
A hub SHOULD hand out slots to seeders in order of standing, and MUST NOT
hand more than seeders.max. A seeder SHOULD NOT take a lease it cannot
serve within graceHours; an abandoned lease counts against standing.
6. Proof and settlement
6.1 Storage challenges
Once per period, a verifier named in the offer sends the seeder:
{
"openswarm": "0.1",
"type": "pay2seed.challenge",
"lease": "sha256:5c02…",
"period": 7,
"nonce": "1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f",
"pieces": [17, 2048, 91, 4400],
"deadline": "2026-09-07T12:10:00.000Z",
"createdAt": "2026-09-07T12:00:00.000Z",
"sigs": [{ "alg": "ed25519", "key": "ed25519:c9f1…", "sig": "…" }]
}
The seeder answers within deadline with a proof:
{
"openswarm": "0.1",
"type": "pay2seed.proof",
"challenge": "sha256:9d3a…",
"answers": ["sha256:…", "sha256:…", "sha256:…", "sha256:…"],
"createdAt": "2026-09-07T12:00:04.000Z",
"sigs": [{ "alg": "ed25519", "key": "ed25519:a41e…", "sig": "…" }]
}
Each answer is SHA-256(nonce || piece bytes) for the piece at that index,
which a verifier that holds the piece hashes and a copy of the piece can
check, and which cannot be answered from the hash alone. A verifier that
does not hold the pieces (the hub, for a swarm it does not store) uses a
probe instead. pieces MUST be at least four indices chosen uniformly at
random per challenge; deadline MUST be at least ten minutes after
createdAt, which is enough to read four pieces from a spinning disk and
not enough to fetch them from the swarm.
6.2 Probes
A verifier connects to the seeder as an ordinary peer, over BEP 3 for a
vanilla torrent or the ipfile extension for a private swarm, and requests
the challenge's pieces. The seeder's ordinary serving is the proof; the
verifier records { "lease", "period", "pieces", "receivedBytes", "peer" }
signed by its own key as the proof record's answers equivalent, with
type still pay2seed.proof. A probe MUST fetch from the seeder's own
announced address; a swarm being alive is not evidence that this seeder is
keeping it alive.
For a private swarm whose pricing.perGib is non-zero the verifier pays
vouchers for the probe like any leecher, and those vouchers are the seeder's
in the usual way. Hubs SHOULD prefer probes for public swarms, whose pieces
anyone can fetch, and challenges for private swarms they already pin.
6.3 Accrual and receipts
A lease earns, for each period in which its proof passed:
earnedUsd = priceUsdPerGibMonth * (sizeBytes / 2^30) * (everyHours / 720)
computed with integer arithmetic in micro-USD, rounding down. A failed or
missed period earns nothing and moves the lease to lapsed; two
consecutive failures end it and reopen the slot. Earned amounts are
credited to the seeder's ippay payee balance and reported with a receipt:
{
"openswarm": "0.1",
"type": "pay2seed.receipt",
"lease": "sha256:5c02…",
"period": 7,
"proof": "sha256:e77b…",
"earnedUsd": "0.002604",
"balanceUsd": "0.018228",
"createdAt": "2026-09-07T12:00:05.000Z",
"sigs": [{ "alg": "ed25519", "key": "ed25519:c9f1…", "sig": "…" }]
}
The hub's fee is charged to the requester at purchase, hubBps of
budgetUsd with hubBps no less than the hub record's minHubBps; it is
never deducted from a seeder's earnings. Payout is ippay §5.6, on the
same schedule and floor as voucher earnings.
6.4 Payees
A seeder is an ippay payee (ippay §6.1). Registering once covers
vouchers, key grants and leases. A seeder key that is not registered cannot
take a lease, because there would be nowhere to pay.
7. The hub
7.1 Hub record
An ippay.hub record that offers this document adds:
"pay2seed": {
"base": "https://bittorrented.com/api/openswarm/pay2seed",
"bases": ["own", "licensed", "open-license", "public-domain", "personal"],
"claimHours": 24,
"minStanding": 0,
"verifiers": ["hub", "c0mpute"],
"maxDays": 365
}
bases is what this hub will list. minStanding is the floor for taking a
lease. A hub MAY run a market for private backups only, or for open data
only, by narrowing bases.
7.2 API
All bodies are JSON. Records are verified on receipt. Paths are relative to
pay2seed.base.
| Method and path | Auth | Purpose |
|---|---|---|
POST /attestations |
signed record | Register an attestation. 201 with its id, 409 if one is honoured for the subject by another key (§3.3). |
GET /attestations/<id> |
none | The record and `{ "status": "claimed |
POST /offers |
x402 + X-OpenSwarm-Payer |
Buy an offer (§4.2). |
GET /offers?visibility&basis&minPrice&maxSize&feed&status |
none | The market: open offers with free slots, newest first, paged. |
GET /offers/<id> |
none | The offer, its status, leases held, slots free. |
DELETE /offers/<id> |
requester signed | Void and refund the unearned budget. |
POST /leases |
seeder signed | Take a slot (§5.2). |
GET /leases/<id> |
none | The lease, status, periods proven, earnedUsd. |
GET /seeders/<key>/leases?status |
none | A seeder's leases; what a client resumes after a restart. |
POST /proofs |
seeder or verifier signed | Answer a challenge or report a probe. Returns the receipt. |
GET /leases/<id>/challenges?since |
seeder | Pending challenges for a seeder that cannot receive them pushed. |
GET /seeders/<key> |
none | { "standing", "leases", "proven", "failed", "abandoned", "balanceUsd" }. |
GET /requesters/<key> |
none | { "standing", "attestations", "voided", "offers" }. |
POST /notices |
signed | A notice against an attestation (§9). |
POST /webhooks |
signed | Register a CloudEvents endpoint for a requester or seeder key. |
7.3 Delivering challenges
A hub pushes challenges to a seeder's registered webhook when it has one,
and otherwise leaves them to be polled from
GET /leases/<id>/challenges. A seeder without a webhook MUST poll at
least every everyHours / 4 hours. deadline is measured from
createdAt, not from delivery, so a seeder that polls slowly fails
challenges; the cadence is the seeder's problem to meet.
7.4 The market listing
GET /offers is what a seeder client shows its operator, or chooses from
on its own. Each row carries the offer, the attestation's basis,
description and visibility, the free slot count, and the projected
earnedUsd for a full lease. A client MUST show basis and visibility
wherever it shows an offer, so an operator knows whether they are being
asked to hold ciphertext for a stranger's backup or to seed an openly
licensed dataset in the clear.
7.5 Standing
Seeder standing is proven - 2 * failed - 3 * abandoned over the trailing
year, floored at zero. Requester standing is honoured - 3 * voided, the
same way. Standing is public at GET /seeders/<key> and
GET /requesters/<key>, and portable in the sense that it is one hub's
opinion signed by that hub; a second hub MAY read it and MAY ignore it.
8. Client behaviour
A seeder client (torlink's headless daemon is the reference) does the following, and a conformant one does all of it:
- Holds a seeder key, registered as an
ippaypayee with a payout address, and stores the key as an OpenCredskeyitem. - Polls
GET /offerson the hubs it is configured for, filtered by the operator's policy: whichvisibilityandbasisvalues to accept, the minimumpriceUsdPerGibMonth, the maximumsizeBytes, free disk to keep in reserve. - Takes a lease, fetches the swarm (as a paying peer when
offer.passis set), adds the offer'strackers, and seeds with a per-torrent seed time of at leastlease.endsAt, so the client's own reaper never drops a swarm it is being paid to keep. - Answers challenges from local pieces within
deadline, and serves probes as ordinary peer traffic. - On restart, resumes every lease in
GET /seeders/<key>/leases?status=proven,fetchingbefore taking new ones. - Stops seeding and deletes the data when a lease ends or is voided, unless
the operator has chosen to keep it; for a
privateswarm the ciphertext is worthless without a grant, and for apersonalone it MUST be deleted. - Shows the operator, for every held lease, the
basis,visibility,earnedUsdso far, and the next challenge due.
A requester client (ip CLI, a web app) makes the attestation, buys the
offer, and watches GET /offers/<id> or the events.
9. Notices and takedown
Anyone may POST /notices against an attestation:
{
"openswarm": "0.1",
"type": "pay2seed.notice",
"attestation": "sha256:8e1c…",
"kind": "rights|illegal|personal-data|other",
"claimant": { "name": "…", "contact": "mailto:…" },
"statement": "…",
"createdAt": "2026-09-06T09:00:00.000Z",
"sigs": [{ "alg": "ed25519", "key": "ed25519:77aa…", "sig": "…" }]
}
On a notice the hub MUST forward it to the requester's notice endpoint
and MUST, within claimHours, either void the attestation or record that
it was reviewed and stands. Voiding an attestation voids every offer that
references it: leases end, seeders are told by event and by their next
poll, the requester is refunded the unearned budget less leases' accrued
earnings, and the requester's voided count rises. A hub that voids on
every notice without review is conformant; a hub that never voids is not.
For a private swarm the hub cannot inspect the content and does not
pretend to. What it has is the requester's identity, their attestation and
their standing, which is what accountability looks like for ciphertext.
10. Security notes
- Sybil seeders. One machine holding several leases on one offer under
several keys earns several times for one copy.
seeders.maxbounds the loss; probes from distinct verifiers to the announced addresses, and a hub refusing leases to keys that share a payout address on the same offer, bound it further. Standing makes it expensive to repeat. - Answer relaying. A seeder that holds nothing could fetch challenged
pieces from the swarm within
deadline. Ten minutes is the floor; a hub SHOULD set shorter deadlines for small swarms, and probes measure the seeder's own serving rather than what it can fetch. - Hub as escrow. The budget sits with the hub. A requester trusts the
hub with
budgetUsdfordays, as a pass buyer trusts it withcapUsdfor 30. A hub's signed receipts and refunds are its auditable trail. - Attestation is a claim. §3.3's window, standing and notices are the defence. A hub that lists a public offer the moment it is paid is not conformant.
- Private means ciphertext, not secret existence. A lease reveals to
its seeder the file key, the size and the requester's key.
personalswarms SHOULD use a fresh unrelated file pair (core §4.2) so that backups are not linkable to a publisher's catalogue.
11. Relationship to ipfile.pin
An ipfile.pin job (c0mpute §3.1) is a pay2seed.offer with
visibility: "private", seeders.min = seeders.max = 1, days and
proof.everyHours copied, priceUsdPerGibMonth derived from
max_price_usd, and c0mpute's storage challenge standing in for §6.1. A
c0mpute node that wins such a job holds a lease in this document's sense
and MAY report proofs to the hub to build standing there. A hub MAY
republish a pay2seed.offer as an ipfile.pin job on the c0mpute auction
when no other seeder takes it, which is how the market reaches the paid
storage network without the requester doing anything.
12. Events
CloudEvents as core §8, source the hub base:
type |
Data | Subscriber |
|---|---|---|
pay2seed.attestation.registered, .honoured, .voided |
attestation id | requester |
pay2seed.offer.listed, .active, .settled, .voided |
offer id, status | requester, market followers |
pay2seed.lease.granted, .proven, .lapsed, .ended, .voided |
lease id, period, earnedUsd |
seeder, requester |
pay2seed.challenge.issued |
the challenge record | seeder |
pay2seed.notice.received, .resolved |
notice id, outcome | requester |
13. Implementations
| Piece | Where | Status |
|---|---|---|
| Reference hub: attestations, offers, leases, probes, market, notices | profullstack/media-streamer (bittorrented.com) |
planned; the seedbox rental rail is the pay-per-pass half of it today |
| Seeder client: market polling, leases, per-lease seed time, challenges | torlink (torlnk serve and watch) |
planned; per-torrent seed time landed as baairon/torlink#186 |
| Shared client and promo library | @profullstack/pay2seed |
planned |
| Seeder and verifier on the storage network | profullstack/c0mpute via ipfile.pin |
mapping in §11 |
| Requester CLI | ip seed … (cli.md) |
proposed |
14. Conformance
A hub is conformant when it: refuses offers without an honoured
attestation (§3); enforces the basis table and claim window (§3.2, §3.3);
escrows the budget before listing (§4.2); issues at least one challenge or
probe per period and pays only proven periods (§6); publishes the market
and standing (§7); forwards and resolves notices within claimHours (§9).
A seeder client is conformant when it does all of §8.
A requester client is conformant when it makes an attestation the
signer actually holds the key for, buys offers only against it, and
receives notices at the notice endpoint it named.
15. Version history
- 0.1 (2026-09-05): first draft. Attestation with basis table and claim
window; offers bought over x402 with escrowed budgets; leases with
slots and grace; challenges and probes; GiB-month accrual and receipts;
public feeds on
ipdb; notices; theipfile.pinmapping.