base58.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. "use strict";
  2. /**
  3. * The [Base58 Encoding](link-base58) scheme allows a **numeric** value
  4. * to be encoded as a compact string using a radix of 58 using only
  5. * alpha-numeric characters. Confusingly similar characters are omitted
  6. * (i.e. ``"l0O"``).
  7. *
  8. * Note that Base58 encodes a **numeric** value, not arbitrary bytes,
  9. * since any zero-bytes on the left would get removed. To mitigate this
  10. * issue most schemes that use Base58 choose specific high-order values
  11. * to ensure non-zero prefixes.
  12. *
  13. * @_subsection: api/utils:Base58 Encoding [about-base58]
  14. */
  15. Object.defineProperty(exports, "__esModule", { value: true });
  16. exports.decodeBase58 = exports.encodeBase58 = void 0;
  17. const data_js_1 = require("./data.js");
  18. const errors_js_1 = require("./errors.js");
  19. const maths_js_1 = require("./maths.js");
  20. const Alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
  21. let Lookup = null;
  22. function getAlpha(letter) {
  23. if (Lookup == null) {
  24. Lookup = {};
  25. for (let i = 0; i < Alphabet.length; i++) {
  26. Lookup[Alphabet[i]] = BigInt(i);
  27. }
  28. }
  29. const result = Lookup[letter];
  30. (0, errors_js_1.assertArgument)(result != null, `invalid base58 value`, "letter", letter);
  31. return result;
  32. }
  33. const BN_0 = BigInt(0);
  34. const BN_58 = BigInt(58);
  35. /**
  36. * Encode %%value%% as a Base58-encoded string.
  37. */
  38. function encodeBase58(_value) {
  39. const bytes = (0, data_js_1.getBytes)(_value);
  40. let value = (0, maths_js_1.toBigInt)(bytes);
  41. let result = "";
  42. while (value) {
  43. result = Alphabet[Number(value % BN_58)] + result;
  44. value /= BN_58;
  45. }
  46. // Account for leading padding zeros
  47. for (let i = 0; i < bytes.length; i++) {
  48. if (bytes[i]) {
  49. break;
  50. }
  51. result = Alphabet[0] + result;
  52. }
  53. return result;
  54. }
  55. exports.encodeBase58 = encodeBase58;
  56. /**
  57. * Decode the Base58-encoded %%value%%.
  58. */
  59. function decodeBase58(value) {
  60. let result = BN_0;
  61. for (let i = 0; i < value.length; i++) {
  62. result *= BN_58;
  63. result += getAlpha(value[i]);
  64. }
  65. return result;
  66. }
  67. exports.decodeBase58 = decodeBase58;
  68. //# sourceMappingURL=base58.js.map