base58.ts 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import type { BytesLike } from '../types/UtilsTypes.js';
  2. const ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
  3. const ALPHABET_MAP = {} as Record<string, number>;
  4. for (let i = 0; i < ALPHABET.length; i++) ALPHABET_MAP[ALPHABET.charAt(i)] = i;
  5. const BASE = 58;
  6. export function encode58(buffer: BytesLike | string) {
  7. if (buffer.length === 0) return '';
  8. let i: number;
  9. let j: number;
  10. const digits = [0];
  11. for (i = 0; i < buffer.length; i++) {
  12. for (j = 0; j < digits.length; j++) digits[j] <<= 8;
  13. // eslint-disable-next-line @typescript-eslint/ban-ts-comment
  14. // @ts-ignore
  15. digits[0] += buffer[i];
  16. let carry = 0;
  17. for (j = 0; j < digits.length; ++j) {
  18. digits[j] += carry;
  19. carry = (digits[j] / BASE) | 0;
  20. digits[j] %= BASE;
  21. }
  22. while (carry) {
  23. digits.push(carry % BASE);
  24. carry = (carry / BASE) | 0;
  25. }
  26. }
  27. for (i = 0; buffer[i] === 0 && i < buffer.length - 1; i++) digits.push(0);
  28. return digits
  29. .reverse()
  30. .map((digit) => ALPHABET[digit])
  31. .join('');
  32. }
  33. export function decode58(string: string) {
  34. if (string.length === 0) return [];
  35. let i;
  36. let j;
  37. const bytes = [0];
  38. for (i = 0; i < string.length; i++) {
  39. const c: string = string[i];
  40. if (!(c in ALPHABET_MAP)) throw new Error('Non-base58 character');
  41. for (j = 0; j < bytes.length; j++) bytes[j] *= BASE;
  42. bytes[0] += ALPHABET_MAP[c];
  43. let carry = 0;
  44. for (j = 0; j < bytes.length; ++j) {
  45. bytes[j] += carry;
  46. carry = bytes[j] >> 8;
  47. bytes[j] &= 0xff;
  48. }
  49. while (carry) {
  50. bytes.push(carry & 0xff);
  51. carry >>= 8;
  52. }
  53. }
  54. for (i = 0; string[i] === '1' && i < string.length - 1; i++) bytes.push(0);
  55. return bytes.reverse();
  56. }