@vbyte/btc-dev
Version:
Batteries-included toolset for plebian bitcoin development
52 lines (51 loc) • 2.09 kB
JavaScript
import { Buff } from '@vbyte/buff';
import { Assert } from '@vbyte/micro-lib';
import { hash160 } from '@vbyte/micro-lib/hash';
import { encode_address } from './encode.js';
import { is_p2wpkh_script } from '../../lib/script/lock.js';
import { LOCK_SCRIPT_TYPE } from '../../const.js';
import { get_address_config, get_address_info } from './util.js';
const ADDRESS_TYPE = LOCK_SCRIPT_TYPE.P2WPKH;
export var P2WPKH;
(function (P2WPKH) {
P2WPKH.create_address = create_p2wpkh_address;
P2WPKH.create_script = create_p2wpkh_script;
P2WPKH.encode_address = encode_p2wpkh_address;
P2WPKH.encode_script = encode_p2wpkh_script;
P2WPKH.decode_address = decode_p2wpkh_address;
P2WPKH.decode_script = decode_p2wpkh_script;
})(P2WPKH || (P2WPKH = {}));
function create_p2wpkh_address(pubkey, network = 'main') {
const script = create_p2wpkh_script(pubkey);
return encode_p2wpkh_address(script, network);
}
function create_p2wpkh_script(pubkey) {
const bytes = Buff.bytes(pubkey);
Assert.size(bytes, 33, 'invalid pubkey size');
const hash = hash160(bytes);
return encode_p2wpkh_script(hash);
}
function encode_p2wpkh_script(pk_hash) {
return Buff.join(['0014', pk_hash]);
}
function encode_p2wpkh_address(script_pk, network = 'main') {
const pk_hash = decode_p2wpkh_script(script_pk);
const config = get_address_config(network, ADDRESS_TYPE);
Assert.exists(config, `unrecognized address config: ${ADDRESS_TYPE} on ${network}`);
Assert.size(pk_hash, config.size, `invalid payload size: ${pk_hash.length} !== ${config.size}`);
return encode_address({
data: pk_hash,
format: 'bech32',
prefix: config.prefix
});
}
function decode_p2wpkh_address(address) {
const parsed = get_address_info(address);
Assert.ok(parsed.type === 'p2wpkh', `address type mismatch: ${parsed.type} !== ${ADDRESS_TYPE}`);
return parsed;
}
function decode_p2wpkh_script(script) {
Assert.ok(is_p2wpkh_script(script), `invalid p2wpkh script`);
const bytes = Buff.bytes(script);
return bytes.slice(2, 22);
}