# 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;
    }