All files / src/libs base58.ts

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 75 76 77 78 79 80 81 82 83 84 85 86 87 88 891x 1x 58x 58x       1x     37x   37x   37x   1562x 51898x     1562x 1562x   1562x 51898x 51898x 51898x     1562x 2105x 2105x         37x       37x 2142x             20x   20x   20x   882x 882x       882x 17730x     882x 882x   882x 17730x 17730x 17730x     882x 622x 622x         20x       20x          
const ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
const ALPHABET_MAP = ALPHABET.split('').reduce((map:any, c, i) => {
  map[c] = i;
  return map;
}, {});
 
 
export default {
  encode(buffer: Uint8Array): string {
 
    Iif (!buffer.length) return '';
 
    const digits = [0];
 
    for (let i = 0; i < buffer.length; i++) {
 
      for (let j = 0; j < digits.length; j++) {
        digits[j] <<= 8;
      }
 
      digits[0] += buffer[i];
      let carry = 0;
 
      for (let k = 0; k < digits.length; k++) {
        digits[k] += carry;
        carry = (digits[k] / 58) | 0;
        digits[k] %= 58;
      }
 
      while (carry) {
        digits.push(carry % 58);
        carry = (carry / 58) | 0;
      }
 
    }
 
    for (let i = 0; buffer[i] === 0 && i < buffer.length - 1; i++) {
      digits.push(0);
    }
 
    return digits.reverse().map(function (digit) {
      return ALPHABET[digit];
    }).join('');
 
  },
 
  decode(string: string): Uint8Array {
 
    Iif (!string.length) return new Uint8Array(0);
 
    const bytes = [0];
 
    for (let i = 0; i < string.length; i++) {
 
      const c = string[i];
      Iif (!(c in ALPHABET_MAP)) {
        throw `There is no character "${c}" in the Base58 sequence!`;
      }
 
      for (let j = 0; j < bytes.length; j++) {
        bytes[j] *= 58;
      }
 
      bytes[0] += ALPHABET_MAP[c];
      let carry = 0;
 
      for (let j = 0; j < bytes.length; j++) {
        bytes[j] += carry;
        carry = bytes[j] >> 8;
        bytes[j] &= 0xff;
      }
 
      while (carry) {
        bytes.push(carry & 0xff);
        carry >>= 8;
      }
 
    }
 
    for (let i = 0; string[i] === '1' && i < string.length - 1; i++) {
      bytes.push(0);
    }
 
    return new Uint8Array(bytes.reverse());
 
  }
 
};