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.
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
- Click "Add point" button
- Click anywhere on the compass to set your position
- Fine-tune X and Y coordinates in the form below
- Optionally add a comment (max 30 characters)
- 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
| Axis | Range | Left/Bottom | Right/Top |
|---|---|---|---|
| X (economic) | -100 to +100 | Left (-100) | Right (+100) |
| Y (social) | -100 to +100 | Libertarian (-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
| Reaction | Meaning | ID |
|---|---|---|
| 👍 Like | You agree with this position | 0 |
| 👎 Dislike | You disagree with this position | 1 |
| 🤔 Thinking | Interesting, needs thought | 2 |
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.
| Chain | Address |
|---|---|
| Base | 0x337E6125f9Ecf9227d85A6dFedd1d135b864a621 |
| Optimism | 0xbb3fc07d925c83E69E83f11F65ec9D336fC56Ee2 |
| Arbitrum | 0xe8EAb2A97CADC16fD7cF63DAEf50EDD968CeB36b |
| Ink | 0xE3373371412Fe4E1dacfD3Cd114B10A8Bc3D5597 |
DegenCompass (Mainnet)
Degen compass contract.
| Chain | Address |
|---|---|
| Base | 0x040cbdBdFC4a8B87c1DB5C2B3Da296E880FdaF5C |
| Optimism | 0xC3173DDF840183aa8ba9303cA7d007e21B01ABF9 |
| Arbitrum | 0x85d73c44Eac548327837EFE3B14aF388cfED5a50 |
| Ink | 0x06E296f817AB9a6404B8A7A61D783C632eF2A36d |
PoliticalCompass (Testnet)
Classical compass contract on testnet chains. Available at testnet.politicalcompass.xyz.
| Chain | Address |
|---|---|
| Neura Testnet (267) | 0xE3373371412Fe4E1dacfD3Cd114B10A8Bc3D5597 |
| Robinhood Testnet (46630) | 0xE3373371412Fe4E1dacfD3Cd114B10A8Bc3D5597 |
DegenCompass (Testnet)
Degen compass contract on testnet chains.
| Chain | Address |
|---|---|
| Neura Testnet (267) | 0x06E296f817AB9a6404B8A7A61D783C632eF2A36d |
| Robinhood Testnet (46630) | 0x06E296f817AB9a6404B8A7A61D783C632eF2A36d |
Functions
Both contracts share the same interface:
| Function | Cost | Description |
|---|---|---|
setPoint(x, y, comment) | 0.00025 ETH | Place or update your compass point |
reactToPoint(target, reaction) | Gas only | React to someone's point (0=like, 1=dislike, 2=thinking) |
clearReaction(target) | Gas only | Remove your reaction |
View Functions
| Function | Returns |
|---|---|
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.