import { getAddress, pad, sliceHex } from "viem"; import { generatePrivateKey, privateKeyToAccount } from "viem/accounts"; import { exhaustiveCheck } from "../../utils/exhaustive-check.js"; import { BYTES32_LENGTH, EVM_ADDRESS_BYTES_LENGTH } from "../constants/bytes.js"; import { ChainType } from "../types/chain.js"; import type { AddressType, EvmAddress, GenericAddress } from "../types/address.js"; export function getRandomGenericAddress(): GenericAddress { return pad(privateKeyToAccount(generatePrivateKey()).address, { size: BYTES32_LENGTH, }).toLowerCase() as GenericAddress; } export function isGenericAddress(address: GenericAddress): boolean { return address.length === 64 + 2; } export function convertToGenericAddress( address: AddressType, fromChainType: ChainType, ): GenericAddress { switch (fromChainType) { case ChainType.EVM: return pad(address as EvmAddress, { size: BYTES32_LENGTH, }).toLowerCase() as GenericAddress; default: return exhaustiveCheck(fromChainType); } } export function convertFromGenericAddress( address: GenericAddress, toChainType: ChainType, ): AddressType { switch (toChainType) { case ChainType.EVM: return getAddress(sliceHex(address, BYTES32_LENGTH - EVM_ADDRESS_BYTES_LENGTH)) as EvmAddress; default: return exhaustiveCheck(toChainType); } }