@chainreactionom/nano-mcp
Version:
NANO cryptocurrency wallet implementation for MCP with comprehensive testing
79 lines (70 loc) • 2.35 kB
JavaScript
import * as nanoWeb from 'nanocurrency-web';
import * as nanocurrency from 'nanocurrency';
export class KeyManager {
constructor(logger) {
this.logger = logger;
}
async generateKeyPair() {
try {
const seed = await nanoWeb.wallet.generateSeed();
const privateKey = await nanoWeb.wallet.deriveSecretKey(seed, 0);
const publicKey = await nanoWeb.wallet.derivePublicKey(privateKey);
const address = await nanoWeb.wallet.deriveAddress(publicKey, { useNanoPrefix: true });
this.logger.log('WALLET_GENERATED', {
publicKey,
address
});
return {
seed,
privateKey,
publicKey,
address
};
} catch (error) {
this.logger.logError('KEY_GENERATION_ERROR', error);
throw error;
}
}
validateKeyFormat(privateKey) {
try {
return nanocurrency.checkKey(privateKey);
} catch (error) {
this.logger.logError('KEY_VALIDATION_ERROR', error);
return false;
}
}
verifyKeyPair(privateKey, publicKey) {
try {
const derivedPublicKey = nanocurrency.derivePublicKey(privateKey);
return derivedPublicKey === publicKey;
} catch (error) {
this.logger.logError('KEY_VERIFICATION_ERROR', error);
return false;
}
}
signBlock(block, privateKey) {
try {
const blockHash = nanocurrency.hashBlock({
account: block.account,
previous: block.previous,
representative: block.representative,
balance: block.balance,
link: block.link
});
const signature = nanocurrency.signBlock({
hash: blockHash,
secretKey: privateKey
});
return {
block: {
...block,
signature,
hash: blockHash
}
};
} catch (error) {
this.logger.logError('BLOCK_SIGNING_ERROR', error);
throw error;
}
}
}