@btc-vision/transaction
Version:
OPNet transaction library allows you to create and sign transactions for the OPNet network.
124 lines (123 loc) • 4.35 kB
JavaScript
import { address, initEccLib } from '@btc-vision/bitcoin';
import * as ecc from '@bitcoinerlab/secp256k1';
import { EcKeyPair } from './EcKeyPair.js';
import { BitcoinUtils } from '../utils/BitcoinUtils.js';
initEccLib(ecc);
export var AddressTypes;
(function (AddressTypes) {
AddressTypes["P2PKH"] = "P2PKH";
AddressTypes["P2OP"] = "P2OP";
AddressTypes["P2SH_OR_P2SH_P2WPKH"] = "P2SH_OR_P2SH-P2WPKH";
AddressTypes["P2PK"] = "P2PK";
AddressTypes["P2TR"] = "P2TR";
AddressTypes["P2WPKH"] = "P2WPKH";
})(AddressTypes || (AddressTypes = {}));
export class AddressVerificator {
static isValidP2TRAddress(inAddress, network) {
if (!inAddress || inAddress.length < 50)
return false;
let isValidTapRootAddress = false;
try {
address.toOutputScript(inAddress, network);
const decodedAddress = address.fromBech32(inAddress);
isValidTapRootAddress = decodedAddress.version === 1;
}
catch { }
return isValidTapRootAddress;
}
static isP2WPKHAddress(inAddress, network) {
if (!inAddress || inAddress.length < 20 || inAddress.length > 50)
return false;
let isValidSegWitAddress = false;
try {
const decodedAddress = address.fromBech32(inAddress);
address.toOutputScript(inAddress, network);
isValidSegWitAddress =
decodedAddress.version === 0 && decodedAddress.data.length === 20;
}
catch { }
return isValidSegWitAddress;
}
static isP2PKHOrP2SH(addy, network) {
try {
const decodedBase58 = address.fromBase58Check(addy);
if (decodedBase58.version === network.pubKeyHash) {
return true;
}
return decodedBase58.version === network.scriptHash;
}
catch (error) {
return false;
}
}
static isValidPublicKey(input, network) {
try {
if (input.startsWith('0x')) {
input = input.slice(2);
}
if (!BitcoinUtils.isValidHex(input)) {
return false;
}
if (input.length === 64) {
return true;
}
const pubKeyBuffer = Buffer.from(input, 'hex');
if ((input.length === 130 && pubKeyBuffer[0] === 0x06) || pubKeyBuffer[0] === 0x07) {
return true;
}
if (input.length === 66 || input.length === 130) {
EcKeyPair.fromPublicKey(pubKeyBuffer, network);
return true;
}
}
catch (e) {
return false;
}
return false;
}
static requireRedeemScript(addy, network) {
try {
const decodedBase58 = address.fromBase58Check(addy);
if (decodedBase58.version === network.pubKeyHash) {
return false;
}
return decodedBase58.version === network.scriptHash;
}
catch {
return false;
}
}
static detectAddressType(addy, network) {
if (AddressVerificator.isValidPublicKey(addy, network)) {
return AddressTypes.P2PK;
}
try {
const decodedBase58 = address.fromBase58Check(addy);
if (decodedBase58.version === network.pubKeyHash) {
return AddressTypes.P2PKH;
}
if (decodedBase58.version === network.scriptHash) {
return AddressTypes.P2SH_OR_P2SH_P2WPKH;
}
}
catch { }
try {
const decodedBech32 = address.fromBech32(addy);
if ((decodedBech32.prefix === network.bech32Opnet ||
decodedBech32.prefix === network.bech32) &&
decodedBech32.version === 16) {
return AddressTypes.P2OP;
}
if (decodedBech32.prefix === network.bech32) {
if (decodedBech32.version === 0 && decodedBech32.data.length === 20) {
return AddressTypes.P2WPKH;
}
if (decodedBech32.version === 1 && decodedBech32.data.length === 32) {
return AddressTypes.P2TR;
}
}
}
catch { }
return null;
}
}