base58.js 1.8 KB

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