Чому міграція токена просить схвалення в гаманці

2026-09-03

Чому міграція токена просить схвалення в гаманці

Проєкт переходить на новий контракт, ви відкриваєте сторінку міграції, і ще до того, як зрушив хоча б один токен, гаманець просить схвалити старий. Запит виглядає як зайвий крок, який хтось додав до процесу. Це не так. В ERC-20 це єдиний спосіб передати баланс комусь, окрім вас самих, і вміння читати цей запит відділяє міграцію від спустошеного гаманця.

Чому міграція токена просить схвалення в гаманці: що дає це схвалення і чого воно не дає

Що насправді дає схвалення

Схвалення — це запис у реєстрі, який живе всередині контракту старого токена. Воно фіксує одне число для однієї пари адрес: скільки цього токена названій витратній адресі дозволено вивести з вашого рахунку. Підпис нічого не переміщує, нічого не надсилає проєкту й ні до якого обміну вас не зобов'язує.

У стандарті токен ERC-20 до цього реєстру звертаються дві функції. `approve` дозволяє витратній адресі знімати з вашого рахунку багаторазово, аж до заданої суми, а `transferFrom` — це виклик, який справді переміщує токени з однієї адреси на іншу. Специфікація подає цю пару як процедуру зняття, що дозволяє контрактам переказувати токени від вашого імені, і контракт міграції — один із таких контрактів, без жодного особливого статусу.

Де зберігається запис, важить більше, ніж здається. Дозвіл лежить у старому токені, а не в контракті міграції, тож він переживає і сторінку міграції, і сам обмін, і проєкт. Закрита вкладка його не прибирає.

Чому контракт обміну зобов'язаний питати

Обмін має спершу прийняти старі одиниці, щоб зарахувати нові. Контракт не може сам залізти на ваш рахунок, а про ваш баланс контракт токена слухає лише той акаунт, який цим балансом володіє.

Уявна альтернатива — надіслати старі токени контракту самостійно звичайним переказом. Токени справді підуть, і це теж не спрацює: звичайний переказ приходить як баланс без супровідного виклику, тож контракту ніхто не повідомляє про переказ і зараховувати йому нема проти чого. Стандарт ERC-223 написано саме навколо цієї поломки. Забір через `transferFrom` дає контракту один виклик, у якому він приймає старі одиниці й виплачує нові, а цьому виклику спершу потрібен дозвіл.

Дві транзакції, і обмінює лише друга

Схвалення й обмін — окремі транзакції, кожна зі своїм газом. ERC-2612 описує цю форму прямо: якщо користувачеві треба взаємодіяти зі смартконтрактом, то йому доводиться робити 2 транзакції, `approve` і сам виклик контракту, який усередині викличе `transferFrom`.

Саме тому, що вони окремі, перша може пройти, а друга все одно впасти. Зачинене вікно обміну, спустошений резерв виплат, поставлений на паузу контракт — нічого з цього схвалення не бачить, воно лише пише число й повертається. Підтверджене схвалення не доводить, що міграція за ним працює.

Зворотна пастка чекає на крок далі. Обмін після успішної симуляції все ще може відкотитися в мережі, бо симуляція відповідає на питання про стан в один момент, а не про стан, у який потрапляє ваша транзакція. Коли обмін відкочується, виданий вами дозвіл лишається недоторканим і далі діє.

Міграції, яким немає навіщо питати

Не кожна міграція працює на дозволі. Форма, про яку вам повідомили, має збігатися із запитом, який ви отримали.

Як влаштована міграція Що надсилаєте ви Чи доречне тут схвалення
Контракт обміну забирає ваші старі одиниці Схвалення, потім виклик обміну Так
Ви переказуєте старі токени на оприлюднену адресу Один звичайний переказ Ні
Власникам зі знімка нараховують за реєстром Нічого Ні
Платформа конвертує власний об'єднаний баланс Нічого Ні

Зупинити вас має третій рядок. У роздачі, оголошеній автоматичною, немає механізму, якому потрібен ваш дозвіл, тож сторінка, що його вимагає, просить те, чого описана міграція не використовує. Помітити цю невідповідність нічого не коштує, і вона не залежить від чиїхось суджень про сайт.

Три поля запиту, які вирішують усе

Будь-який запит на схвалення несе ті самі три поля, хоч як їх називає ваш гаманець.

Поле Що воно надає З чим звіряти
Токен У реєстр якого контракту піде запис Адреса старого контракту з власного оголошення проєкту
Витратна адреса Яка адреса може списувати з вашого рахунку Адреса контракту міграції з того самого оголошення
Сума Стеля того, що ця адреса може забрати Транш, який ви маєте намір обміняти зараз

