12345678910111213141516171819202122232425262728293031323334353637383940414243 |
- const { getStorageAt, setStorageAt } = require('@nomicfoundation/hardhat-network-helpers');
- const ImplementationLabel = 'eip1967.proxy.implementation';
- const AdminLabel = 'eip1967.proxy.admin';
- const BeaconLabel = 'eip1967.proxy.beacon';
- function labelToSlot(label) {
- return '0x' + web3.utils.toBN(web3.utils.keccak256(label)).subn(1).toString(16);
- }
- function getSlot(address, slot) {
- return getStorageAt(
- web3.utils.isAddress(address) ? address : address.address,
- web3.utils.isHex(slot) ? slot : labelToSlot(slot),
- );
- }
- function setSlot(address, slot, value) {
- const hexValue = web3.utils.isHex(value) ? value : web3.utils.toHex(value);
- return setStorageAt(
- web3.utils.isAddress(address) ? address : address.address,
- web3.utils.isHex(slot) ? slot : labelToSlot(slot),
- web3.utils.padLeft(hexValue, 64),
- );
- }
- async function getAddressInSlot(address, slot) {
- const slotValue = await getSlot(address, slot);
- return web3.utils.toChecksumAddress(slotValue.substring(slotValue.length - 40));
- }
- module.exports = {
- ImplementationLabel,
- AdminLabel,
- BeaconLabel,
- ImplementationSlot: labelToSlot(ImplementationLabel),
- AdminSlot: labelToSlot(AdminLabel),
- BeaconSlot: labelToSlot(BeaconLabel),
- setSlot,
- getSlot,
- getAddressInSlot,
- };
|