Я обновил прокси FleetRegistry на локальной ноде hardhat. В V1 было зарегистрировано 37 устройств. Я задеплоил реализацию V2 через scripts/upgrade.js и вызвал upgradeToAndCall(implAddr, "0x") на прокси.

После апгрейда:

  • deviceCount() на прокси возвращает 0
  • devices(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 или в том, как я делаю апгрейд? Сейчас я не могу запустить проект, так что просто описываю то, что видел.