deviant/scripts/generate-shell-dev-wallets.mjs
walerikus 518a3ce174 chore: initial project baseline — full Deviant codebase under version control
Brings the whole project into git (previously only the on-ramp feature and
a few parallel files were tracked). Includes: wallet core (src/), CashScript
contracts/, the Capacitor shell (shells/), scripts/, tests, and the docs
corpus (wiki/, snapshots/, Parameters/, Archive/, KnowledgeBase text).

Excluded via .gitignore: node_modules/, dist/, .env (secrets), testnet WIF
key files (.chipnet-*.json, devWallets.ts), KnowledgeBase/RAW media (~9.6 GB),
transcripts/ (session logs), and machine-local config (.claude/*.local,
*.lock). Secret-scanned before commit — no credentials in the tree.

Note: src/swapMath.ts, src/swapBuilder.ts, contracts/OpenMintToken.cash are
legacy (OP_RETURN era) but still imported; committed as-is, flagged for a
separate removal once de-referenced.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 20:38:07 +02:00

79 lines
2.8 KiB
JavaScript

#!/usr/bin/env node
/**
* generate-shell-dev-wallets.mjs — bundle every `.chipnet-keys-*.json` in the
* project root into a TS module the Capacitor shell imports. That module fuels
* the in-shell Wallet Picker (Settings → Wallets and the Onboarding shortcut)
* so the shell is portable across all your dev wallets with one click — no
* WIF copy/paste, no re-seeding.
*
* Output: shells/app/src/devWallets.ts
*
* Re-run this script after generating new wallets (scripts/generate-addresses.mjs)
* so the picker sees them.
*
* !!! CHIPNET / DEV ONLY !!! The emitted module carries WIFs in plaintext. It is
* gitignored. Never run against mainnet keys.
*/
import { readFileSync, readdirSync, writeFileSync, mkdirSync } from 'node:fs';
import { join, dirname } from 'node:path';
const ROOT = join(import.meta.dirname, '..');
const OUT = join(ROOT, 'shells', 'app', 'src', 'devWallets.ts');
function discover() {
return readdirSync(ROOT)
.filter((f) => /^\.chipnet-keys(-[a-z0-9]+)?\.json$/.test(f))
.map((f) => {
const m = /^\.chipnet-keys(?:-([a-z0-9]+))?\.json$/.exec(f);
const label = m?.[1] ? m[1].toUpperCase() : 'A';
return { label, file: f };
})
.sort((a, b) => a.label.localeCompare(b.label));
}
function escapeStringLiteral(s) {
return s.replace(/\\/g, '\\\\').replace(/'/g, "\\'");
}
function main() {
const wallets = discover();
if (wallets.length === 0) {
console.error('No .chipnet-keys*.json files found — nothing to bundle.');
process.exit(1);
}
const records = wallets.map(({ label, file }) => {
const { wif, cashaddr, tokenaddr } = JSON.parse(readFileSync(join(ROOT, file), 'utf8'));
if (!wif || !cashaddr) throw new Error(`${file} missing wif/cashaddr`);
return { label, wif, cashaddr, tokenaddr: tokenaddr ?? '' };
});
const lines = [
'// AUTO-GENERATED by scripts/generate-shell-dev-wallets.mjs — do not edit by hand.',
'// CHIPNET / DEV ONLY. WIFs are plaintext; file is gitignored.',
'// Re-run the generator after adding wallets via scripts/generate-addresses.mjs.',
'',
'export interface DevWallet {',
' readonly label: string;',
' readonly cashaddr: string;',
' readonly tokenaddr: string;',
' readonly wif: string;',
'}',
'',
'export const DEV_WALLETS: readonly DevWallet[] = [',
...records.map(
(r) =>
` { label: '${escapeStringLiteral(r.label)}', cashaddr: '${escapeStringLiteral(r.cashaddr)}', tokenaddr: '${escapeStringLiteral(r.tokenaddr)}', wif: '${escapeStringLiteral(r.wif)}' },`,
),
'];',
'',
`export const DEV_WALLETS_BUNDLED_AT = '${new Date().toISOString()}';`,
'',
];
mkdirSync(dirname(OUT), { recursive: true });
writeFileSync(OUT, lines.join('\n'));
console.log(` wrote ${OUT} (${records.length} wallets: ${records.map((r) => r.label).join(', ')})`);
}
main();