@arklabs/wallet-sdk
Version:
Bitcoin wallet SDK with Taproot and Ark integration
87 lines (86 loc) • 3.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ArkNote = exports.ArkNoteData = void 0;
const base_1 = require("@scure/base");
// ArkNoteData is the unsigned data part of a note
class ArkNoteData {
constructor(id, value) {
this.id = id;
this.value = value;
}
encode() {
const array = new Uint8Array(12);
writeBigUInt64BE(array, this.id, 0);
writeUInt32BE(array, this.value, 8);
return array;
}
static decode(data) {
if (data.length !== 12) {
throw new Error(`invalid data length: expected 12 bytes, got ${data.length}`);
}
const id = readBigUInt64BE(data, 0);
const value = readUInt32BE(data, 8);
return new ArkNoteData(id, value);
}
}
exports.ArkNoteData = ArkNoteData;
// ArkNote is a note with the issuer's signature
class ArkNote {
constructor(data, signature) {
this.data = data;
this.signature = signature;
}
encode() {
const detailsBytes = this.data.encode();
const result = new Uint8Array(detailsBytes.length + this.signature.length);
result.set(detailsBytes);
result.set(this.signature, detailsBytes.length);
return result;
}
static decode(data) {
if (data.length < 12) {
throw new Error(`invalid data length: expected at least 12 bytes, got ${data.length}`);
}
const noteData = ArkNoteData.decode(data.subarray(0, 12));
const signature = data.subarray(12);
if (signature.length !== 64) {
throw new Error(`invalid signature length: expected 64 bytes, got ${signature.length}`);
}
return new ArkNote(noteData, signature);
}
static fromString(noteStr) {
if (!noteStr.startsWith(ArkNote.HRP)) {
throw new Error(`invalid human-readable part: expected ${ArkNote.HRP} prefix (note '${noteStr}')`);
}
const encoded = noteStr.slice(ArkNote.HRP.length);
if (encoded.length < 103 || encoded.length > 104) {
throw new Error(`invalid note length: expected 103 or 104 chars, got ${encoded.length}`);
}
const decoded = base_1.base58.decode(encoded);
if (decoded.length === 0) {
throw new Error("failed to decode base58 string");
}
return ArkNote.decode(new Uint8Array(decoded));
}
toString() {
return ArkNote.HRP + base_1.base58.encode(this.encode());
}
}
exports.ArkNote = ArkNote;
ArkNote.HRP = "arknote";
function writeBigUInt64BE(array, value, offset) {
const view = new DataView(array.buffer, array.byteOffset + offset, 8);
view.setBigUint64(0, value, false);
}
function readBigUInt64BE(array, offset) {
const view = new DataView(array.buffer, array.byteOffset + offset, 8);
return view.getBigUint64(0, false);
}
function writeUInt32BE(array, value, offset) {
const view = new DataView(array.buffer, array.byteOffset + offset, 4);
view.setUint32(0, value, false);
}
function readUInt32BE(array, offset) {
const view = new DataView(array.buffer, array.byteOffset + offset, 4);
return view.getUint32(0, false);
}