chaingate
Version:
A complete TypeScript library for connecting to and making transactions on different blockchains
69 lines • 2.83 kB
JavaScript
import { UtxoCurrencyUtils } from '../abstract/UtxoCurrencyUtils/UtxoCurrencyUtils';
import { BitcoinCashInfo } from '../../CurrencyInfo';
import { PublicKey } from '../../../Wallet/entities/PublicKey';
import bch from 'bitcore-lib-cash';
import { bytesToHex } from '../../../InternalUtils/Utils';
import { toCashAddress, toLegacyAddress } from 'bchaddrjs';
import { getSignedMessagePublicKey, signMessage, } from '../../CurrencyWallet/abstract/UtxoWallet/MessageSigner';
import { sha256 } from '@noble/hashes/sha256';
import { createBase58check } from '@scure/base';
export class BitcoinCashUtils extends UtxoCurrencyUtils {
constructor(client, markets) {
super(client, BitcoinCashInfo, markets, 'bitcoincash', {
bech32: 'bitcoincash', // HRP usado en direcciones CashAddr
pubKeyHash: 0x00,
scriptHash: 0x05,
wif: 0x80,
}, '\x18Bitcoin Signed Message:\n');
}
identifyAddressType(address) {
const base58check = createBase58check(sha256);
// Detect CashAddr format
if (/^(bitcoincash:|bchtest:)?([qp])[0-9a-z]{41}$/i.test(address)) {
return 'cashaddr';
}
// Try to decode as base58check
try {
const [version] = base58check.decode(address);
if ([0, 5].includes(version))
return 'legacy';
if ([28, 40].includes(version))
return 'bitpay';
}
catch {
return 'unknown';
}
return 'unknown';
}
publicKeyToAddress(publicKey, addressType = 'cashaddr') {
const publicKeyBch = new bch.PublicKey(bytesToHex(publicKey.raw, false));
const bchAddr = bch.Address.fromPublicKey(publicKeyBch, bch.Networks.mainnet).toCashAddress();
switch (addressType) {
case 'legacy':
return toLegacyAddress(bchAddr);
case 'cashaddr':
return bchAddr;
case 'bitpay':
return toCashAddress(bchAddr);
}
}
signMessage(message, privateKey) {
return signMessage(message, privateKey, this.signHeader);
}
async verifySignedMessage(message, signature, address) {
const publicKeyRaw = await getSignedMessagePublicKey(message, signature, this.signHeader);
const publicKey = new PublicKey(publicKeyRaw);
const addressType = this.identifyAddressType(address);
const supportedTypes = ['legacy', 'cashaddr', 'bitpay'];
if (!supportedTypes.includes(addressType))
return false;
try {
const derivedAddress = this.publicKeyToAddress(publicKey, addressType);
return derivedAddress === address;
}
catch {
return false;
}
}
}
//# sourceMappingURL=BitcoinCashUtils.js.map