polkadot-js/apps

View on GitHub
packages/react-components/src/util/toAddress.ts

Summary

Maintainability
A
1 hr
Test Coverage
// Copyright 2017-2024 @polkadot/react-components authors & contributors
// SPDX-License-Identifier: Apache-2.0

import { keyring } from '@polkadot/ui-keyring';
import { hexToU8a, isHex } from '@polkadot/util';
import { ethereumEncode } from '@polkadot/util-crypto';

export function toAddress (value?: string | Uint8Array | null, allowIndices = false, bytesLength?: 20 | 32): string | undefined {
  if (value) {
    try {
      const u8a = isHex(value)
        ? hexToU8a(value)
        : keyring.decodeAddress(value);

      if (!allowIndices && u8a.length !== 32 && u8a.length !== 20) {
        throw new Error('AccountIndex values not allowed');
      } else if (bytesLength && u8a.length !== bytesLength) {
        throw new Error('Invalid key length');
      }

      if (u8a.length === 20) {
        return ethereumEncode(u8a);
      } else {
        return keyring.encodeAddress(u8a);
      }
    } catch {
      // undefined return below indicates invalid/transient
    }
  }

  return undefined;
}