Political Compass

On-chain political compass. Two modes. Multichain.

Political Compass is a dApp that lets you place your political position on a two-dimensional grid, discover who thinks like you, and react to others' positions. Everything is stored fully on-chain on EVM.

There are two modes:

  • Classical Compass — the traditional political compass with Left/Right (economic) and Authoritarian/Libertarian (social) axes. You pick your position manually.
  • Degen Compass — a crypto-native compass with Moderated/Radical (markets) and Limited State/Stateless axes. Your position is determined by a 40-question quiz about DeFi, regulation, and crypto philosophy.

Every point, reaction, and quiz result is stored as a smart contract interaction. No backend servers, no databases. The frontend reads all data directly from on-chain events across all supported chains and merges them onto one compass.

This project started as a Solana mobile app (Flutter) and has been ported to EVM with a web frontend. Same concept, different chain, better accessibility.

How It Works

The compass is a 200x200 grid stored on-chain.

The compass spans from -100 to +100 on both axes. Each wallet can have one point on the Classical compass and one on the Degen compass.

Data Storage

Unlike traditional apps that store data in databases, Political Compass stores everything in Solidity smart contracts deployed across multiple EVM chains:

  • Points are stored in mappings: address => Point(x, y, comment)
  • Reactions are stored per reactor-target pair: reactor => target => reaction
  • Aggregate counts (likes/dislikes/thinking) are maintained per target address

Reading Data

The frontend discovers all points by scanning PointSet events from both contracts across all chains. Points are fetched in parallel and merged onto one compass.

Points are cached in your browser's localStorage. On subsequent visits, only new blocks are scanned.

The frontend also resolves ENS names — if a wallet has a .eth name registered on Ethereum mainnet, it will be displayed instead of the raw address.

Writing Data

To place a point or react, you sign a transaction with your wallet. The transaction is sent to whichever chain you're connected to, confirmed in seconds, and the compass updates.

Two Compasses

Classical politics and crypto philosophy, side by side.

Classical Compass

The traditional two-axis political compass:

  • X axis (horizontal): Left (-100) to Right (+100) — economic policy
  • Y axis (vertical): Libertarian (-100) to Authoritarian (+100) — social policy

Four quadrants: Authoritarian Left (red), Authoritarian Right (blue), Libertarian Left (green), Libertarian Right (purple).

You place your point manually by clicking on the compass.

Degen Compass

A crypto-native compass for DeFi opinions:

  • M axis (horizontal): Moderated markets (-100) to Radical laissez-faire (+100)
  • S axis (vertical): Stateless (-100) to Limited state (+100)

Four archetypes: Protocol Diplomat (top-left), Yield Baron (top-right), Agora Anarchist (bottom-left), Rekt Absolutist (bottom-right).

Your position is determined by a 40-question quiz. No manual placement.

Placing Your Point

Classical compass: manual placement on the grid.

Adding a New Point

  1. Click "Add point" button
  2. Click anywhere on the compass to set your position
  3. Fine-tune X and Y coordinates in the form below
  4. Optionally add a comment (max 30 characters)
  5. Click "Save on-chain" and confirm the transaction in your wallet

Updating Your Point

Click "Update point". Your current position will be pre-filled. Change it and save. Each update costs the same 0.00025 ETH fee.

Coordinate System

AxisRangeLeft/BottomRight/Top
X (economic)-100 to +100Left (-100)Right (+100)
Y (social)-100 to +100Libertarian (-100)Authoritarian (+100)

Degen Quiz

40 questions that determine your crypto compass position.

How the Quiz Works

The quiz presents 40 statements about DeFi, crypto regulation, and protocol design. For each statement, you choose from:

  • Strongly Agree (+5)
  • Agree (+2.5)
  • Neutral (0)
  • Disagree (-2.5)
  • Strongly Disagree (-5)

Scoring

Questions 1-20 measure the M axis (markets: moderated vs. radical). Questions 21-40 measure the S axis (state: limited vs. stateless).

Some questions are reverse coded — agreeing with them moves you in the opposite direction. This prevents answer bias.

