import * as StorageValue from '@voltaire/primitives/StorageValue';
import * as Keccak256 from '@voltaire/crypto/Keccak256';
import * as Address from '@voltaire/primitives/Address';
// Calculate ERC-20 balance storage slot
// balanceOf[address] uses: keccak256(address . slot)
function getBalanceSlot(holder: string, mappingSlot: bigint): string {
const address = Address.from(holder);
const slot = StorageValue.from(mappingSlot);
// Concatenate address (left-padded to 32 bytes) with slot
const data = new Uint8Array(64);
data.set(new Uint8Array(12), 0); // 12 zero bytes
data.set(address, 12); // 20-byte address
data.set(slot, 32); // 32-byte slot
return Keccak256.hashToHex(data);
}
// Get balance slot for an address at mapping slot 0
const slot = getBalanceSlot("0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", 0n);