в свой проект (например для обмена), как выстроена логика предоставления возможности пользоваться токенами для действующего контракта.
Чуть подробнее:
1. Мы сделали свой контракт, который создает свой токен ERC-20, назовем его "Test"
2. В этом контракте я хочу добавить функцию обмена токена Test на USDT. Пусть курс будет заложен 1 к 1.
3. Через интерфейс я подключаю токен USDT.
Теперь когда я обмениваю токен, что происходит:
1. Сам контракт отдает свои токены Test через функцию Transfer, так как в данном случае мы имеем глобальную переменную msg.sender, в которой помещен аккаунт вызывающего пользователя.
2. Непонятно что происходит со вторым токеном. Здесь уже как я понимаю к другому контракту образается не сам пользователь, а контракт который вызывал пользователь (т.е. наш контракт). В этом случае в msg.sender будет положен адрес нашего контракта. Но в этом случае необходимо вызывать функцию transferFrom, а для этого надо подтвердить (вызвать функцию approve) наш контракт, с нужным объемом токенов для обмена. Но approve должен вызывать изначальный пользователь, а не наш контракт, так как если мы вызовем через наш контракт, то approve будет применен для нашего аккаунта. Т.е. получается изначально пользователь должен зайти на контракт другого токена и сам вызвать функцию approve? Ну судя по тому, что обмены проходят свободно без этого лишнего действия, значит я что-то не понимаю.
Собственно вопрос во втором пункте... У меня есть идея, что если через интерфейс мы подключаем токен, то функция будет вызываться от имени человека, который вызывает наш контракт, а не от имени нашего контракта. Но подтвердить я этого где-либо не смог)
Буду благодарен ответившим ;)
Будет две транзакции от пользователя. Первая - апрув от пользователя на контракт usdt в пользу контракта Test Вторая - на контракт Test, который вызовет transferFrom usdt с адреса пользователя и отправит ему в ответ токены Test
Т.е. через интерфейс web3 мы должны вызвать сначала запрос от имени пользователя на контракт usdt. А после того, как вернется true, отправить еще оин запрос уже на transferFrom, верно?
Получается, что через один вызов функции на смарт контракте это реализовать невозможно? Я на всякий случай уточню)
В случае с usdt - нет
Обсуждают сегодня