Skip to content

feat: add MetaDAO Futarchy connector (experimental) - #643

Draft
fengtality wants to merge 3 commits into
developmentfrom
feat/metadao-connector
Draft

feat: add MetaDAO Futarchy connector (experimental)#643
fengtality wants to merge 3 commits into
developmentfrom
feat/metadao-connector

Conversation

@fengtality

Copy link
Copy Markdown
Contributor

Summary

Adds an experimental connector for MetaDAO's
Futarchy program on Solana. Futarchy is a prediction-market governance
mechanism where proposals are decided by trading conditional outcome tokens
("buy if pass, sell if fail") against an underlying spot market.

Marking as draft / experimental — the API shape may evolve. Modelled
after the ORE experimental connector pattern (#578).

Features

Spot market

  • POST /connectors/metadao/futarchy/quote-swap — Quote a spot swap
  • POST /connectors/metadao/futarchy/execute-swap — Execute a spot swap

Conditional markets (prediction)

  • POST /connectors/metadao/futarchy/quote-conditional-swap — Quote against a proposal's conditional outcome pool
  • POST /connectors/metadao/futarchy/execute-conditional-swap — Execute against the conditional pool

Liquidity

  • POST /connectors/metadao/futarchy/quote-liquidity
  • POST /connectors/metadao/futarchy/add-liquidity
  • POST /connectors/metadao/futarchy/remove-liquidity

Discovery & info

  • GET /connectors/metadao/futarchy/daos — list DAOs from chain
  • GET /connectors/metadao/futarchy/pools — list cached pools (daos.json)
  • GET /connectors/metadao/futarchy/dao-info — DAO details by address
  • GET /connectors/metadao/futarchy/pool-info — pool info by base token
  • GET /connectors/metadao/futarchy/balance — token balances
  • GET /connectors/metadao/futarchy/proposals — proposals for a DAO
  • GET /connectors/metadao/futarchy/proposal-info — proposal details

Configuration

The connector uses hardcoded MetaDAO Futarchy program IDs (mainnet-beta).
Configuration options in conf/metadao.yml:

  • programId — MetaDAO Futarchy program
  • conditionalVaultProgramId — Conditional Vault program
  • defaultSlippagePct — default 1%

Implementation notes

  • Token-2022 compatibility — conditional outcome tokens are Token-2022,
    so ATA creation handles both program IDs.
  • DAO cache — 58 DAOs pre-bundled in
    src/connectors/metadao/daos.json; refresh via
    scripts/fetch-metadao-daos.ts.
  • Anchor IDL — bundled at src/connectors/metadao/idl/futarchy.json.
  • Namespacemetadao registered in templates/root.yml, defaults
    in templates/connectors/metadao.yml.

Test plan

  • pnpm install && pnpm build && pnpm start --passphrase=xxx --dev
  • GET /config/connectors → list includes metadao on solana
  • GET /connectors/metadao/futarchy/daos?network=mainnet-beta → returns array of DAOs
  • GET /connectors/metadao/futarchy/pools?network=mainnet-beta → returns cached pool list (≥ 58 entries)
  • GET /connectors/metadao/futarchy/pool-info?network=mainnet-beta&baseToken=<symbol> → returns pool info with reserves + price
  • POST /connectors/metadao/futarchy/quote-swap with a small amount on an active DAO → returns price + expectedAmount
  • With a funded wallet: POST /connectors/metadao/futarchy/execute-swap → tx signature returned, lands on chain
  • For an active proposal: quote-conditional-swap returns pass/fail prices; execute-conditional-swap mints the conditional pair and swaps

Diff

26 files changed, ~3300 insertions

Files added:

  • src/connectors/metadao/ — connector implementation (config, main class, 14 route files, 2 JSON assets)
  • src/schemas/metadao-schema.ts — TypeBox request/response schemas
  • src/templates/connectors/metadao.yml + src/templates/namespace/metadao-schema.json
  • scripts/fetch-metadao-daos.ts — refresh script for daos.json

Files modified:

  • src/app.ts — register routes, add Swagger tag
  • src/config/routes/getConnectors.ts — list metadao in /connectors
  • src/templates/root.yml — register metadao namespace
  • package.jsoncopy-files includes metadao/*.json

🤖 Generated with Claude Code

Adds an experimental connector for MetaDAO's Futarchy program on
Solana. Futarchy is a prediction-market governance mechanism where
proposals are decided by trading conditional outcome tokens — "buy if
pass, sell if fail" — against an underlying spot market.

Spot endpoints
- POST /connectors/metadao/futarchy/quote-swap
- POST /connectors/metadao/futarchy/execute-swap

Conditional-market endpoints
- POST /connectors/metadao/futarchy/quote-conditional-swap
- POST /connectors/metadao/futarchy/execute-conditional-swap

Liquidity
- POST /connectors/metadao/futarchy/quote-liquidity
- POST /connectors/metadao/futarchy/add-liquidity
- POST /connectors/metadao/futarchy/remove-liquidity

Discovery + info
- GET  /connectors/metadao/futarchy/daos
- GET  /connectors/metadao/futarchy/pools
- GET  /connectors/metadao/futarchy/dao-info
- GET  /connectors/metadao/futarchy/pool-info
- GET  /connectors/metadao/futarchy/balance
- GET  /connectors/metadao/futarchy/proposals
- GET  /connectors/metadao/futarchy/proposal-info

Implementation notes
- Token-2022 compatibility for ATA creation (conditional tokens use
  Token-2022)
- 58 DAOs pre-cached in src/connectors/metadao/daos.json; refresh via
  scripts/fetch-metadao-daos.ts
- Anchor IDL bundled at src/connectors/metadao/idl/futarchy.json
- Config namespace registered in templates/root.yml; defaults in
  templates/connectors/metadao.yml

This is an experimental connector — APIs may change. Modelled after the
ORE experimental connector pattern (#578).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
fengtality and others added 2 commits August 1, 2026 09:49
…onnector

# Conflicts:
#	src/app.ts
#	src/config/routes/getConnectors.ts
#	src/templates/root.yml
…metrics

The futarchy connector could not execute conditional swaps and returned zero
conditional balances. Fixes verified live on mainnet:

- getProposalPdas now reads question/vaults/conditional mints from the on-chain
  proposal account instead of deriving them from wrong seeds (which produced
  nonexistent addresses).
- buildConditionalSwapIx rewritten to the deployed program's 25-account layout
  with correct enum encoding (Market Spot=0/Pass=1/Fail=2; was sending Pass=0).
- Add POST /connectors/metadao/futarchy/split-tokens (conditional-vault deposit;
  vault outcome index 0 = FAIL, 1 = PASS).
- parsePool decodes the 100-byte TwapOracle prefix; proposal-info now returns
  passThresholdBps, isTeamSponsored, and a derived `twap` block (twapStartsAt/
  twapEndsAt, realized + sampled margin vs the pass threshold, attackerWinning).
  Realized margin divides the u128 aggregator by dt before toNumber() to avoid a
  2^53 overflow, and normalizes by accumulation time (created + startDelay).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N1YS88ZAY2rXVLmgvyN4oY
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant