OverviewFilesCommitsIssuesDocsReleasesPeers

favela-node / scripts / mint-loser-club.mjs

68 lines · javascript ref:
// Mint the loser-club community DID (step 1, LOCAL — no PLC submit here). Creates a co-owned community
// did:plc (handle loser-club.7rnx.net) with a keyless CommunityRoom whose roster = p2p.7rnx.net + ashatron.
// Persists to ~/.config/loser-club and saves the secrets + prints the genesis op for the PLC submit.
// Run once: bare scripts/mint-loser-club.mjs
import '../lib/bare-globals.js'
import process from 'bare-process'
import fs from 'bare-fs'
import Corestore from 'corestore'
import { generateMnemonic } from 'bip39-mnemonic'
import { createCommunity } from '../index.js'

const HOME = process.env.HOME
const DIR = HOME + '/.config/loser-club'
const SECRETS = DIR + '/secrets.json'
if (fs.existsSync(SECRETS)) { console.error('refusing to overwrite existing', SECRETS, '(loser-club already minted)'); process.exit(1) }
fs.mkdirSync(DIR + '/room', { recursive: true })
fs.mkdirSync(DIR + '/repo', { recursive: true })

const WJ62 = 'did:plc:wj62ebbusln6gxo5azo6ogzo'      // p2p.7rnx.net
const ASHATRON = 'did:plc:e2jevhuurrhlm36ufk7fklpg'  // ashatron.7rnx.net
const MEMBRANE = 'https://pds.7rnx.net'

const rootMnemonic = generateMnemonic()
const founderDeviceMnemonic = generateMnemonic()

const roomStore = new Corestore(DIR + '/room')
const c = await createCommunity({
  rootMnemonic,
  founderDeviceMnemonic,
  handle: 'loser-club.7rnx.net',
  name: 'loser-club',
  feedGenEndpoint: MEMBRANE,
  labelerEndpoint: MEMBRANE,
  roomStore,
  repoStorage: DIR + '/repo',
  network: false
})
await c.room.addMember(WJ62)
await c.room.addMember(ASHATRON)

const secrets = {
  did: c.did,
  handle: 'loser-club.7rnx.net',
  rootMnemonic,
  founderDeviceMnemonic,
  signingKey: c.signingKey,
  roomKey: c.room.key,
  members: [WJ62, ASHATRON],
  createdAt: null // stamped by the operator; Date.now() is unavailable under bare here
}
fs.writeFileSync(SECRETS, JSON.stringify(secrets, null, 2))
try { fs.chmodSync(SECRETS, 0o600) } catch {}

console.log('=== loser-club minted (LOCAL — not yet PLC-submitted) ===')
console.log('DID:      ' + c.did)
console.log('handle:   loser-club.7rnx.net')
console.log('roomKey:  ' + c.room.key)
console.log('members:  ' + (await c.room.members()).join(', '))
console.log('secrets:  ' + SECRETS + '  (root mnemonic + keys — KEEP SAFE)')
console.log('\n--- genesis op (submit this to plc.directory: POST https://plc.directory/<did>) ---')
console.log(JSON.stringify(c.identity.signedOp))
console.log('--- end genesis op ---')

await c.sb.close()
await c.room.close()
try { await roomStore.close() } catch {}
process.exit(0)