Как пройти историю Chainlink через смену агрегатора

При выгрузке цен индексатор дошёл до первого раунда текущего агрегатора. Если просто вычесть единицу из ID раунда прокси, индексатор не попадёт в последний раунд предыдущего агрегатора.

Разберите составной идентификатор

В этом формате EVM-прокси старшие биты задают фазу, а младшие 64 бита — номер раунда внутри агрегатора. В примере исходная точка — третий этап, раунд 1. После вычитания единицы фаза по-прежнему равна 3, а локальный номер становится нулевым. Используйте целое число, которое вмещает 80 бит.

const pack = (phase, round) => (phase << 64n) | round;
const id = pack(3n, 1n);
console.log(String(id >> 64n), String(id & ((1n << 64n) - 1n)));
console.log(String((id - 1n) >> 64n));

Продолжите с известного раунда старой фазы

По истории прокси найдите агрегатор второй фазы и установите по историческим данным его последний раунд в этой фазе. Соберите ID из номера фазы 2 и найденного номера раунда, затем запросите прокси. В выгрузке храните адрес прокси и фазу: один локальный номер может встречаться у разных агрегаторов. Если историческое чтение не удалось, оставьте интервал явно непроверенным.

docs.chain.link Historical feed rounds