330 lines
6.3 KiB
JavaScript
330 lines
6.3 KiB
JavaScript
/*!
|
|
* namedelta.js - name deltas for hsd
|
|
* Copyright (c) 2017-2018, Christopher Jeffrey (MIT License).
|
|
* https://github.com/handshake-org/hsd
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
const bio = require('bufio');
|
|
const Outpoint = require('../primitives/outpoint');
|
|
const {encoding} = bio;
|
|
|
|
/*
|
|
* Constants
|
|
*/
|
|
|
|
const EMPTY = Buffer.alloc(0);
|
|
|
|
/**
|
|
* NameDelta
|
|
* @extends {bio.Struct}
|
|
*/
|
|
|
|
class NameDelta extends bio.Struct {
|
|
constructor() {
|
|
super();
|
|
|
|
this.height = null;
|
|
this.renewal = null;
|
|
this.owner = null;
|
|
this.value = null;
|
|
this.highest = null;
|
|
this.data = null;
|
|
this.transfer = null;
|
|
this.revoked = null;
|
|
this.claimed = null;
|
|
this.renewals = null;
|
|
this.registered = null;
|
|
this.expired = null;
|
|
this.weak = null;
|
|
}
|
|
|
|
isNull() {
|
|
return this.height === null
|
|
&& this.renewal === null
|
|
&& this.owner === null
|
|
&& this.value === null
|
|
&& this.highest === null
|
|
&& this.data === null
|
|
&& this.transfer === null
|
|
&& this.revoked === null
|
|
&& this.claimed === null
|
|
&& this.renewals === null
|
|
&& this.registered === null
|
|
&& this.expired === null
|
|
&& this.weak === null;
|
|
}
|
|
|
|
getSize() {
|
|
let size = 0;
|
|
|
|
size += 4;
|
|
|
|
if (this.height !== null)
|
|
size += 4;
|
|
|
|
if (this.renewal !== null)
|
|
size += 4;
|
|
|
|
if (this.owner !== null) {
|
|
if (!this.owner.isNull())
|
|
size += 32 + encoding.sizeVarint(this.owner.index);
|
|
}
|
|
|
|
if (this.value !== null) {
|
|
if (this.value !== 0)
|
|
size += encoding.sizeVarint(this.value);
|
|
}
|
|
|
|
if (this.highest !== null) {
|
|
if (this.highest !== 0)
|
|
size += encoding.sizeVarint(this.highest);
|
|
}
|
|
|
|
if (this.data !== null) {
|
|
if (this.data)
|
|
size += encoding.sizeVarlen(this.data.length);
|
|
}
|
|
|
|
if (this.transfer !== null) {
|
|
if (this.transfer !== 0)
|
|
size += 4;
|
|
}
|
|
|
|
if (this.revoked !== null) {
|
|
if (this.revoked !== 0)
|
|
size += 4;
|
|
}
|
|
|
|
if (this.claimed !== null) {
|
|
if (this.claimed !== 0)
|
|
size += 4;
|
|
}
|
|
|
|
if (this.renewals !== null) {
|
|
if (this.renewals !== 0)
|
|
size += encoding.sizeVarint(this.renewals);
|
|
}
|
|
|
|
return size;
|
|
}
|
|
|
|
getField() {
|
|
let field = 0;
|
|
|
|
if (this.height !== null)
|
|
field |= 1 << 0;
|
|
|
|
if (this.renewal !== null)
|
|
field |= 1 << 1;
|
|
|
|
if (this.owner !== null) {
|
|
field |= 1 << 2;
|
|
if (!this.owner.isNull())
|
|
field |= 1 << 3;
|
|
}
|
|
|
|
if (this.value !== null) {
|
|
field |= 1 << 4;
|
|
if (this.value !== 0)
|
|
field |= 1 << 5;
|
|
}
|
|
|
|
if (this.highest !== null) {
|
|
field |= 1 << 6;
|
|
if (this.highest !== 0)
|
|
field |= 1 << 7;
|
|
}
|
|
|
|
if (this.data !== null) {
|
|
field |= 1 << 8;
|
|
if (this.data)
|
|
field |= 1 << 9;
|
|
}
|
|
|
|
if (this.transfer !== null) {
|
|
field |= 1 << 10;
|
|
if (this.transfer !== 0)
|
|
field |= 1 << 11;
|
|
}
|
|
|
|
if (this.revoked !== null) {
|
|
field |= 1 << 12;
|
|
if (this.revoked !== 0)
|
|
field |= 1 << 13;
|
|
}
|
|
|
|
if (this.claimed !== null) {
|
|
field |= 1 << 14;
|
|
if (this.claimed !== 0)
|
|
field |= 1 << 15;
|
|
}
|
|
|
|
if (this.renewals !== null) {
|
|
field |= 1 << 16;
|
|
if (this.renewals !== 0)
|
|
field |= 1 << 17;
|
|
}
|
|
|
|
if (this.registered !== null) {
|
|
field |= 1 << 18;
|
|
if (this.registered)
|
|
field |= 1 << 19;
|
|
}
|
|
|
|
if (this.expired !== null) {
|
|
field |= 1 << 20;
|
|
if (this.expired)
|
|
field |= 1 << 21;
|
|
}
|
|
|
|
if (this.weak !== null) {
|
|
field |= 1 << 22;
|
|
if (this.weak)
|
|
field |= 1 << 23;
|
|
}
|
|
|
|
return field;
|
|
}
|
|
|
|
write(bw) {
|
|
bw.writeU32(this.getField());
|
|
|
|
if (this.height !== null)
|
|
bw.writeU32(this.height);
|
|
|
|
if (this.renewal !== null)
|
|
bw.writeU32(this.renewal);
|
|
|
|
if (this.owner !== null) {
|
|
if (!this.owner.isNull()) {
|
|
bw.writeHash(this.owner.hash);
|
|
bw.writeVarint(this.owner.index);
|
|
}
|
|
}
|
|
|
|
if (this.value !== null) {
|
|
if (this.value !== 0)
|
|
bw.writeVarint(this.value);
|
|
}
|
|
|
|
if (this.highest !== null) {
|
|
if (this.highest !== 0)
|
|
bw.writeVarint(this.highest);
|
|
}
|
|
|
|
if (this.data !== null) {
|
|
if (this.data)
|
|
bw.writeVarBytes(this.data);
|
|
}
|
|
|
|
if (this.transfer !== null) {
|
|
if (this.transfer !== 0)
|
|
bw.writeU32(this.transfer);
|
|
}
|
|
|
|
if (this.revoked !== null) {
|
|
if (this.revoked !== 0)
|
|
bw.writeU32(this.revoked);
|
|
}
|
|
|
|
if (this.claimed !== null) {
|
|
if (this.claimed !== 0)
|
|
bw.writeU32(this.claimed);
|
|
}
|
|
|
|
if (this.renewals !== null) {
|
|
if (this.renewals !== 0)
|
|
bw.writeVarint(this.renewals);
|
|
}
|
|
|
|
return bw;
|
|
}
|
|
|
|
read(br) {
|
|
const field = br.readU32();
|
|
|
|
if (field & (1 << 0))
|
|
this.height = br.readU32();
|
|
|
|
if (field & (1 << 1))
|
|
this.renewal = br.readU32();
|
|
|
|
if (field & (1 << 2)) {
|
|
this.owner = new Outpoint();
|
|
if (field & (1 << 3)) {
|
|
this.owner.hash = br.readHash();
|
|
this.owner.index = br.readVarint();
|
|
}
|
|
}
|
|
|
|
if (field & (1 << 4)) {
|
|
this.value = 0;
|
|
if (field & (1 << 5))
|
|
this.value = br.readVarint();
|
|
}
|
|
|
|
if (field & (1 << 6)) {
|
|
this.highest = 0;
|
|
if (field & (1 << 7))
|
|
this.highest = br.readVarint();
|
|
}
|
|
|
|
if (field & (1 << 8)) {
|
|
this.data = EMPTY;
|
|
if (field & (1 << 9))
|
|
this.data = br.readVarBytes();
|
|
}
|
|
|
|
if (field & (1 << 10)) {
|
|
this.transfer = 0;
|
|
if (field & (1 << 11))
|
|
this.transfer = br.readU32();
|
|
}
|
|
|
|
if (field & (1 << 12)) {
|
|
this.revoked = 0;
|
|
if (field & (1 << 13))
|
|
this.revoked = br.readU32();
|
|
}
|
|
|
|
if (field & (1 << 14)) {
|
|
this.claimed = 0;
|
|
if (field & (1 << 15))
|
|
this.claimed = br.readU32();
|
|
}
|
|
|
|
if (field & (1 << 16)) {
|
|
this.renewals = 0;
|
|
if (field & (1 << 17))
|
|
this.renewals = br.readVarint();
|
|
}
|
|
|
|
if (field & (1 << 18)) {
|
|
this.registered = false;
|
|
if (field & (1 << 19))
|
|
this.registered = true;
|
|
}
|
|
|
|
if (field & (1 << 20)) {
|
|
this.expired = false;
|
|
if (field & (1 << 21))
|
|
this.expired = true;
|
|
}
|
|
|
|
if (field & (1 << 22)) {
|
|
this.weak = false;
|
|
if (field & (1 << 23))
|
|
this.weak = true;
|
|
}
|
|
|
|
return this;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Expose
|
|
*/
|
|
|
|
module.exports = NameDelta;
|