Skip to content

Commit e570ec4

Browse files
committed
Merge main into remaining appraisal spend helper
2 parents 4fc8b9d + 68c187f commit e570ec4

228 files changed

Lines changed: 4015 additions & 3551 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/bindings-check.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ on:
55
branches: [main]
66
pull_request:
77

8+
permissions:
9+
# Los cuatro workflows solo leen el repo: clonan, instalan y corren
10+
# tests. Ninguno hace push, ni comenta, ni publica, ni toca secrets.
11+
contents: read
12+
813
concurrency:
914
group: ${{ github.workflow }}-${{ github.ref }}
1015
cancel-in-progress: true

.github/workflows/contract.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ on:
55
branches: [main]
66
pull_request:
77

8+
permissions:
9+
# Los cuatro workflows solo leen el repo: clonan, instalan y corren
10+
# tests. Ninguno hace push, ni comenta, ni publica, ni toca secrets.
11+
contents: read
12+
813
concurrency:
914
group: ${{ github.workflow }}-${{ github.ref }}
1015
cancel-in-progress: true

.github/workflows/coverage.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ on:
55
branches: [main]
66
pull_request:
77

8+
permissions:
9+
# Los cuatro workflows solo leen el repo: clonan, instalan y corren
10+
# tests. Ninguno hace push, ni comenta, ni publica, ni toca secrets.
11+
contents: read
12+
813
concurrency:
914
group: ${{ github.workflow }}-${{ github.ref }}
1015
cancel-in-progress: true

.github/workflows/docs-links.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@ on:
1212
- 'scripts/check-links.js'
1313
- '.github/workflows/docs-links.yml'
1414

15+
permissions:
16+
# Los cuatro workflows solo leen el repo: clonan, instalan y corren
17+
# tests. Ninguno hace push, ni comenta, ni publica, ni toca secrets.
18+
contents: read
19+
1520
jobs:
1621
check-links:
1722
runs-on: ubuntu-latest

ARCHITECTURE.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
<!-- SPDX-License-Identifier: MIT -->
12
# Sub Rosa — Architecture
23

34
High-level map of the monorepo: components, trust boundaries, round lifecycle, and where each proof runs. For crypto and settlement detail see [docs/TECH_DESIGN.md](./docs/TECH_DESIGN.md).

README.md

Lines changed: 40 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
<!-- SPDX-License-Identifier: MIT -->
12
> [!NOTE]
23
> This repository is the ecosystem contribution workspace for Sub Rosa,
34
> created specifically for participation in the Stellar Wave program. The main
@@ -11,23 +12,21 @@
1112

1213
**1st Place — Hack Privacy Track, Build On Stellar Hackathon — IBW 2026**
1314

14-
**Verifiable allocation infrastructure for Stellar grants, hackathons,
15-
bounties, RFPs, and sealed auctions.** Participants submit sealed scores, bids,
16-
or allocation decisions now; a public, unbiased Drand round unseals them later,
17-
verifiably and all at once. The protocol — not the operator — owns fairness.
15+
**Escrow-backed sealed auction infrastructure for Stellar.** Bidders lock
16+
Stellar assets, submit bids that stay unreadable until a public Drand reveal,
17+
and Soroban settles the winner payment and loser refunds deterministically.
1818

1919
> Built on what's proven. Sealed by math, not by trust.
2020
2121
Sub Rosa is now evolving from a hackathon-winning privacy demo into reusable
22-
allocation infrastructure for Stellar apps: a Soroban primitive, TypeScript
23-
SDK, keeper service, and integration templates for teams that need sealed
24-
judging, scoring, bidding, or allocation without building cryptography from
25-
scratch.
22+
auction infrastructure for Stellar apps: a Soroban primitive, TypeScript SDK,
23+
tlock package, keeper service, and integration templates for teams that need
24+
sealed bids with on-chain settlement.
2625

