Невозможно получить список владельцев токенов ERC20 непосредственно из контракта.
Вы правы в том, что вы не можете сделать это, потому что вы не можете получить список ключей для сопоставления в Solidity, поэтомуэто невозможно без внешнего вмешательства.
С учетом сказанного, многие люди нуждаются в этой функциональности и выполняют задачи для достижения этой цели.Самый большой пример, который я могу придумать, - это сбрасывание токенов с разных учетных записей в зависимости от наличия у них другого токена.Большинство людей делают это так: читает всех держателей токенов из блокчейна и сохраняет их в локальной базе данных.Оттуда они реализуют газосберегающую функцию, которая принимает адреса в качестве параметра и выполняет действия с ними таким образом.
Невозможно выполнить то, что вы хотите, используя только блокчейн, но комбинация логики цепочки / цепочки может достичь ваших целей.