есть ERC721 токен и вы хотите, чтобы в рамках одной транзакции функции transfer`/`transferFrom от одного и того же tx.origin срабатывали строго один раз, т.е. в рамках одной транзакции можно было бы перевести строго один токен. При этом переводы несколькими отдельными транзакциями в одном блоке от одного и того же tx.origin запрещать нельзя. Итак, вопрос, как это можно сделать, если в Solidity никак не получить идентификатор транзакции?
Если вы подумали о ReentrancyGuard, то он не поможет, поскольку он защищает от reentrancy только до окончания перевода NFT, но вот если ее продать, а продавцом окажется контракт, у которого в receive() есть логика на перевод NFT, то такой контракт в рамках этой же транзакции спокойно инициирует еще один трансфер.
привязать через маппинг id => block => tx.origin => bool (последние три можно захэшировать и тогда маппинг будет одномерным)
Обсуждают сегодня