A new lineage/v0 op binds a node's keys in one inscription whose parent is the node itself: its Taproot and SegWit addresses, its npub and its Ethereum address. Every key signs the same statement the way its own wallets sign a message: BIP-322 simple signatures for the Bitcoin addresses, a NIP-01 note (kind 1, created_at 0) for the npub, EIP-191 for Ethereum. The reducer checks every proof, binds a standing keyring's keys to its node, lets the newest keyring replace the older, and retires keyrings at a graduation (the keys change with the new root) and at a close. Every account gets an Ethereum key at m/44'/60'/account'/0/0; an org's, at account 0, is the key tree page's legal-control key and matches its published vector. Keyring is the ninth verb; Inspect shows each node's keyring and the statement its keys signed, and Reveal its Ethereum private key. The sample publishes three keyrings, and lineage's retires when it graduates. Tests pin BIP-322's published vectors and values cross-checked with bip322-js, ethers and nostr-tools. The regtest rehearsal, rerun with five keyrings, confirmed 89 transactions on Bitcoin Core; ord's 26 events fold to the same trees and keyrings, every proof checked from ord's copy, and the fixture is re-recorded. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H4upF5LVwmPDDqrhdUfnXh
3.4 KiB
3.4 KiB
AGENTS.md
Orgchain is lineage's app for creating and operating lineage holdings on Super Testnet's toy chain.
- Test-only, always: no mainnet funds, no hidden signing, no custody, and nothing presented as a real key.
- Lineage semantics live in one place,
src/orgchain/lineage.js, andSPEC.mdsays the same in words. The UI never interprets events itself, and every act is vetted by that reducer before it is signed. A new op or rule means a reducer change, its tests, the README's table andSPEC.md. - Whatever signs must stay valid on real Bitcoin. After changing how transactions or envelopes are built, rerun the
regtest rehearsal and its comparison (
tools/regtest/README.md) and refresh the fixture it records. - The engine (
src/adapters,src/upstream,src/storage.js,src/miner.js) is Super Testnet's. Compose with it rather than rewriting it, and keep its tests passing. Preserve upstream licenses and provenance. Its local changes are P2WPKH payments, a coinbase split across up to 64 outputs, ordinary spends of up to eight inputs and outputs whose key-path signatures may carry 0x83, coins imported from a real chain, and BIP-341/342 checks of reveals' script paths, all insrc/adapters/chain.js(PROVENANCE.md); keep them small and tested. - Money lives in
src/orgchain/money.js: beats pay the holdings (split by hashrate, or all to the last act; under Mainnet none mine, and the lab wallet funds them), sends spend SegWit coins only, so an inscription can never leave as change, and balances are read off the chain, never stored. Gas (src/orgchain/actions.js): every act is paid by the actor's own keys and checked before anything is signed; the lab wallet pays only for foundings and for holdings that predate lab keys. - Deals live in
src/orgchain/offers.js: the buyer pre-signs the whole transaction and the holder countersigns. An offer is signatures kept in the lab, never chain state, and who holds an item is read off the chain, never from metadata. Inscription metadata is public and permanent, so never put a secret in it (item notes included). - Keys follow the tree (
src/orgchain/keys.js): store roots only (one per holding, one per graduated org) and derive every other key from its position. Every act is signed by whichever key holds the authorizing inscription. - A node's chain key is its account's BIP-86 Taproot key (
m/86'/1'/account'/0/0); SegWit is BIP-84 at the same account and holds its money; its Ethereum key is BIP-44 atm/44'/60'/account'/0/0(an org's, at account 0, is the key tree page's legal-control key, andtests/keyring.test.jspins that page's vector). Leaves are HKDF-SHA256 (saltlineage/v0) and must stay byte for byte with lineage's key tree page;tests/keys.test.jsholds values read off that page. - Keyrings (
src/orgchain/keyring.js): every key signs the statement with its own chain's message standard (BIP-322, EIP-191, a NIP-01 event), so real wallets can make and check the proofs. Keep those formats exact and their pinned vectors passing; a new chain's key joins only with its own standard and a vector to pin. - Secrets show only behind Reveal, reset on every selection, and match the key tree page byte for byte (the tests pin hashes of the page's own output).
- The page makes no network requests; keep it that way (the deployed CSP sets
connect-src 'none'). - Before shipping:
npm test,npm run build,npm run test:e2e.