01 — COVER
WTF!! HACKATHON · iEXEC NOX
Bet what you know,
not who you are.

Private positions on a real prediction market — the official Gnosis Conditional Tokens market, byte-for-byte, with a confidential participation layer welded on by iExec Nox.

Live on Ethereum Sepolia ERC-7984 · Intel TDX 197 tests green
Alice
0x9f3c…enc
0x0000…enc
Bob
0x71ab…enc
0x0000…enc
Carol
0x44de…enc
0x0000…enc
Dana
0x0000…enc
0x1c62…enc
4 identical commitBet txs · one dissented with size · which one? unfindable
02 — HOOK
NOXORACLE
The uncomfortable truth

4 identical transactions.
One dissenter.
Unfindable.

A transparent market can only price the truth people are willing to sign their name to. Everyone else self-censors — and the market loses exactly the information it exists to collect.

03 — PROBLEM
NOXORACLE
The 2am problem

The informed
can't afford
to be seen.

A policy analyst is certain the consensus is wrong. A $10k on-chain bet against her employer's public position is a firing offense the second anyone links her wallet. So the market never learns what she knows.

direction leaks size leaks timing leaks wallet linkable forever
Polymarket-style order book · public
WalletSideSizeSeen by
0x71ab…9cYES$4,000everyone
0x44de…13YES$6,000everyone
0xa1c6…danaNO$10,000her boss, too
0x9f3c…22YES$7,000everyone
Every position is doxxable. Whales front-run it, employers punish it.

Prior privacy attempts rebuild the whole market from scratch — and die without liquidity. Nobody trades where nobody trades.

04 — SOLUTION
noxoracle.edycu.dev
The solution

Two sealed
numbers. Zero
direction.

Keep the real market untouched. Add a confidential layer: every bet is committed as two encrypted amounts — a YES-stake and a NO-stake, one of them an encrypted zero. Direction never exists in plaintext, anywhere.

Bet what you know, not who you are.

noxoracle.edycu.dev/market
Will the incumbent lose the runoff?
YES
NO ✓
handle · YES
enc(0)
handle · NO
enc(500)
→ encryptInput × 2 (Promise.all)
→ commitBet(hYes, hNo, pYes, pNo)
✓ sealed in Intel TDX — chain sees two handles
05 — ARCHITECTURE
NOXORACLE
How it works · one flow, three phases

Encrypted in. Aggregate out. Encrypted back.

BROWSER Bet slip side → (amt, 0) / (0, amt) HandleClient encryptInput ×2 Promise.all — concurrent iEXEC NOX GATEWAY Intel TDX enclave seals direction + size NOVEL CONTRACT · Sepolia NoxOraclePool.sol ① commitBet — dual handle, per-user ACL sumYes / sumNo = Nox.add(…) · encrypted ② closeEpoch — allowPublicDecryption aggregates ONLY (I2, greppable) ③ settle / claim — Nox.mul/div × public rate pooled cUSD custody · nothing in wallets UNMODIFIED · HASH ✓ Gnosis FPMM 1.8.1 buy(plainYes) · buy(plainNo) one batch · plaintext ONLY here UNMODIFIED · HASH ✓ Conditional Tokens 1.0.3 reportPayouts · redeemPositions the real market — untouched /verify · JUDGE TOOL verify-epoch 1 recompute I1–I5 from chain data alone ✓ conservation ✓ aggregation-only ✓ bytecode purity
commit-private · dual encrypted handle batch-execute-public-aggregate · sums only decrypt claim-private · encrypted × public scalar
06 — LIVE DEMO · THE HERO MOMENT
NOXORACLE
The one devastating demo
"Four people just bet
on this market.
Tell me who bet NO."
Aggregate · YES
1,700
publicDecrypt(sumYes)
Aggregate · NO ✓ wins
500
publicDecrypt(sumNo)

The market knows the information — someone dissented with size — but not the informant. Aggregates decrypt. Individuals never do.

D Dana's position card
sign → decrypt(own)
NO 500 cUSD — unsealed for her alone
✓ claim paid: exactly the pot
= 1,626.1277 cUSD
k-anonymity meter · k = 4
ABCyou?
membership public · side + size hidden · k≥3 ✓
07 — THE ONE FLOW · PROVEN ON-CHAIN
sepolia.etherscan.io
One flow, extreme depth — every phase is a real Sepolia transaction

commit-private → aggregate → claim-private

→
PHASE 01

Commit — private

commitBet(hYes, hNo, …)

4 bettors, each two sealed handles. k = 4. Direction never plaintext.

→
PHASE 02

Execute — public aggregate

executeEpoch → FPMM.buy×2