27-
Target next milestone: **Stellar Community Fund Build Award**. The goal is to
28-
turn the current proof into production-ready developer infrastructure:
29-
`@sub-rosa/sdk`, optional React hooks/components, hosted keeper/reveal
30-
operations, hardened contracts, and mainnet launch.
26+
Target next milestone: a focused **ecosystem build/funding award** resubmission.
27+
The next application should include a named sealed-auction pilot or design
28+
partner, public testnet round receipts, an external funds-handling review
29+
milestone, and a capped mainnet beta path.
3130

3231
Licensed under [MIT](./LICENSE).
3332

@@ -49,16 +48,17 @@ See [docs/LIMITATIONS.md](./docs/LIMITATIONS.md) for honest scope (mainnet ≠ f
4948

5049
## Pilot plan
5150

52-
Sub Rosa's first pilot will run with **OverBlock** as an internal
53-
builder/community environment for sealed judging, bounty allocation, and
54-
grant-style scoring workflows.
51+
Sub Rosa's next pilot target is a **sealed auction or competitive bid round**
52+
with a named Stellar ecosystem team, marketplace, asset issuer, or
53+
auction platform.
5554

56-
Beyond OverBlock, we are actively preparing external pilot conversations with
57-
Stellar ecosystem teams, hackathon organizers, DAOs, and grant/RFP programs
58-
that need sealed scoring, sealed bidding, or verifiable allocation workflows.
55+
The pilot should prove more than "the code works": it should publish round IDs,
56+
participant count, total escrow, settlement/refund receipts, partner feedback,
57+
and a go/no-go decision for a capped mainnet beta.
5958

60-
See [docs/PILOT_PLAYBOOK.md](./docs/PILOT_PLAYBOOK.md) for the pilot scope,
61-
SCF-style demo narrative, and outreach message.
59+
See [docs/PILOT_PLAYBOOK.md](./docs/PILOT_PLAYBOOK.md) for pilot scope and
60+
outreach, and [docs/FUNDING_STRATEGY.md](./docs/FUNDING_STRATEGY.md) for the
61+
funding/resubmission strategy.
6262

6363
---
6464

@@ -94,8 +94,9 @@ const sealed = await sealBid({
9494
await client.commit({ roundId, sealed, escrow });
9595
```
9696

97-
The app layer can be a DAO tool, grants platform, auction UI, RFP workflow, or
98-
allocation dashboard. Sub Rosa supplies the sealed round state machine.
97+
The first app layer should be an auction or competitive bid UI. Other workflows
98+
can still embed the sealed round primitive later, but they no longer lead the
99+
core story.
99100

100101
---
101102

@@ -130,15 +131,17 @@ pnpm mainnet:micro # dry-run checklist; --execute needs MAINNET_CONFIR
130131

131132
## The idea
132133

133-
Public ledgers are transparent by default, which quietly breaks fair allocation
134-
when participants or judges can see each other's inputs too early. That affects
135-
grant scoring, hackathon judging, bounty allocation, RFPs, and sealed auctions.
136-
The usual "fix" trusts the operator. Sub Rosa removes the operator from the
137-
trust path entirely:
134+
Public ledgers are transparent by default, which breaks sealed auctions when
135+
bidders can see the current clearing price before close. The usual "fix" is to
136+
collect bids off-chain and trust the operator. Sub Rosa removes that operator
137+
from the trust path:
138138

139139
- **Seal** each bid with Drand timelock encryption (`tlock`) to a future round R.
140140
- **Force-open** at R: BLS12-381 verified **on-chain** — simultaneous reveal.
141-
- **Settle** deterministically. Identities disclosed only to the auditor.
141+
- **Settle** deterministically: winner escrow pays the operator; losers are
142+
refunded.
143+
- **Disclose selectively:** bid values become public after reveal; identities
144+
can remain auditor-only.
142145

143146
See **[ARCHITECTURE.md](./ARCHITECTURE.md)** for the system map, lifecycle, trust boundaries, and monorepo layout.
144147

@@ -172,8 +175,11 @@ pnpm mainnet:verify # mainnet read-only proof
172175
| Doc | Purpose |
173176
| --- | --- |
174177
| **[ARCHITECTURE.md](./ARCHITECTURE.md)** | System overview, lifecycle, trust boundaries, repo map |
175-
| [docs/SCF_PLAN.md](./docs/SCF_PLAN.md) | SCF Build framing, tranches, deliverables, ecosystem value |
176-
| [docs/PILOT_PLAYBOOK.md](./docs/PILOT_PLAYBOOK.md) | OverBlock pilot scope, external pilot outreach, SCF-style demo narrative |
178+
| [docs/PLATFORM_PLAN.md](./docs/PLATFORM_PLAN.md) | Partner-ready protocol, SDK, template, and pilot delivery plan |
179+
| [docs/BUILD_PLAN.md](./docs/BUILD_PLAN.md) | Focused build/funding framing for sealed auction infrastructure |
180+
| [docs/GRANT_SUBMISSION.md](./docs/GRANT_SUBMISSION.md) | Grant submission narrative for the sealed auction product |
181+
| [docs/FUNDING_STRATEGY.md](./docs/FUNDING_STRATEGY.md) | Reviewer feedback response and resubmission strategy |
182+
| [docs/PILOT_PLAYBOOK.md](./docs/PILOT_PLAYBOOK.md) | Sealed auction pilot scope, outreach, and report template |
177183
| [docs/INTEGRATION.md](./docs/INTEGRATION.md) | How another Stellar app embeds Sub Rosa |
178184
| [docs/TECH_DESIGN.md](./docs/TECH_DESIGN.md) | Cryptography, storage, settlement rails |
179185
| [docs/THREAT_MODEL.md](./docs/THREAT_MODEL.md) | Adversaries, mitigations, honest limits |
@@ -195,19 +201,17 @@ pnpm mainnet:verify # mainnet read-only proof
195201
- [x] Jury UI — one canonical testnet trace (status, bidders, R, auditor blobs, session keys)
196202
- [x] Watch-mode keeper (`pnpm keeper:watch`)
197203

198-
## SCF roadmap
204+
## Funding roadmap
199205

200206
| Tranche | Goal | Deliverables |
201207
| --- | --- | --- |
202-
| 1 | Developer infrastructure | Publish-ready `@sub-rosa/sdk`, integration docs, contract hardening, test vectors |
203-
| 2 | Testnet pilots | Hosted keeper, reusable UI hooks/components, partner pilot templates, testnet dashboards |
204-
| 3 | Mainnet launch | Audited/open-source contracts, mainnet deployment, production keeper ops, launch docs |
208+
| 1 | Auction integration package | Publish-ready `@sub-rosa/sdk`, sealed auction docs, contract hardening, test vectors |
209+
| 2 | Named testnet pilot | Hosted keeper, operator dashboard, public pilot report, partner feedback |
210+
| 3 | Capped mainnet beta | Reviewed contracts, production keeper ops, capped real-asset round, launch docs |
205211

206212
## Cryptographic design (Privacy track)
207213

208214
- **Seal:** Drand tlock IBE, `bls-unchained-g1-rfc9380`
209215
- **Binding:** `H = sha256(value‖nonce)`
210216
- **Unlock:** round-R BLS verified on-chain before reveal
211217
- **Selective disclosure:** values public post-R; identities auditor-encrypted
212-
213-
all done

TASKS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
<!-- SPDX-License-Identifier: MIT -->
12
# Task List: Issue #114 Receipt Schema Version Rejection
23

34
- [ ] Phase 1: Locate offline receipt verifier and inspect current error handling

apps/web/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<meta name="theme-color" content="#05070a" />
77
<meta
88
name="description"
9-
content="Sub Rosa — verifiable allocation infrastructure for Stellar grants, hackathons, bounties, RFPs, and sealed auctions."
9+
content="Sub Rosa — escrow-backed sealed auction infrastructure for Stellar."
1010
/>
1111
<title>Sub Rosa</title>
1212
<link rel="icon" type="image/png" href="/favicon.png" />

apps/web/package.json

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,23 @@
33
"version": "0.1.0",
44
"private": true,
55
"type": "module",
6-
"description": "Jury demo UI — lifecycle, observer, agents, x402, keeper, seal-off vs seal-on attack, mandate cap safety lab.",
6+
"description": "Sealed auction demo UI — lifecycle, observer, agents, x402, keeper, seal-off vs seal-on attack, mandate cap safety lab.",
77
"scripts": {
88
"dev": "vite",
99
"build": "vite build",
1010
"preview": "vite preview",
11-
"test": "node --import tsx --test src/demo/trace-health-check.test.ts src/lib/config.test.ts src/dashboard/fixture-health-check.test.ts src/lib/round-status.test.ts src/components/dashboard/RoundStatusCard.test.tsx",
11+
"test": "node --import tsx --test src/demo/trace-health-check.test.ts src/lib/config.test.ts src/lib/chain.test.ts src/dashboard/fixture-health-check.test.ts src/lib/round-status.test.ts src/components/dashboard/RoundStatusCard.test.tsx src/hooks/useDashboardData.test.ts",
1212
"typecheck": "tsc --noEmit -p tsconfig.json"
1313
},
1414
"dependencies": {
1515
"@stellar/freighter-api": "^6.0.1",
1616
"@stellar/stellar-sdk": "^15.1.0",
1717
"@sub-rosa/agent": "workspace:*",
1818
"@sub-rosa/sdk": "workspace:*",
19+
"@sub-rosa/time": "workspace:*",
1920
"@sub-rosa/tlock": "workspace:*",
2021
"buffer": "^6.0.3",
21-
"commander": "^11.1.0",
2222
"crypto-browserify": "^3.12.1",
23-
"dotenv": "^16.3.1",
2423
"events": "^3.3.0",
2524
"framer-motion": "^12.40.0",
2625
"passkey-kit": "^0.12.0",
@@ -37,7 +36,6 @@
3736
"@vitejs/plugin-react": "^4.4.1",
3837
"tsx": "^4.22.4",
3938
"typescript": "^6.0.3",
40-
"vite": "^6.3.5",
41-
"vitest": "^1.4.0"
39+
"vite": "^6.3.5"
4240
}
4341
}

apps/web/src/App.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
// Copyright (c) 2026 Sub Rosa contributors
12
import { useEffect, useState } from "react";
23
import { getUseCase } from "./config/useCases";
34
import type { UseCaseId } from "./config/useCases";
@@ -8,6 +9,7 @@ import { DashboardPage } from "./pages/DashboardPage";
89
import { DemoPage } from "./pages/DemoPage";
910
import { LandingPage } from "./pages/LandingPage";
1011
import { ToastProvider } from "./ui/Toast";
12+
import { TimeProvider } from "./lib/time";
1113

1214
export default function App() {
1315
const [route, setRoute] = useState<RouteState>(routeFromHash);
@@ -26,10 +28,11 @@ export default function App() {
2628
const active = getUseCase(route.useCase);
2729

2830
return (
29-
<ToastProvider>
31+
<TimeProvider>
32+
<ToastProvider>
3033
{route.page === "landing" ? (
3134
<LandingPage
32-
onDemo={() => navigate("demo", "grants")}
35+
onDemo={() => navigate("demo", "auction")}
3336
onCase={(id) => navigate("demo", id)}
3437
/>
3538
) : route.page === "dashboard" ? (
@@ -48,6 +51,7 @@ export default function App() {
4851
)}
4952
</>
5053
)}
51-
</ToastProvider>
54+
</ToastProvider>
55+
</TimeProvider>
5256
);
5357
}

0 commit comments

Comments
 (0)