Final scores on each axis are clamped to [-100, +100].

Progress Saving

Quiz progress is saved in your browser. If you close the tab, you can continue where you left off. Progress is cleared after submission.

Submitting

After answering all 40 questions, your M and S scores are calculated and submitted to the smart contract as a Degen Point. This costs 0.00025 ETH.

Reactions

React to any point on the compass.

Reaction Types

ReactionMeaningID
👍 LikeYou agree with this position0
👎 DislikeYou disagree with this position1
🤔 ThinkingInteresting, needs thought2

How Reactions Work

  • Tap a point on the compass to see its info card
  • Click a reaction chip to react
  • Click the same chip again to change or clear your reaction
  • Each wallet can have one reaction per target point
  • Reactions are free (gas only, no protocol fee)

On-Chain Storage

Reactions are stored as a mapping: reactor address => target address => reaction type. Aggregate counts (total likes, dislikes, etc.) are maintained per target to avoid expensive on-chain counting.

Finding Allies

Discover who thinks like you.

How It Works

When viewing any point's info card, click "See political allies". This shows all wallets within a ±15 unit radius on both axes.

Allies are sorted by distance (Manhattan distance) from the center point. Closer positions appear first.

Ally Radius

The radius is 15 units on each axis independently. A point at (50, 50) will find allies between (35-65, 35-65). The highlighted area is shown as a circle on the compass.

Smart Contract

Two contracts, deployed on mainnet and testnet chains.

PoliticalCompass (Mainnet)

Classical compass contract.

ChainAddress
Base0x337E6125f9Ecf9227d85A6dFedd1d135b864a621
Optimism0xbb3fc07d925c83E69E83f11F65ec9D336fC56Ee2
Arbitrum0xe8EAb2A97CADC16fD7cF63DAEf50EDD968CeB36b
Ink0xE3373371412Fe4E1dacfD3Cd114B10A8Bc3D5597

DegenCompass (Mainnet)

Degen compass contract.

ChainAddress
Base0x040cbdBdFC4a8B87c1DB5C2B3Da296E880FdaF5C
Optimism0xC3173DDF840183aa8ba9303cA7d007e21B01ABF9
Arbitrum0x85d73c44Eac548327837EFE3B14aF388cfED5a50
Ink0x06E296f817AB9a6404B8A7A61D783C632eF2A36d

PoliticalCompass (Testnet)

Classical compass contract on testnet chains. Available at testnet.politicalcompass.xyz.

ChainAddress
Neura Testnet (267)0xE3373371412Fe4E1dacfD3Cd114B10A8Bc3D5597
Robinhood Testnet (46630)0xE3373371412Fe4E1dacfD3Cd114B10A8Bc3D5597

DegenCompass (Testnet)

Degen compass contract on testnet chains.

ChainAddress
Neura Testnet (267)0x06E296f817AB9a6404B8A7A61D783C632eF2A36d
Robinhood Testnet (46630)0x06E296f817AB9a6404B8A7A61D783C632eF2A36d

Functions

Both contracts share the same interface:

FunctionCostDescription
setPoint(x, y, comment)0.00025 ETHPlace or update your compass point
reactToPoint(target, reaction)Gas onlyReact to someone's point (0=like, 1=dislike, 2=thinking)
clearReaction(target)Gas onlyRemove your reaction

View Functions

FunctionReturns
getPoint(address)x, y, lastUpdated, comment, exists
getReactionTally(target)counts[4], lastUpdated, exists
getMyReaction(target)reaction, hasReaction

Events

The frontend uses events to discover all points:

  • PointSet(address indexed owner, int16 x, int16 y, string comment)
  • Reacted(address indexed reactor, address indexed target, uint8 reaction)
  • ReactionCleared(address indexed reactor, address indexed target)

Source Code

Written in Solidity 0.8.24, compiled with Foundry.

Fees & Costs

Cheap by design.

Protocol Fee

Placing or updating a point costs 0.00025 ETH. This fee stays in the contract. The contract owner can withdraw accumulated fees.

Reactions (like, dislike, thinking) have no protocol fee — you only pay gas.