Only sums decrypt: YES 1,700 / NO 500, routed through the real FPMM in one batch. NO resolves.

PHASE 03

Claim — private

claim() · Nox.mul/div

Dana's sealed NO 500 pays exactly the pot — 1,626.1277 cUSD. Even her win stays hers to disclose.

Zero mock data. The full confidential cycle — commit → close → execute → finalize → settle → claim — ran end-to-end on live Sepolia over a byte-for-byte unmodified Gnosis CTF market.
08 — WHY ONLY iEXEC NOX
ERC-7984 · TECHNICAL DEPTH
The SDK is the engine, not decoration

Six Nox primitives. Remove one, the product dies.

Nox primitiveWhat it does hereWithout it you need…
aggregation-only allowPublicDecryptionreveals epoch sums only (I2)a threshold-decryption committee
dual encryptInput + fromExternaldirection-free (amtYes, amtNo)…or a side-bit leaks in calldata
per-user ACL (allowThis / addViewer)decrypt-your-own-position forevera custodial account database
IERC-7984 pooled custody + operator-pullnothing position-shaped in walletspositions in wallets = the linkage
2-step unwrap → finalizeUnwrapplaintext exits ONLY at the FPMMa trust-me bridge
Nox.mul / div (× public scalar)public-rate confidential claimsleaked stakes at claim time
Strip Nox out and you're building four separate systems — an FHE coprocessor, a decryption committee, a custodial batcher, a disclosure registry — and still couldn't compose with the CTF market on the same chain.
09 — DEPLOYED & VERIFIABLE
ETHEREUM SEPOLIA
Deployed on Sepolia · source-verified · recomputable

Read the contract. Don't take our word.

NoxOraclePool novel · source-verified ✓0xfFba9520…83d4a2E
ConditionalTokens 1.0.3 unmodified · bytecode hash ✓0xCd316D06…62eA734a5
FPMM 1.8.1 instance unmodified · real market0xBf4900df…BEEf4cc3
cUSD wrapper ERC-7984 confidential USD0x82C281D7…7468991
197
tests green · 134 logic + 63 solidity
100%
contract coverage
k=4
live epoch anonymity set
$ npm run verify-epoch 1
recomputing from chain data…
✓ I1 conservation Σ stakes ≡ sums
✓ I2 aggregation-only disclosure
✓ I3 faithful routing → FPMM
✓ I4 claims bounded ≤ pot
✓ I5 CTF MATCH · FPMM MATCH
→ EPOCH 1 GREEN
check-artifacts confirms CTF + FPMM on-chain bytecode ≡ the official npm artifacts. The "unmodified" claim is CI-proven, not asserted.
10 — WHY THIS WINS
NOXORACLE
The unfair advantage

Privacy on the real market — not a fork of it.

Composability others can't have

Privacy-market rivals rebuild the exchange and starve for liquidity. We add confidentiality to the official Gnosis CTF + FPMM, byte-for-byte — the liquidity is already there.

Privacy that survives settlement

Direction and size stay hidden through and after resolution — not just until the reveal. Membership is public; what you believed and how much never is.

Caught live, not in a mock

First Sepolia run reverted in executeEpoch (NotAllowed 0xb87a12a9): the token re-enters TDX under its own identity, so the pool must allowTransient the burn. A permissive mock hid it. Fixed, redeployed, re-ran green — logged in feedback.md #16.

11 — SHIPPED · & HONEST LIMITS
NOXORACLE
What actually shipped

A real product, and honest about its edges.

197
tests green — full confidential cycle covered
6
on-chain proof txs, one per phase, Sepolia
7
-stage CI/CD — CodeQL, Dependabot, TruffleHog
1
novel contract on the real Gnosis market
→
k-anonymity is bounded by epoch size. In-product meter + a k<3 warning + a seeded bad epoch #0. Membership is public; only side and size hide.
→
Batching trades latency for FPMM price drift. Slippage guards on every buy — the privacy/price trade-off, stated up front.
→
Demo oracle is a disclosed centralized EOA. reality.eth is the named production path; CTF is oracle-agnostic.
→
Nox SDK is beta 0.1.0-beta.13. Findings and the caught-live revert are logged in feedback.md.
12 — THE ASK
WTF!! HACKATHON · iEXEC NOX
Try the demo — then judge us on it

Run the epoch.
Then ask who bet NO.

Bet what you know, not who you are.
Live on Sepolia 197 tests · 100% coverage ≤4-min demo video
QR - scan to open https://noxoracle.edycu.dev
scan → noxoracle.edycu.dev
NoxOracle
built solo · WTF!! Hackathon
01 / 12
← → navigate · ESC grid · P presenter · C contrast

All slides — click to jump · ESC to close