@okxweb3/coin-kaspa
Version:
A Kaspa SDK for building Web3 wallets and applications.
148 lines • 5.65 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.payToAddrScript = exports.encodePubKeyAddress = void 0;
const validation_1 = require("./validation");
const convertBits_1 = require("./convertBits");
const base32 = __importStar(require("./base32"));
const coin_base_1 = require("@okxweb3/coin-base");
function encodePubKeyAddress(pubKey, prefix) {
const eight0 = [0, 0, 0, 0, 0, 0, 0, 0];
const prefixData = prefixToArray(prefix).concat([0]);
const versionByte = 0;
const pubKeyArray = Array.prototype.slice.call(coin_base_1.base.fromHex(pubKey), 0);
const payloadData = (0, convertBits_1.convert)(new Uint8Array([versionByte].concat(pubKeyArray)), 8, 5, false);
const checksumData = new Uint8Array(prefixData.length + payloadData.length + eight0.length);
checksumData.set(prefixData);
checksumData.set(payloadData, prefixData.length);
checksumData.set(eight0, prefixData.length + payloadData.length);
const polymodData = checksumToArray(polymod(checksumData));
const payload = new Uint8Array(payloadData.length + polymodData.length);
payload.set(payloadData);
payload.set(polymodData, payloadData.length);
return 'kaspa:' + base32.encode(payload);
}
exports.encodePubKeyAddress = encodePubKeyAddress;
function payToAddrScript(address) {
(0, validation_1.validate)(hasSingleCase(address), 'Mixed case');
address = address.toLowerCase();
const pieces = address.split(':');
(0, validation_1.validate)(pieces.length === 2, 'Invalid format: ' + address);
const prefix = pieces[0];
(0, validation_1.validate)(prefix === 'kaspa', 'Invalid prefix: ' + address);
const encodedPayload = pieces[1];
const decoded = base32.decode(encodedPayload);
(0, validation_1.validate)(validChecksum(prefix, decoded), 'Invalid checksum: ' + address);
const convertedBits = (0, convertBits_1.convert)(decoded.slice(0, -8), 5, 8, true);
const version = convertedBits[0];
const payload = convertedBits.slice(1);
switch (version) {
case 0x00:
if (payload.length !== 32) {
throw new Error("Invalid Schnorr public key length");
}
return Buffer.concat([
Buffer.from([0x20]),
payload,
Buffer.from([0xac]),
]);
case 0x01:
if (payload.length !== 33) {
throw new Error("Invalid ECDSA public key length");
}
return Buffer.concat([
Buffer.from([0x21]),
payload,
Buffer.from([0xab]),
]);
case 0x08:
if (payload.length !== 32) {
throw new Error("Invalid script hash length");
}
return Buffer.concat([
Buffer.from([0xaa]),
Buffer.from([0x20]),
payload,
Buffer.from([0x87]),
]);
default:
throw new Error(`Unsupported address version: ${version}`);
}
}
exports.payToAddrScript = payToAddrScript;
;
function hasSingleCase(string) {
return string === string.toLowerCase() || string === string.toUpperCase();
}
function prefixToArray(prefix) {
const result = [];
for (let i = 0; i < prefix.length; i++) {
result.push(prefix.charCodeAt(i) & 31);
}
return result;
}
function checksumToArray(checksum) {
const result = [];
for (let i = 0; i < 8; ++i) {
result.push(checksum & 31);
checksum /= 32;
}
return result.reverse();
}
function validChecksum(prefix, payload) {
const prefixData = prefixToArray(prefix);
const data = new Uint8Array(prefix.length + 1 + payload.length);
data.set(prefixData);
data.set([0], prefixData.length);
data.set(payload, prefixData.length + 1);
return polymod(data) === 0;
}
const GENERATOR1 = [0x98, 0x79, 0xf3, 0xae, 0x1e];
const GENERATOR2 = [0xf2bc8e61, 0xb76d99e2, 0x3e5fb3c4, 0x2eabe2a8, 0x4f43e470];
function polymod(data) {
var c0 = 0, c1 = 1, C = 0;
for (var j = 0; j < data.length; j++) {
C = c0 >>> 3;
c0 &= 0x07;
c0 <<= 5;
c0 |= c1 >>> 27;
c1 &= 0x07ffffff;
c1 <<= 5;
c1 ^= data[j];
for (var i = 0; i < GENERATOR1.length; ++i) {
if (C & (1 << i)) {
c0 ^= GENERATOR1[i];
c1 ^= GENERATOR2[i];
}
}
}
c1 ^= 1;
if (c1 < 0) {
c1 ^= 1 << 31;
c1 += (1 << 30) * 2;
}
return c0 * (1 << 30) * 4 + c1;
}
//# sourceMappingURL=address.js.map