github.com/ethereum-optimism/optimism@v1.7.2/packages/core-utils/src/common/bn.ts (about)

     1  import { BigNumber } from '@ethersproject/bignumber'
     2  import { getAddress } from '@ethersproject/address'
     3  
     4  import { remove0x, add0x } from './hex-strings'
     5  
     6  /**
     7   * Converts an ethers BigNumber into an equivalent Ethereum address representation.
     8   *
     9   * @param bn BigNumber to convert to an address.
    10   * @return BigNumber converted to an address, represented as a hex string.
    11   */
    12  export const bnToAddress = (bn: BigNumber | number): string => {
    13    // Coerce numbers into a BigNumber.
    14    bn = BigNumber.from(bn)
    15  
    16    // Negative numbers are converted to addresses by adding MAX_ADDRESS + 1.
    17    // TODO: Explain this in more detail, it's basically just matching the behavior of doing
    18    // addr(uint256(addr) - some_number) in Solidity where some_number > uint256(addr).
    19    if (bn.isNegative()) {
    20      bn = BigNumber.from('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF')
    21        .add(bn)
    22        .add(1)
    23    }
    24  
    25    // Convert to a hex string
    26    let addr = bn.toHexString()
    27    // Remove leading 0x so we can mutate the address a bit
    28    addr = remove0x(addr)
    29    // Make sure it's 40 characters (= 20 bytes)
    30    addr = addr.padStart(40, '0')
    31    // Only take the last 40 characters (= 20 bytes)
    32    addr = addr.slice(addr.length - 40, addr.length)
    33    // Add 0x again
    34    addr = add0x(addr)
    35    // Convert into a checksummed address
    36    addr = getAddress(addr)
    37  
    38    return addr
    39  }