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 }