Run it locally

One command, no build step, no wallet, no chain, no database.

The front end is static files. There is no bundler, no framework and no dependency to install before it will serve.

git clone https://github.com/gc0rbs/deed
cd deed
npm run dev        # serves public/ on :8811

Open http://127.0.0.1:8811. That is the whole setup.

What runs without anything configured

Everything you can click. No wallet extension, no account, no keys, no network, no database. Every page carries a bar across the top saying it is a preview and not real, with a Start over link that clears the simulated wallet and balances so a second walkthrough starts where the first did.

The preview wallet holds 25,000 USDG that does not exist. Balances live in that browser only, so two browsers are two independent testers.

The tests

npm test

Five suites: the close engine's invariants, the wallet layer, the demo path end to end, the chain encoding, and the audit conformance checks. The demo and chain suites drive a real browser through Playwright.

npm run test:close    # close engine only
npm run test:wallet   # wallet layer only
npm run test:demo     # browser-driven suites

The close-engine suite is the one worth reading. Each check is a rule that, if broken, would let the product quietly lie to a holder โ€” money leaking out of the vault, a fee charged against principal, a price that cannot be reconstructed from the report it was published with.

How the pieces fit

FileWhat it is
public/deed-core.jsThe monthly close, the canonical CSV and the hash. All money in integer base units, BigInt throughout โ€” no balance is ever a float.
public/deed-data.jsThe only seed file: buildings, leases, and each month's exceptions. Nothing downstream hardcodes a total.
public/deed-abi.jsABI encoding in about a hundred lines. No viem, no ethers, no wallet kit.
public/deed-chain.jsChain config, contract reads and writes.
contracts/The two Solidity contracts, their tests, and the audit.

Change a rent in deed-data.js and every Roll, every price and every chart moves with it. That is deliberate: the acceptance gate for a Roll is that a reader can reconstruct the price change from the report's own lines, and the only way to be sure is to compute the report rather than write it down.

The one rule for contributors

No external JavaScript dependencies in the front end. The site has no build step and keeps it. Everything the chain layer needs is static ABI types โ€” 32-byte words and a 4-byte selector.

Contract work

The contracts need Foundry:

curl -L https://foundry.paradigm.xyz | bash && foundryup
cd contracts && forge test