All files / lib/messages AddressCache.ts

100% Statements 31/31
100% Branches 0/0
100% Functions 5/5
100% Lines 31/31

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 751x   1x   1x   1x 1x           1x   1x 2x         1x       1x 1x   1x 1x   1x 2x 2x   2x     1x     4x   4x     1x   1x 2x     1x       1x   1x   1x   1x 2x 2x     1x              
import { BufferReader, BufferWriter } from '@node-dlc/bufio';
import { BitcoinNetwork } from 'bitcoin-networks';
import { address } from 'bitcoinjs-lib';
 
import { MessageType } from '../MessageType';
 
export class AddressCache {
  public static type = MessageType.AddressCache;
 
  public static fromAddressCache(
    addressesBlacklist: IAddressCache[],
    network: BitcoinNetwork,
  ): AddressCache {
    const instance = new AddressCache();
 
    for (const blacklistAddress of Object.keys(addressesBlacklist)) {
      instance.cacheSPKs.push(
        address.toOutputScript(blacklistAddress, network),
      );
    }
 
    return instance;
  }
 
  public static deserialize(buf: Buffer): AddressCache {
    const instance = new AddressCache();
    const reader = new BufferReader(buf);
 
    reader.readUInt16BE(); // read type
    reader.readBigSize(); // num_cache_spks
 
    while (!reader.eof) {
      const cacheSPKLen = reader.readBigSize();
      const cacheSPK = reader.readBytes(Number(cacheSPKLen));
 
      instance.cacheSPKs.push(cacheSPK);
    }
 
    return instance;
  }
 
  public type = AddressCache.type;
 
  public cacheSPKs: Buffer[] = [];
 
  public toAddressCache(network: BitcoinNetwork): IAddressCache[] {
    const addressCache: IAddressCache[] = [];
 
    for (const cacheSPK of this.cacheSPKs) {
      addressCache[address.fromOutputScript(cacheSPK, network)] = true;
    }
 
    return addressCache;
  }
 
  public serialize(): Buffer {
    const writer = new BufferWriter();
 
    writer.writeUInt16BE(this.type);
 
    writer.writeBigSize(this.cacheSPKs.length);
 
    for (const cacheSPK of this.cacheSPKs) {
      writer.writeBigSize(cacheSPK.length);
      writer.writeBytes(cacheSPK);
    }
 
    return writer.toBuffer();
  }
}
 
export interface IAddressCache {
  [x: string]: boolean;
}