MagnetPaymentsManager
Обзор
MagnetPaymentsManager — контракт приема платежей. Пользователь оплачивает инвойс в нативной валюте сети или ERC20, а контракт форвардит оплату на адрес treasury.
Ключевые свойства:
- upgradeable (UUPS);
- защита от реентранси (
ReentrancyGuardUpgradeable); - админские операции через
AccessControlUpgradeable.
Роли и права
DEFAULT_ADMIN_ROLE:- настройка
treasuryиsignatureValidator; - управление флагами
tokenAllowed; - вывод средств, которые оказались на контракте (
wthdraw); - апгрейд реализации (UUPS).
- настройка
Состояние
signatureValidator— адрес, чьей подписью подтверждаются инвойсы.treasury— адрес получателя оплат.tokenAllowed[token]— конфигурационный флаг разрешенности токена.usedSignatures[signature]— защита от повторного использования подписи.
Ограничения и безопасность
- Нет ончейн‑реестра инвойсов. Контракт не хранит статус/сумму инвойса; «истиной» является инвойс сгенерированный на бекенде и подпись
signatureValidator. - Replay‑защита по подписи. Повторная оплата с тем же
signatureневозможна (usedSignatures). - Привязка к плательщику. В подписи участвует
userAddress, поэтому подпись действительна только для конкретного отправителя (при корректной выдаче подписи бекендом). - Экспирация. Если
invoiceExpiration > 0, то платеж возможен только покаblock.timestamp < invoiceExpiration. - Переплата в native. При
token == address(0)проверяется толькоmsg.value >= amount; излишек остается на контракте и может быть выведен админом черезwthdraw. - Ограничение по токенам (allowlist).
payпроверяетtokenAllowed[token]и ревертится сTokenNotAllowed, если токен не разрешен.- В текущей реализации проверка выполняется до валидации подписи и распространяется также на
token == address(0). - При этом
setTokenAllowedзапрещаетtoken == address(0), поэтому оплата в нативной валюте фактически отключена (будет ревертTokenNotAllowed). Если нативные платежи нужны — это требует апгрейда контракта (например, проверять allowlist только для ERC20 или разрешитьaddress(0)в конфиге).
- В текущей реализации проверка выполняется до валидации подписи и распространяется также на