Protocol Specification
Glasshouse: adversarial disclosure for tokenized-equity venues
Glasshouse is a settlement layer for security disclosure. It removes the disclosed party from the verification path, prices the truth of a finding on an open market, and pays the researcher on attestation rather than on the venue’s cooperation.
- Revision
- 0.4 — working draft
- Target runtime
- EVM L2, single-sequencer
- Settlement asset
- Canonical stablecoin
- Status
- Pre-testnet
01 Overview
A tokenized-equity venue holds three things a researcher can break: the matching and custody rails that move positions, the collateral logic that keeps a token backed, and the bridge surface that connects the venue to the chains it settles on. A finding against any of these is worth money to whoever holds it, and the current disclosure path routes that finding directly to the one party with an incentive to suppress it.
Glasshouse restructures that path. A finding enters under seal, is verified by a staked panel that cannot include the disclosed venue, and resolves on a market whose outcome is determined by the attestation certificate rather than by any statement the venue makes.
1.1 Disclosure asymmetry
Coordinated disclosure assumes the receiving party wants the finding fixed. That assumption holds for most software vendors and fails for a venue whose unpatched exploit is economically useful to insiders, or whose disclosure would be materially adverse. The failure modes are ordinary:
- Silent expiry. The report is received, never acknowledged, never patched. The researcher has no recourse that does not involve publishing an unpatched exploit.
- Reward capture. The venue defines both the severity and the payout, after it already holds the finding.
- Selective remediation. The vulnerability is quietly patched and the disclosure is never published, so the market never learns the venue was exposed.
In each case the venue is simultaneously the accused, the judge, and the paymaster. Glasshouse separates those three roles into three parties with independent incentives.
1.2 Design goals
| ID | Goal | Enforced by |
|---|---|---|
| G-1 | No unpatched finding is public before the remediation window closes | Sealed ingress, threshold decryption |
| G-2 | The disclosed venue never participates in verifying its own claim | Recusal filter at quorum formation |
| G-3 | Researcher payout is independent of venue cooperation | Escrowed pool, attestation-triggered release |
| G-4 | A false claim is more expensive than filing nothing | Filer bond, slashing on rejection |
| G-5 | Non-participation is observable | Registry coverage flag |
| G-6 | Settlement is deterministic and independently recomputable | On-chain certificates, public event log |
1.3 Non-goals
- Glasshouse does not assess individual tokenized securities, issuers, or their underlying equities. The scanned surface is venue infrastructure only.
- Glasshouse is not a replacement for a pre-deployment audit. It operates against systems already carrying live value.
- The protocol does not execute, prove, or reproduce exploits against production systems. Verification operates on forked state.
No protocol action publishes a finding’s technical payload while the associated
remediation window is open and the venue is in ACKNOWLEDGED or
PATCHING. This holds regardless of market state.
02 System architecture
Seven components. Three run on-chain as contracts, three are off-chain services with on-chain anchoring, and one is a client library distributed to agent operators.
2.1 Components
| Component | Runtime | Responsibility |
|---|---|---|
| gh-agent-sdk | Operator host | Scanner scheduling, finding normalization, envelope construction, submission signing. |
| gh-gateway | Service | Authenticated ingress, per-agent rate limiting, envelope sealing, commitment anchoring. |
| gh-panel | Attestor client | Threshold decryption, independent review, severity assignment, BLS partial signature. |
| gh-sandbox | Service | Deterministic forked-state execution of a candidate finding. Never touches production. |
| gh-vault | Contract | Custody of filer bonds, attestor stake and venue coverage bonds. Executes slashing. |
| gh-market | Contract | Pool accounting, position tracking, deterministic settlement from a quorum certificate. |
| gh-registry | Contract | Canonical disclosure record, remediation deadlines, venue coverage state. |
2.2 Trust boundaries
The gateway is trusted for availability but not for integrity: it never holds plaintext it
can read alone, and every accepted submission is anchored by a commitment the filer can
prove independently. The panel is trusted for correctness under an honest-majority
assumption bounded by t of n attestors. Contracts are trusted for
execution and hold all custody.
A gateway operator acting alone cannot read a finding payload, cannot forge an attestation, and cannot alter a settlement outcome. Gateway compromise degrades liveness, not confidentiality or correctness.
03 Claim lifecycle
A claim is the protocol’s unit of work. It carries a commitment, a sealed payload, a
target venue, a bond reference and — after quorum — a certificate. Claims move
through a strictly ordered state machine; no transition is reversible except
DISPUTED, which re-enters review once.
3.1 States
| State | Payload visibility | Market | Exit condition |
|---|---|---|---|
| SEALED | Encrypted, undecryptable | Closed | Gateway anchors commitment |
| TRIAGE | Panel only, threshold-decrypted | Closed | Quorum reached or review deadline |
| ATTESTED | Panel only | Closed | Certificate written to registry |
| WINDOW | Venue + panel | Closed | Patch proof accepted, or deadline expiry |
| DISCLOSED | Public | Open | Trading period ends |
| DISPUTED | Public | Halted | Second review concludes |
| REJECTED | Sealed, permanently | Never opened | Terminal |
| SETTLED | Public | Closed | Terminal |
The market cannot open before DISCLOSED. This is the structural reason
Glasshouse cannot be used to trade on a live unpatched exploit: at every state where the
finding is exploitable and secret, there is no market to take a position on.
3.2 Transition rules
// transition guards, evaluated in gh-registry SEALED → TRIAGE requires bond.locked && commitment.anchored TRIAGE → ATTESTED requires |sig| ≥ t && recusal.clean && severity.agreed TRIAGE → REJECTED requires |sig| < t at review.deadline ATTESTED → WINDOW auto, deadline = now + window(severity) WINDOW → DISCLOSED on patchProof.verified or block.timestamp > deadline DISCLOSED→ SETTLED on tradingPeriod.elapsed && !dispute.raised DISCLOSED→ DISPUTED on challengeBond.posted within challengeWindow DISPUTED → SETTLED on secondReview.final // no further appeal
04 Sealed ingress
Ingress must satisfy two properties that pull against each other: the protocol has to prove a specific finding existed at a specific time, and no party may be able to read it until the panel is assembled. The first is solved by commitment, the second by threshold encryption.
4.1 Envelope format
// submitted to gh-gateway; only `header` is ever readable pre-quorum { "header": { "venue": "gh:venue:<registry-id>", "surface": "custody" | "matching" | "collateral" | "bridge", "claimedSev": "S0" | "S1" | "S2" | "S3", "agent": "gh:agent:<pubkey-hash>", "nonce": "<uint64>", "submittedAt": "<unix-seconds>" }, "commitment": "keccak256(payload ‖ salt)", "payload": "<threshold-encrypted blob>", "encScheme": "tpke-bls12381-g1", "sig": "<agent signature over header ‖ commitment>" }
The header is deliberately coarse. It carries enough for routing, recusal and rate limiting,
and not enough to identify the vulnerability class. claimedSev is the
filer’s assertion and carries no weight at settlement; the panel assigns the binding
severity.
4.2 Commit–reveal
- The agent computes
C = keccak256(payload ‖ salt)and encryptspayloadto the current panel epoch public key. - The gateway anchors
C, the header and the agent signature on-chain. The anchoring transaction establishes priority: the earliest anchored commitment for a colliding finding is the one that pays. - At quorum formation,
tattestors each contribute a decryption share. Reconstruction happens in the attestor client, never at the gateway. - At disclosure,
saltis published, so any observer can recomputeCand confirm the published finding is byte-identical to the one committed before review.
The disclosed payload always hashes to the commitment anchored at ingress. A panel that alters a finding during review produces a certificate that fails public verification.
05 Attestation layer
Attestation replaces the venue as arbiter. An attestor is an address with stake locked in
gh-vault, a published identity commitment, and a disclosed affiliation set used
for recusal.
5.1 Quorum and certificates
Each claim draws a panel of n attestors by verifiable random selection seeded
on the anchoring block hash, filtered by the recusal predicate. A certificate is valid when
at least t partial BLS signatures over the same
(claimId, verdict, severity, payloadHash) tuple aggregate successfully.
// aggregate verification, executed on-chain function verify( bytes32 claimId, uint8 verdict, // 0 = reject, 1 = affirm uint8 severity, bytes32 payloadHash, bytes aggSig, uint256 signerBitmap ) returns (bool) { require(popcount(signerBitmap) ≥ threshold); require(noRecusalViolation(claimId, signerBitmap)); return blsVerify(aggregateKeys(signerBitmap), digest(claimId, verdict, severity, payloadHash), aggSig); }
Severity is agreed by median of submitted values among affirming signers, not by unanimity. A signer whose severity deviates by more than one band from the median is recorded; repeated deviation reduces selection weight.
5.2 Severity taxonomy
Generic vulnerability scoring maps poorly onto venue infrastructure, where the meaningful axis is value at risk rather than exploit complexity. Glasshouse uses four bands.
| Band | Definition | Window | Pool weight |
|---|---|---|---|
| S0 | Direct loss of custodied assets, or unbacked mint of a tokenized position | 72h | 1.00 |
| S1 | Collateralization can breach threshold undetected; forced liquidation path | 7d | 0.65 |
| S2 | Liquidity or settlement disruption without permanent loss | 14d | 0.35 |
| S3 | Information leakage, accounting drift, degraded controls | 30d | 0.15 |
5.3 Recusal rules
An attestor is excluded from a panel when any of the following holds. Violation is slashable, and detection is retrospective — affiliations are published as commitments and revealed on challenge.
- The attestor’s disclosed affiliation set intersects the target venue’s operator set.
- The attestor operates, or shares an operator with, the filing agent.
- The attestor holds an open position on the claim, or on any claim against the same venue
in
DISCLOSED. - The attestor was slashed within the preceding cooldown period.
06 Remediation window
On attestation the venue receives the finding and a deadline derived from severity. The window is the only period in which the protocol withholds information from the public, and it is bounded on both ends.
- Acknowledgement. The venue may acknowledge, which is recorded but grants no extension. Silence is not a veto and does not pause the clock.
- Patch proof. The venue submits a proof of remediation — a
deployment reference plus a sandbox re-run that fails to reproduce. Acceptance moves the
claim to
DISCLOSEDimmediately, with remediation noted. - Expiry. At deadline, disclosure publishes regardless of venue state. There is no extension mechanism and no administrative override.
A venue with a coverage bond may request one extension per claim, capped at the original window, which is drawn against that bond. This is the only cooperation-linked concession in the protocol and it costs the venue capital rather than time granted for free.
07 Market engine
The market prices one proposition: this finding, as disclosed, is a genuine vulnerability of the attested severity against the named venue. It opens only on disclosure and resolves from the certificate.
7.1 Pool mechanics
Positions are parimutuel rather than order-book. A pool avoids the thin-book failure mode that would otherwise let a well-capitalized venue set the price on its own claim, and makes settlement a division rather than a matching problem.
// settlement, YES resolution poolTotal = yesStake + noStake protocolFee = poolTotal × feeRate distributable = poolTotal − protocolFee filerShare = distributable × filerRate × severityWeight winnerPool = distributable − filerShare for each position p in YES: payout(p) = winnerPool × (p.stake / yesStake)
The filer’s share scales with attested severity, not with claimed severity or pool size alone. A trivial finding that attracts speculative volume does not pay out like a custody break.
7.2 Settlement
Settlement is a pure function of on-chain state: the certificate, the position ledger and the parameter set at the block the claim was disclosed. Any observer can recompute every payout from public events. Parameters are pinned per-claim at disclosure so a governance change cannot retroactively alter an open market.
No settlement path reads venue-supplied data. A venue that refuses to engage entirely cannot delay, block, or alter payout.
08 Collateral and slashing
Three distinct bonds, held by gh-vault, each answering a different failure.
| Bond | Posted by | Released on | Slashed on |
|---|---|---|---|
| filerBond | Agent operator | Attestation affirmed | Quorum rejects; duplicate of an earlier commitment; malformed payload |
| attestorStake | Attestor | Unbonding period after exit | Recusal violation; signing a certificate overturned on dispute; liveness failure |
| coverageBond | Venue | Voluntary exit after all claims settle | Extension draw; failure to honour an accepted remediation commitment |
| challengeBond | Challenger | Dispute upheld | Dispute dismissed |
Slashed filer bonds do not accrue to the venue under any condition. Routing them to the accused would create a direct incentive to influence rejection. Destination is one of treasury, attestor reward pool, or burn — see §13.
A venue with no coverage bond is not exempt from claims. It is recorded in the registry
as coverage: none, which the indexer exposes as a public field. Non-participation
is a disclosure, not an escape.
09 Agent interface
Agents are autonomous scanners registered by an operator who posts bond on their behalf. The protocol is indifferent to whether an agent is a model, a fuzzing harness, a static analyzer or a person driving the SDK by hand; it verifies findings, not authorship.
9.1 SDK surface
// gh-agent-sdk, operator-side const agent = await Glasshouse.register({ operator: wallet, bond: parseUnits("...", 6), surfaces: ["custody", "collateral"], }); agent.on("venue:registered", async (venue) => { const findings = await scan(venue.surfaces); for (const f of findings) { await agent.submit({ venue: venue.id, surface: f.surface, claimedSev: f.severity, payload: f.report, // sealed client-side before transit }); } }); agent.on("claim:attested", (c) => log(c.id, c.severity, c.window)); agent.on("claim:settled", (c) => log(c.id, c.payout));
9.2 Reputation
Each agent carries a rolling record: submissions, affirmation rate, median attested severity, and slashing history. Reputation is not a score the protocol trusts — it does not gate settlement — but it drives two mechanisms:
- Bond scaling. Required
filerBondis a function of recent affirmation rate. A consistently accurate agent posts less capital per claim. - Ingress priority. Under gateway congestion, submissions are ordered by reputation before timestamp, bounded so a new agent cannot be starved indefinitely.
An operator whose agent is rejected repeatedly enters a cooldown during which the agent cannot file. The cooldown is per-agent, not per-operator, and does not transfer on re-registration — identity is bound to the operator’s bonded address.
10 Threat model
| ID | Adversary and objective | Mitigation |
|---|---|---|
| T-1 | Filer exploits their own finding before disclosure to force a YES resolution | Resolution derives from the certificate, not from observed on-chain damage. Exploiting does not change the verdict and forfeits the bond if the finding is withdrawn. |
| T-2 | Observer front-runs disclosure by monitoring ingress | Payload is threshold-encrypted; header carries no vulnerability class. Anchoring reveals that a claim exists against a venue, not what it is. |
| T-3 | Venue infiltrates the panel to force rejection | Verifiable random selection, recusal predicate, slashable affiliation, and dispute path with challenge bond. |
| T-4 | Attestor cartel affirms a fabricated finding to drain a pool | Public payload at disclosure; any observer can reproduce in sandbox and raise a dispute. Overturned certificates slash every signer. |
| T-5 | Sybil agents flood ingress to degrade the gateway | Per-agent bond, rate limits keyed to bonded address, reputation-ordered admission. |
| T-6 | Griefing via duplicate submission of a known finding | Commitment priority; later colliding commitments are rejected and bonded capital is slashed. |
| T-7 | Venue stalls remediation to run out the market clock | Deadline is enforced by block timestamp with no override; expiry publishes. |
| T-8 | Governance alters parameters mid-market to change payouts | Parameters pin per-claim at disclosure. Live markets are immune to parameter change. |
T-4 is bounded but not eliminated: a cartel controlling more than t stake can
produce a valid certificate for a false finding, and the protocol relies on the dispute
path plus stake loss to make that unprofitable. Attestor set decentralization is therefore
a live security parameter, not a launch detail.
11 Parameters
Protocol constants and their intended calibration. Values marked provisional are targets for testnet calibration, not commitments; they are pinned per-claim at disclosure once set.
| Symbol | Meaning | Target | Status |
|---|---|---|---|
| t / n | Attestation threshold over panel size | 5 / 9 | Provisional |
| filerRate | Share of distributable pool to the filing operator | 0.20 | Provisional |
| feeRate | Protocol fee on pool total | — | Unset |
| window(S0..S3) | Remediation deadline by severity band | 72h / 7d / 14d / 30d | Provisional |
| cooldown | Post-rejection filing lock, per agent | 604800s | Provisional |
| reviewDeadline | Maximum time in TRIAGE before auto-reject | 120h | Provisional |
| challengeWindow | Dispute period after disclosure | 48h | Provisional |
| tradingPeriod | Market open duration before settlement | — | Unset |
| unbonding | Attestor stake withdrawal delay | 21d | Provisional |
12 Roadmap
Sequenced by dependency rather than date. Each phase closes on a capability, and no phase that touches live value ships before the phase that verifies it.
Protocol definition
- State machine, envelope format and certificate schema frozen
- Severity taxonomy validated against historical venue incidents
- Threat model reviewed externally; residual risks documented
- Parameter ranges bounded for testnet calibration
Verification core
gh-sandboxdeterministic forked-state replay across target chainsgh-panelattestor client with threshold decryption and BLS aggregation- Certificate verification contract, gas-bounded for a 9-signer panel
- Reproducibility harness: identical certificate from independent replays
Custody and settlement
gh-vaultbond custody, slashing execution, unbonding queuegh-marketparimutuel accounting with per-claim parameter pinninggh-registrydisclosure record, deadline enforcement, coverage state- Testnet with synthetic venues and seeded findings; end-to-end settlement
Ingress and agents
gh-gatewaysealing, anchoring, rate limiting, congestion orderinggh-agent-sdkpublic release with surface adapters- Reputation accounting and bond scaling
- Attestor onboarding: staking, affiliation commitments, selection weighting
Guarded mainnet
- Capped pools and a permissioned attestor set
- Venue onboarding with coverage bonds; registry coverage feed public
- Independent audit of vault, market and certificate verification
- Dispute path exercised against deliberately seeded false certificates
Open participation
- Permissionless attestor entry above a stake floor
- Pool caps lifted; fee parameters set by governance
- Coverage feed exposed as a consumable signal for external risk systems
- Cross-venue disclosure correlation
13 Open problems
Recorded rather than deferred quietly. Each blocks a parameter freeze, not the architecture.
| Ref | Problem | Constraint |
|---|---|---|
| O-1 | Destination of slashed filer bonds | Must not accrue to the accused venue; must not create an incentive for attestors to reject. |
| O-2 | Bond size at ingress | High enough to price out spam, low enough that an unfunded independent researcher can still file. |
| O-3 | Whether a filing operator may hold a position on its own claim | Self-dealing versus skin-in-the-game; interacts with T-1. |
| O-4 | Attestor compensation source | Fee share, inflation, or challenge-bond capture; must not scale with affirmation rate. |
| O-5 | Window length calibration | Long enough for a venue to ship a real fix, short enough that delay is not a strategy. |
| O-6 | Coverage bond sizing and venue exit terms | Must make participation cheaper than the reputational cost of coverage: none. |
14 Glossary
| Attestor | A staked address selected to review sealed claims and contribute partial signatures to a certificate. |
| Certificate | An aggregated threshold signature over a claim’s verdict, severity and payload hash. The sole input to settlement. |
| Claim | The protocol’s unit of work: a committed, sealed finding against a named venue surface. |
| Coverage | A venue’s participation state in the registry. Absence is recorded, not hidden. |
| Filer | The operator whose bonded agent submitted a claim. |
| Surface | A classified area of venue infrastructure: custody, matching, collateral or bridge. |
| Venue | A platform operating tokenized-equity or RWA trading infrastructure. The unit under scan; never the asset itself. |
| Window | The bounded remediation period between attestation and mandatory disclosure. |