Projects
Each card is one chain, one native primitive, one set of deployed contracts.
Compact witnesses + commit-reveal ZK
Bids are hashed client-side (secret key, amount, salt) inside a Compact circuit into a single commitment; disclose() only publishes the amount at reveal time.
No external oracle — all state sourced from the Midnight ledger/indexer.
Architecture
Bidder — private witnesses
never leaves device
Midnight ledger
sealedBids: Map<Uint, Map<Bytes, Bytes>>
bidderPK + sealed hash. Cannot see: amount · salt · secretKey.Bidder discloses
revealBid(auctionId, amount, salt)
Ledger verifies & updates
bidCount / highestBid / highestBidderPK.FHE euint64 / ebool via CoFHE coprocessor
Client-encrypted InEuint64/InEbool inputs are combined on-chain with FHE.select/FHE.eq, settled via the CoFHE threshold network's publishDecryptResult signature.
No price oracle yet — outcomes submitted manually by market owner (Chainlink integration on roadmap).
Architecture
cofheClient (browser)
@cofhe/sdk
ConfidentialPredictionMarket.sol
placeBet(marketId, InEuint64, InEbool)
encAmount (euint64) and msg.value (uint256) are tracked as two separate ledgers — the contract never checks they match. A single bet above ~18.44 ETH worth of wei overflows euint64, desyncing the encrypted payout math from the real market.totalPool.revealWinnerPool() / claimWinnings()
CoFHE threshold network
off-chain signers
submitWinnerPool() / withdraw()
submitResult(); Chainlink integration is on the roadmap.Noir ZK circuits + nullifier-based privacy
A Noir circuit proves cast_vote() validity client-side; a SingleUseClaim nullifier blocks double-voting while the choice itself never leaves the device.
11/11 contract tests passing. Deployed first to Aztec Testnet, then to Alpha Mainnet (v5.0.1, post AZUP-2) with a full create_poll/cast_vote/end_poll e2e run verified on-chain. React frontend in progress.
Architecture
cast_vote(poll_id, choice)
choice never leaves this call
add_to_tally_public(poll_id, choice)
#[external("public")] #[only_self]
"duplicate siloed nullifier" — proven in voting_tests.nr.Native USDC precompile + ERC-8004 agent
Bets settle in USDC via Arc's native precompile (no bridging/wrapping); a separately registered ERC-8004 agent identity (id 6762) exists as off-chain metadata — WeatherMarket.sol has no on-chain dependency on it.
Self-hosted n8n workflow locks the market then submits the result through AdminOracle (onlyOracle-gated); decentralized oracle is on the roadmap.
Architecture
WeatherMarket.sol
placeBet(marketId, bucket, amount)
lockMarket(marketId)
callable by anyone, after lockTime
AdminOracle.submitResult(city, temp, id)
onlyOwner
claimWinnings(marketId)
Payment Memo + Fee Sponsorship + Scheduled Transactions
Settlement writes a structured Payment Memo on-chain, bettors never hold gas thanks to Tempo's Fee Sponsorship relayers, and markets auto-lock via the native Scheduler precompile.
n8n triggers the oracle server's /oracle/settle after lockTime; server signs and submits the result on-chain.
Architecture
placeBet(...) / placeBetFor(..., bettor)
placeBetFor is onlyRelayer
createMarket(...)
native Scheduler precompile
lockMarket(marketId)
auto-fires at lockTime
POST /oracle/settle
Node/Express oracle-server
WeatherMarket.submitResult(id, temp, memo)
0x76 transaction type is viem's fee-token serializer for gas-in-USDC.e mainnet txs — it belongs to Fee Sponsorship, not the Scheduler.Client-side ZK commitments + Poseidon2 hashing
Bet commitments are Poseidon2 hashes computed in-browser WASM, keeping the user's secret local to the device. Oracle signature verification via rpo_falcon512 is planned for a future milestone.
Automated oracle → settle_market pipeline not yet wired end-to-end; settlement is CLI-triggered today.
Architecture
Browser WASM
@miden-sdk/miden-sdk
bets: StorageMap<Word, Felt>
place_bet(...)
settle_market(...)
settle_market() has no signature verification — Miden 0.15's rpo_falcon512_verify only verifies the signature over the tx commitment, not arbitrary messages. Current trust = wallet-key holder + on-chain time-lock only.Native USDC settlement + CCIP/CCTP (deployed, not yet live)
Bets settle directly in USDC on Pharos. A CCIPWeatherOracle contract and an Arc-to-Pharos CCTP bridge script both exist in the repo, but the live settlement path still runs through the same single-owner AdminOracle used on testnet, and the frontend's bridge page is a disabled placeholder.
CCIPWeatherOracle and the CCTP bridge are deployed on mainnet but not wired into WeatherMarket.oracle yet — the settlement path actually in use is the same admin-gated oracle as testnet.
Architecture
placeBet(marketId, bucket, amount)
lockMarket() -> AdminOracle.submitResult(...)
onlyOwner — same as testnet
CCIPWeatherOracle.sol and the Arc-to-Pharos CCTP bridge are both deployed but not wired live: WeatherMarket.oracle still points at AdminOracle, and the frontend's bridge page is a disabled "Coming Soon" stub. The sub-second-finality and cross-chain-CCIP claims in the README aren't yet reflected in what's actually connected on-chain.Shielded types: suint256 / saddress
Trading-pair identifier and alert threshold are stored as encrypted saddress/suint256; checkSpread() compares an input spread against the private threshold inside Seismic's encrypted VM.
No live price feed yet — checkSpread() takes a manually supplied value; README documents a known side-channel limitation.
Architecture
setStrategy(saddress pair, suint256 threshold)
checkSpread(suint256 currentSpread)
event SpreadAlert(user, triggered)
currentSpread input plus the public triggered event let an observer binary-search the private threshold — a real side-channel, not yet fixed.TEE HTTP precompile (0x0801) + ERC-8004 identity
resolveMarket() calls Ritual's HTTP precompile directly; a TEE node selected from TEEServiceRegistry fetches the real HTTPS response, which replays on-chain via Ritual's SPC execution model.
No off-chain oracle bot — the TEE executor fetches live HTTPS data as part of Ritual's own execution pipeline.
Architecture
resolveMarket(marketId)
TEEServiceRegistry
0x…0801 precompile
Ritual SPC model
Settle & emit
IdentityRegistry is deployed standalone — WeatherMarket.sol has zero references to it; the link is off-chain metadata only.Native tokenized equity tokens (TSLA, AMZN, PLTR, AMD, NVDA)
createMarket() binds each market directly to the on-chain address of a Robinhood Chain tokenized stock; settlement reads Chainlink price feed wrappers mirroring AggregatorV3Interface.
Parimutuel settlement minus a 2% fee, with a 3-day staleness tolerance on the price feed for market closures.
Architecture
createMarket(stockToken, priceFeed, symbol, duration)
ChainlinkPriceFeed.latestRoundData()
wraps AggregatorV3Interface
lockMarket() / settleMarket()
claimWinnings()
Single-chain price market (microchains architecture planned)
CreateRound/PlaceBet/ResolveRound/Claim all run on one chain today. The README's user-microchain-to-market-microchain messaging design is the intended architecture, but the deployed contract sets Message = () and execute_message() panics — there is no cross-chain messaging yet.
Cross-chain microchain messaging, emit_event!, and the payout-message flow are described in the README as the intended design but aren't implemented in contract.rs yet — Message = () and execute_message() panics. CoinGecko calls are also blocked by Conway testnet's http_request_allow_list, so prices are fed in by an external bot via ResolveRound.
Architecture
Operation enum
PriceMarket state
PlaceBet message to a shared market chain, with a payout message flowing back — but the deployed contract sets Message = () and execute_message() panics with "PriceMarket does not support cross-chain messages". There's no emit_event! call either. This is a single-chain prototype today, not the microchains design described in the README.