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
| File | What it is |
|---|---|
public/deed-core.js | The 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.js | The only seed file: buildings, leases, and each month's exceptions. Nothing downstream hardcodes a total. |
public/deed-abi.js | ABI encoding in about a hundred lines. No viem, no ethers, no wallet kit. |
public/deed-chain.js | Chain 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