Как прочитать элемент mapping Solidity напрямую из хранилища
У старого контракта может отсутствовать публичный геттер. Если известна фактическая схема хранения Solidity, позицию значения можно вычислить по ключу и слоту объявления.
Рассчитайте позицию по адресу
Пусть в проверенной схеме mapping(address => uint256) credit занимает слот 3. Дополните 20-байтовый адрес нулями слева до 32 байт и запишите число 3 отдельным 32-байтовым словом. Соедините 64 байта и вычислите Keccak-256.
slot = keccak256(abi.encode(account, uint256(3)))
Передайте хеш как позицию в eth_getStorageAt для контракта на выбранном блоке. Декодируйте слово как uint256. Чтение самого слота 3 не вернёт элементы mapping.
Сопоставьте схему с развёрнутым кодом
Возьмите схему реализации, работавшей на той высоте. В случае прокси с delegatecall читайте хранилище по адресу прокси. У вложенного mapping добавляется ещё один этап хеширования, а для строковых и байтовых ключей применяются другие правила кодирования. docs.soliditylang.org Solidity storage layout