Search projects, hackathons, sponsors and tech

    ← All projects

    SCREE

    A pixel-art survey map of how you get liquidated, read live from seven lending markets.

    Demo

    About

    What it is Paste an address, or connect a wallet (address only: no signature, no approval, no gas). Scree reads that wallet's loans on seven lending deployments live through The Graph and draws the result as a pixel-art island you can walk. West to east is the price of ETH. South to north is how long the price has held there. Height is the health factor minus one. Sea level is liquidation. Why it exists Every lending app gives one number: "liquidated at $3,434". That number is one deployment, at this instant, with no interest accrued, as if the rest of the market froze. It is most wrong exactly when it matters. A wallet that borrows on several deployments is liquidated by whichever one binds first, and which one that is changes with price and with time. Scree draws the whole field. The borders on it, the folds, are the lines where one protocol stops being the thing that kills you and another takes over. No single-protocol dashboard can draw that line. What you can do on the map Move over the ground to read any point: which deployment binds there, the price, the dwell, the health, the exact liquidation price, and beside it a small chart of the ground from where you stand down to the water. When nothing is under the pointer the chart shows the crash edge over the next thirty days instead, on a fixed scale, with the enclave's lift drawn on it. Click and the surveyor walks there. Walk into the sea and the log names which deployment took the book. Send 200 scouts: soldiers that march thirty-day price paths from where the surveyor stands. The ones that cross the shore drown where they fall; the log reports how many came home. The markets: a second query fills every holdfast's plaque (size, borrowed, threshold, max LTV, rates, block) and flags each deployment's high-water mark on the price scale. The markets window draws two bar charts above its table: borrowed as a share of each book, and how far below today's price the high-water mark sits. The survey plate: the same ground as a pixel map at a glance, with a reading under the pointer. Music and sound for everything that happens, synthesised in the browser. A survey that agents buy The survey is a paid x402 service on Hedera testnet, settled through the Blocky402 facilitator and metered per deployment asked (0.01 HBAR + 0.005 per source). The map is its own first customer: every survey it shows is bought from the paid route by the platform's second account. A command-line scout discovers the service from its manifest at /.well-known/x402, pays within a budget, and verifies its own receipt. Every settlement writes a receipt to a public Consensus Service topic: what was asked, what was paid, the settlement id, the SHA-256 of the exact bytes sold, and the buyer's HCS-14 identity. The Receipts window reads the topic back and draws what was paid as a running total, one marker per receipt. Standing surveys can be paid ahead with scheduled transactions; a steward honours them. A private line in the field The owner of a wallet has a line they refuse to cross: a minimum health, a floor price, how much lift they will buy. A Chainlink CRE confidential workflow keeps that policy as a Vault secret, reads the survey inside the enclave, decides there, and lets out only a verdict, a coarse health, the lift and the policy's hash. The DON signs it, a forwarder records it on a ledger on Sepolia, and the map reads it back. The policy never leaves the enclave. Today's price on the map is the Chainlink ETH/USD feed, and the feed row says so. What it refuses to invent A position the schema cannot explain is set aside and named in the log, not drawn wrong. The relief that makes the ground organic can never move the sea. A geometry gate fails the build if the map goes flat, and a check keeps the map and the arithmetic equal on every tile. Live https://scree.hacklabs.in, try a wallet with borders: /?address=0xb7b7eb7e9611975bc9715f22ce7e6ee288296fd4 Receipts topic: https://hashscan.io/testnet/topic/0.0.10439715 Verdict ledger: https://sepolia.etherscan.io/address/0x748d9c5791059f97dcaf950c6fe92c6b80451bd2

    How it's made

    Stack Next.js 15 (app router, route handlers) and Phaser 4.2, TypeScript throughout. 193 Vitest tests, a geometry gate, and fourteen workflow tests under bun. The canvas is drawn at device density: the backing store is CSS size × DPR, every screen camera is pinned and zoomed by DPR, text resolution follows. One layout function places both the Phaser scenes and the page's real inputs, wide or phone. The Graph One WalletPositions query and one Markets query in the Messari standardized lending schema, naming no protocol, fanned out through the gateway to seven subgraph ids: Aave v3 on Ethereum, Arbitrum, Polygon and Avalanche; Compound v3 on Ethereum and Arbitrum; Spark on Ethereum. Responses are normalised (the schema's percent strings and string numbers) and reduced to one basket per deployment; staking receipts (stETH, wstETH, weETH, rETH, cbETH and the rest) count as ETH at their own price. A verifier resolves every registry id against the gateway and checks it answers in the lending schema; the record is committed and the route refuses ids it does not vouch for. ?sources= renders any subset. A command-line agent asks the same question through the Subgraph MCP and agrees with the map. What the standard bought: no per-protocol code at all, seven answers that can be minimised point by point (which is the only reason the folds exist), and adding a deployment is one registry row. The field and the terrain A health factor is a ratio of two affine functions of price, so each deployment is one basket. The field is the minimum over baskets on a 320 × 208 raster of price × dwell; the argmin partition gives the territories, marching squares the shoreline and the folds, a saddle finder the pass. The island is 80 × 52 tiles banded from the field with dual-grid corner masks; the tileset is painted at load from colours sampled off Kenney's CC0 packs; domain-warped noise gives relief but is clamped so it can never cross sea level; each deployment's seat stands on the highest ground it rules. The reading panel's charts are pure functions of the baskets: the ground at one dwell sampled in log-price steps from beyond the coast past the point read, and the crash edge against dwell, with a lift in health applied as (H + Δ) / H to first order. The panel shows one chart at a time and moves to the other corner when the surveyor stands under it. Every sprite is baked by a script with its own PNG codec: the surveyor's forty frames from a pose, the leviathans' swim and dive from single frames, the scouts from a stride and a bob, the interface stock, the favicon. Hedera x402 v2 with @x402/core, @x402/hedera and @x402/fetch. The resource-server gate is written by hand because @x402/next needs Next 16 and the app is on 15; it mirrors the reference flow: init, process the request, run the handler, settle only on success. The price is quoted per request as an HBAR AssetAmount (money prices in the SDK map to USDC), so metering is a dynamic price. After settlement the service submits a receipt to an HCS topic with @hiero-ledger/sdk, carrying the SHA-256 of the body. The Receipts window reads the topic back through the mirror node. The platform buys its own surveys with a second account. The scout is a CLI with per-rail spend controls. HCS-14 identities are derived (canonical JSON, SHA-384, Base58) and sent as X-Agent-Id. Standing surveys are ScheduleCreateTransactions wrapping a transfer with a memo; a steward polls the mirror node for executed ones and honours each with a survey and a receipt. A credit-token rail (HTS with a fractional fee) is coded and waits on test HBAR. Chainlink A CRE TypeScript workflow: cron trigger registered with handlerInTee; the policy read from the Vault DON with runtime.getSecret; the survey fetched with the enclave's HTTP client; the decision made inside; then usingTheDons() and a report (wallet, verdict, healthBps, liftBps, observedAt, policyHash) written with EVMClient.writeReport to a Solidity IReceiver ledger on Sepolia that trusts the forwarder set. Simulated, then broadcast; transcripts committed; the site reads the ledger with viem. Chainlink Data Feeds: the ETH/USD aggregator on mainnet, read with viem and cached, used when it is fresh and within twenty percent of the subgraphs' own price. Hacky bits worth naming: the enclave's WASM runtime has no URL class, so the survey URL is validated with a regex and built by string concatenation; the ledger trusts the simulator's mock forwarder as well as the production one so a --broadcast simulation lands on chain. Sound No audio files. A Web Audio engine with music and effect buses and a lookahead sequencer plays three themes written as bars of sixteen tokens (checked by tests), plus synthesised effects for every event: buttons, popups, footsteps, arrivals, drownings, the bugle that sends the scouts, the fanfare or lament that brings them home. Charts The windows' charts are inline SVG with no library: thin horizontal bars with a rounded data-end and a square baseline, one measure per chart, values at the tips, hairline gridlines; a step line with ringed markers for the running total, hollow markers for surveys paid ahead. The scale and cumulative arithmetic live in one tested module, and the two hues were checked for colour-vision separation on the parchment before use. Running it An Ubuntu server behind Apache with certbot TLS; pm2 runs the site and the steward; a deploy script builds from main. The README's pictures are captured from the live site by a headless-Chrome script in the repository.