Keeps Final Status Report #
Date: March 2, 2026 System: KidLisp Keeps — Tezos NFT minting for aesthetic.computer Purpose: Snapshot of everything built, deployed, and remaining before production launch
What Keeps Is #
Keeps lets users permanently preserve KidLisp programs as NFTs on Tezos. A user creates generative art in KidLisp on aesthetic.computer, then runs keep $piece-name to mint it as a self-contained HTML artifact stored on IPFS with on-chain metadata. 10% royalties on secondary sales. Viewable on objkt.com.
Contract History #
| Version | Contract | Admin | Fee | Tokens | Status |
|---|---|---|---|---|---|
| v2 | (compiled only, never deployed to mainnet) | — | — | — | Archived |
| v3 | KT1EcsqR69BHekYF5mDQquxrvNg5HhPFx6NM |
staging | 0 | 5 | Retired |
| v3 | KT1JEVyKjsMLts63e4CNaMUywWTPgeQ41Smi |
staging | 0 | 5 | Retired |
| v4 | KT1ER1GyoeRNhkv6E57yKbBbEKi5ynKbaH3W |
staging | 0 | 2 | Retired |
| v4 | KT1StXrQNvRd9dNPpHdCGEstcGiBV6neq79K |
— | 0 | — | Ghostnet only |
| v5 RC | KT1QdGZP8jzqaxXDia3U7DYEqFYhfqGRHido |
staging | 2.5 XTZ | 2 | Active (staging) |
All mainnet test contracts hold 0 XTZ — mints were done with 0 fee (admin bypass or fee not yet set).
Wallets #
| Name | Address | Alias | Balance | Role |
|---|---|---|---|---|
| staging | tz1dfoQDuxjwSgxdqJnisyKUxDHweade4Gzt |
— | 0.809 XTZ | Contract deployer, current v5 RC admin |
| kidlisp | tz1Lc2DzTjDPyWFj1iuAVGGZWNjK67Wun2dC |
keeps.tez | 0.102 XTZ | Future production admin |
| aesthetic | tz1gkf8EexComFBJvjtT1zdsisdah791KwBE |
aesthetic.tez | 0.089 XTZ | @jeffrey's author wallet, 112 active tokens, 3382 historical txs |
Total across all wallets: ~1.0 XTZ (~$0.38 at $0.378/XTZ)
Keys stored in tezos/kidlisp/.env (kidlisp + aesthetic) and tezos/staging/.env (staging). Transfer script: tezos/transfer.mjs.
What's Built and Working #
Smart Contract (v5) #
- FA2-compliant NFT with TZIP-012, TZIP-016, TZIP-021
keep()— mint with 2.5 XTZ fee (admin exempt)edit_metadata()— owner or creator can update (preserves attribution)burn()— token removalcontent_hashesbigmap — deduplication (same piece can't mint twice)token_creatorsbigmap — tracks original minter forever- 10% royalties (1000 bps), adjustable via
set_default_royalty - Emergency
pause()/unpause()circuit breaker admin_transfer()— customer service toolset_keep_fee()/withdraw()— fee management + revenue collection- Source:
tezos/keeps_fa2_v5.py
Minting Pipeline (Backend) #
keep-mint.mjs— 10-step SSE streaming endpoint- JWT auth, handle requirement, ownership verification
- Self-contained HTML bundle generation
- WebP thumbnail via oven service (256x256 @ 2x)
- IPFS upload via Pinata
- Duplicate detection, cached media reuse
- Returns prepared mint params for client wallet signing
keep-confirm.mjs— records successful mint in MongoDBkeep-update.mjs— preparesedit_metadataparams for client signingkeep-update-confirm.mjs— records successful metadata update
Keep UI (Frontend) #
disks/keep.mjs— ~3800 line piece with full mint flow- 10-step timeline with real-time progress
- Beacon wallet integration (popup-based)
- Rebake (regenerate bundle) + sync (update chain) workflows
- Already-minted detection with existing token info
- Ownership display ("You own this" / "Owner: tz1...")
- Dark/light theme support with themed button palettes
- Cancel + Escape support during preparation
disks/kept.mjs— post-mint success page with objkt/tzkt linksdisks/wallet.mjs— wallet connector + balance displaydisks/connect-wallet.mjs— onboarding flow
Client Libraries #
lib/keeps-client.mjs— state machine, mint flow, event systemlib/keeps/constants.mjs— single source of truth for addresses, networks, configlib/keeps/tzkt-client.mjs— TzKT API queries (token info, ownership, ledger)lib/tezos-wallet.mjs— Beacon wallet abstraction
Tests #
spec/keeps-v5-production-spec.js— source-level invariantsspec/keeps-v4-readonly-spec.js— read-only TzKT checksspec/keeps-v4-security-spec.js— authorization checksspec/helpers/keeps-test-helper.mjs— shared test utilities
Tooling #
tezos/keeps.mjs— CLI admin tool (105KB)tezos/transfer.mjs— XTZ transfer between walletstezos/deploy-staging.mjs— contract deployment scriptutilities/keep-cleanup.mjs— contract cleanup utilitybatch-mint-keeps.mjs— batch minting script
What's NOT Done #
Blockers for Production Launch #
-
Fund wallets — ~1 XTZ total is not enough
- Need ~5 XTZ minimum for contract deployment gas
- Need ~10 XTZ for test mints (2.5 XTZ each, recoverable from contract)
- Need ongoing buffer for operations
- Recommendation: fund staging wallet with 20-30 XTZ from external source
-
Deploy v5 production contract on keeps.tez
- Compile v5 with SmartPy
- Deploy to mainnet with
--wallet=kidlisp - Transfer admin from staging to keeps.tez
-
Update all contract address references (8 locations):
lib/keeps/constants.mjs— NETWORKS.mainnet.contractkeep-mint.mjs:31— env var fallbackkeep-update.mjs:24— env var fallbackkeep-update-confirm.mjs:12— env var fallbackkidlisp-keep.mjs:16— env var fallbackkept.mjs:13— hardcodedwallet.mjs:14— hardcoded- Set
KEEPS_STAGING = falsein constants.mjs
-
End-to-end test on production contract
- Mint → transfer → owner rebake → creator sync
- Verify on objkt.com
- Test fee withdrawal
Known Client Bugs (from V5-LAUNCH-PLAN.md) #
| Bug | Status | Notes |
|---|---|---|
Rebake triggers jump() to IPFS URL |
DONE | Fixed — button overlap issue |
| Paint not updating during rebake progress | DONE | Fixed — rendering location |
| Rebake end-to-end manual test | TODO | Needs manual verification |
| "Update Chain" flow after rebake | TODO | Needs manual verification |
Future Features (Post-Launch) #
keepscommand to list user's minted tokens- Fee/gas estimation UI before signing
- Copy share link after mint
- kidlisp.com "Mint as Keep" button
- kidlisp.com "My Keeps" gallery
- kidlisp.com keeps page redesign (SVG castle, source previews)
- $roz attribution fix (sync with aesthetic.tez wallet)
Launch Sequence (When Funded) #
1. Fund staging wallet with 20-30 XTZ
2. Compile v5: smartpy compile tezos/keeps_fa2_v5.py
3. Deploy to mainnet: node tezos/deploy-staging.mjs --wallet=kidlisp
4. Test mint on new contract (admin, 0 fee)
5. Test mint as regular user (2.5 XTZ fee)
6. Verify token on objkt.com
7. Withdraw fees from contract
8. Update 8 contract address references in codebase
9. Set KEEPS_STAGING = false
10. Deploy to Netlify
11. Smoke test: first real production mint
12. Announce
Revenue Model #
- Mint fee: 2.5 XTZ per keep (~$0.95 at current prices)
- Royalties: 10% on all secondary sales (objkt.com, teia, etc.)
- Fee adjustment: Admin can call
set_keep_fee()anytime - Revenue collection: Admin calls
withdraw()to sweep contract balance - Break-even: IPFS pinning costs are negligible; revenue starts from mint #1
File Map #
| Category | Key Files |
|---|---|
| Contracts | tezos/keeps_fa2_v5.py, tezos/keeps_fa2_v4.py |
| Deployment | tezos/deploy-staging.mjs, tezos/transfer.mjs |
| Backend | netlify/functions/keep-mint.mjs, keep-confirm.mjs, keep-update.mjs |
| Frontend | disks/keep.mjs, disks/kept.mjs, disks/wallet.mjs |
| Libraries | lib/keeps-client.mjs, lib/keeps/constants.mjs, lib/keeps/tzkt-client.mjs |
| Tests | spec/keeps-v5-production-spec.js, spec/keeps-v4-*.js |
| Plans | plans/keeps-next-steps.md, plans/keeps-redesign.md, tezos/V5-LAUNCH-PLAN.md |
| CLI | tezos/keeps.mjs (105KB admin tool) |
| Config | tezos/kidlisp/.env, tezos/staging/.env |