You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

62 lines
2.1 KiB

import { finalizeEvent } from 'nostr-tools';
import { decode } from 'nostr-tools/nip19';
import { nip19 } from 'nostr-tools';
import { publishEventCommon, addClientTag } from './index.js';
/**
* Publish ownership transfer
*/
export async function publishOwnershipTransfer(args, relays, privateKeyBytes, pubkey, json) {
const [repoName, newOwnerNpub] = args;
if (!repoName || !newOwnerNpub) {
console.error('Error: repo name and new owner npub required');
console.error('Use: publish ownership-transfer <repo> <new-owner-npub> [--self-transfer]');
console.error('Note: You must be the current owner (signing with NOSTRGIT_SECRET_KEY)');
process.exit(1);
}
const selfTransfer = args.includes('--self-transfer');
// Decode new owner npub to hex
let newOwnerPubkey;
try {
newOwnerPubkey = newOwnerNpub.startsWith('npub') ? decode(newOwnerNpub).data : newOwnerNpub;
// Convert to hex string if it's a Uint8Array
if (newOwnerPubkey instanceof Uint8Array) {
newOwnerPubkey = Array.from(newOwnerPubkey).map(b => b.toString(16).padStart(2, '0')).join('');
}
} catch (err) {
throw new Error(`Invalid npub format: ${err.message}`);
}
// Current owner is the pubkey from the signing key
const currentOwnerPubkey = pubkey;
const repoAddress = `30617:${currentOwnerPubkey}:${repoName}`;
const tags = [
['a', repoAddress],
['p', newOwnerPubkey],
['d', repoName]
];
if (selfTransfer) {
tags.push(['t', 'self-transfer']);
}
// Add client tag unless --no-client-tag is specified
addClientTag(tags, args);
const event = finalizeEvent({
kind: 1641, // OWNERSHIP_TRANSFER
created_at: Math.floor(Date.now() / 1000),
tags,
content: ''
}, privateKeyBytes);
await publishEventCommon(event, relays, privateKeyBytes, pubkey, json, 'Ownership transfer');
if (!json) {
const currentOwnerNpub = nip19.npubEncode(currentOwnerPubkey);
console.log(`Repository: ${currentOwnerNpub}/${repoName}`);
console.log(`Current owner: ${currentOwnerNpub}`);
console.log(`New owner: ${newOwnerNpub}`);
}
}