address.js 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import { hexStr2byteArray, byteArray2hexStr } from './code.js';
  2. import { decodeBase58Address, getBase58CheckAddress, isAddressValid, pkToAddress } from './crypto.js';
  3. import { isHex, isString } from './validations.js';
  4. import { keccak256 } from './ethersUtils.js';
  5. export const ADDRESS_SIZE = 34;
  6. export const ADDRESS_PREFIX = '41';
  7. export const ADDRESS_PREFIX_BYTE = 0x41;
  8. export const ADDRESS_PREFIX_REGEX = /^(41)/;
  9. export const TRON_BIP39_PATH_PREFIX = "m/44'/195'";
  10. export const TRON_BIP39_PATH_INDEX_0 = TRON_BIP39_PATH_PREFIX + "/0'/0/0";
  11. export function fromHex(address) {
  12. if (!isHex(address))
  13. return address;
  14. return getBase58CheckAddress(hexStr2byteArray(address.replace(/^0x/, ADDRESS_PREFIX)));
  15. }
  16. export function toHex(address) {
  17. if (isHex(address))
  18. return address.toLowerCase().replace(/^0x/, ADDRESS_PREFIX);
  19. return byteArray2hexStr(decodeBase58Address(address)).toLowerCase();
  20. }
  21. function getChecksumAddress(address) {
  22. address = address.toLowerCase();
  23. const chars = address.substring(2).split('');
  24. const expanded = new Uint8Array(40);
  25. for (let i = 0; i < 40; i++) {
  26. expanded[i] = chars[i].charCodeAt(0);
  27. }
  28. const hashed = hexStr2byteArray(keccak256(expanded).slice(2));
  29. for (let i = 0; i < 40; i += 2) {
  30. if ((hashed[i >> 1] >> 4) >= 8) {
  31. chars[i] = chars[i].toUpperCase();
  32. }
  33. if ((hashed[i >> 1] & 0x0f) >= 8) {
  34. chars[i + 1] = chars[i + 1].toUpperCase();
  35. }
  36. }
  37. return ADDRESS_PREFIX + chars.join('');
  38. }
  39. export function toChecksumAddress(address) {
  40. if (!isAddress(address))
  41. throw new Error(`'${address}' is not a valid address string`);
  42. return getChecksumAddress(toHex(address));
  43. }
  44. export function isChecksumAddress(address) {
  45. if (!isHex(address) || address.length !== 42)
  46. return false;
  47. try {
  48. return toChecksumAddress(address) === address;
  49. }
  50. catch {
  51. return false;
  52. }
  53. }
  54. export function fromPrivateKey(privateKey, strict = false) {
  55. try {
  56. return pkToAddress(privateKey, strict);
  57. }
  58. catch {
  59. return false;
  60. }
  61. }
  62. export function isAddress(address) {
  63. if (!address || !isString(address))
  64. return false;
  65. // Convert HEX to Base58
  66. if (address.length === 42) {
  67. try {
  68. // it throws an error if the address starts with 0x
  69. return isAddress(getBase58CheckAddress(hexStr2byteArray(address)));
  70. }
  71. catch (err) {
  72. return false;
  73. }
  74. }
  75. try {
  76. return isAddressValid(address);
  77. }
  78. catch (err) {
  79. return false;
  80. }
  81. }
  82. //# sourceMappingURL=address.js.map