Я обновил прокси FleetRegistry на локальной ноде hardhat. В V1 было зарегистрировано 37 устройств. Я задеплоил реализацию V2 через scripts/upgrade.js и вызвал upgradeToAndCall(implAddr, "0x") на прокси.
После апгрейда:
deviceCount()на прокси возвращает 0devices(id)по-прежнему возвращает старые записи, так что маппинг уцелелregistrationFee()возвращает 37, хотя никто никогда не задавал комиссию, и теперьregisterDeviceтребует 37 wei
Сначала я подумал, что upgradeToAndCall с пустыми данными что-то сбросил в прокси. Потом решил, что манифест в .openzeppelin/ устарел, и удалил его. Ничего не изменилось.
Я не понимаю, почему один счётчик обнулился, а остальные данные в порядке.
Переменные состояния, V1:
mapping(bytes32 => Device) public devices;
uint32 public minFwVersion;
uint256 public deviceCount;
V2:
mapping(bytes32 => Device) public devices;
uint32 public minFwVersion;
uint256 public registrationFee; // new in V2, kept next to the other config
uint256 public deviceCount;
Скрипт апгрейда не вызывает upgrades.validateUpgrade. Мой комментарий там гласит, что UUPS и так отклонит плохую реализацию через proxiableUUID.
Функции те же, кроме проверки комиссии. Solidity 0.8.24, OpenZeppelin upgradeable contracts, установлен плагин hardhat-upgrades.
Проблема в моём контракте V2 или в том, как я делаю апгрейд? Сейчас я не могу запустить проект, так что просто описываю то, что видел.