Звіряйте адреси цілком. Схожа адреса може збігатися зі справжньою за першими та останніми символами, а різниця сидить посередині.

Поле витратної адреси і є тим, що несе збиток, і саме тому drainer гаманців не мусить нічого зламувати. Він ставить у це поле власну адресу й дає вам підписати схвалення, дійсне та правильно оформлене. Транзакція проходить рівно так, як записана, а баланс іде пізніше, за розкладом атакувальника, а не за вашим.

Коли просять підпис, а не транзакцію

Дозвіл приходить не завжди у вигляді транзакції. ERC-2612 розширює стандарт ERC-20 функцією `permit`, яка дозволяє користувачам змінювати відображення allowance підписаним повідомленням, а не через `msg.sender`; дійсний permit встановлює дозвіл для зазначеної витратної адреси на заявлене значення, збільшує nonce і випускає подію схвалення.

Наслідок такий: екран, де треба лише підписати повідомлення, без газу й без транзакції в очікуванні, здатен видати рівно те саме, що й транзакція схвалення. У момент підпису він до того ж нічого не лишає у вашій власній історії транзакцій, бо підписане повідомлення надсилає хтось інший.

Тож запит підпису читайте за тими самими трьома полями. Permit називає витратну адресу і значення, яке він виставляє, плюс deadline, до якого специфікація вимагає вкласти поточний час блоку. Якщо сторінка видає підпис за вхід або підтвердження, а в типізованих даних стоять витратна адреса й сума, виконано буде саме те, що в даних.

Точна сума чи безліміт, і дозвіл, який лишається

Розберемо приклад. У гаманці 10 000 старих одиниць, і проєкт відкрив обмін. Схвалити 2 500, обміняти цей транш і звірити те, що прийшло, з оголошеним коефіцієнтом — означає перетворити міграцію на те, що ви спостерігали, а не припустили. Решті 7 500 потім знадобиться друге схвалення: ще один платіж за газ, і це вся ціна такого підходу.

Безлімітне схвалення знімає другий платіж і замінює його постійним дозволом на цей токен на весь час життя запису. Контракт міграції зберігає право забрати будь-які старі одиниці, що потраплять на ваш рахунок пізніше, включно із залишком старих токенів, який ви знайдете в давньому гаманці через роки.

Завершіть тим, що приберете залишок. Точне схвалення витрачається тим обміном, заради якого видане, а все понад те лишає живий запис, і схвалення токенів, яке пережило своє завдання, — це дозвіл, за яким уже ніхто не стежить. Обнулення дозволу саме по собі транзакція зі своїм газом, тож зробіть її свідомо, коли міграцію завершено.

Підсумок

Міграція просить схвалення тому, що ERC-20 не дає їй іншого способу забрати ваші старі токени. Саме схвалення — число, записане в контракт старого токена, з іменем адреси та стелею: воно нічого не переміщує, нічого не доводить про міграцію за ним і не спливає, коли ви закриваєте сторінку.

Це зводить усю роботу до трьох перевірок. Чи взагалі потрібен дозвіл такій формі міграції, чи та витратна адреса, яку оприлюднив проєкт, і чи та сума, яку ви збиралися обміняти. Запит підпису відповідає на ті самі три, а виданий дозвіл переживає все довкола, тож приберіть його, коли обмін зроблено. Щоб продовжити вивчати основи, читайте інші матеріали Bitbase Academy.

Схожі матеріали

Інші матеріали Bitbase на цю тему:

- Як відкликати делегування в управлінні

- Як розрахувати фінансовий запас скарбниці токен-проєкту

- Механіка пропозиції токена

- ATR і вимірювання волатильності

- Смуги Боллінджера: як їх читати

Застереження: Ця стаття є освітнім матеріалом Bitbase Academy і надається лише для інформації. Вона не є інвестиційною, торговою, податковою чи фінансовою порадою. Криптоактиви волатильні — оцінюйте ризики самостійно. Написано станом на вересень 2026 року; орієнтуйтеся на найновішу офіційну інформацію.

Джерела

[1] Ethereum Improvement Proposals, ERC-20: Token Standard, методи approve та transferFrom (статус: Final) eips.ethereum.org

[2] Ethereum Improvement Proposals, ERC-2612: Permit Extension for EIP-20 Signed Approvals, розділи Abstract і Specification (статус: Final) eips.ethereum.org

[3] Ethereum Improvement Proposals, ERC-223: Token with transaction handling model, розділ Motivation (статус: Final) eips.ethereum.org

Пов'язані статті

Більше