Как защитить изменение лимита ICRC-2 от параллельного списания

Между чтением лимита и отправкой нового значения данные на экране могут устареть. В ICRC-2 для такого случая предусмотрено поле expected_allowance.

Передайте значение, которое видел пользователь

Запросите icrc2_allowance для конкретной пары счетов владельца и получателя полномочий. При изменении лимита с 80 до 100 передайте 80 как ожидаемое значение. Если до этого спишут 30, проверка не пройдёт. Покажите актуальный остаток и дайте пользователю заново определить итоговый лимит.

read allowance = 80
spender consumes 30 → current allowance = 50
approve(amount = 100, expected_allowance = 80) → AllowanceChanged

Учитывайте абсолютное значение

Сумма approve задаёт новый размер лимита целиком. Автоматический повтор с ожидаемым значением 50 проведёт изменение при условиях, которых пользователь не видел. Если позднее отклонится transfer_from, проверьте также expires_at и фактический баланс владельца.

Источники