Как я могу получить финансирование моего токена с помощью ССЫЛКИ от пользователя через солидность?
Для работы моему контракту нужен токен LINK.
Я хочу позволить пользователям финансировать токены LINK для контракта через функцию контракта, а затем выполнять некоторую логику для пользователя на основе их финансирования.
Как я могу сделать это возможным в рамках контракта? Я пробовал делать такие звонки.
LINK.balanceOf(адрес кошелька) действительно работает (он получает сумму ссылки, которая находится в кошельке). Однако приведенная ниже функция по какой-то причине не работает. Он проходит и все такое, но с пустыми данными.
Metamask отображается по-другому, когда я делаю один и тот же вызов с их внешней кнопки. (Я полагаю, он делает то же самое, что и ремикс)
https://testnet.bscscan.com/token/0x84b9B910527Ad5C03A9Ca831909E21e236EA7b06#readContract
Вот как я пытаюсь получить одобрение своих контрактов.
function approveTransfer(uint256 amount) public returns(string memory) {
uint256 approveAmt = amount * 10**18;
LINK.approve(_msgSender(),approveAmt);
approvedAmount = approveAmt;
}
2 ответа
Невозможно изнутри вашего контракта, если внешний контракт явно не разрешает это или содержит недостаток безопасности с использованием устаревшего
tx.origin
вместо .
См. Последний абзац и фрагмент кода в этом ответе, чтобы увидеть, как его можно было бы неправильно использовать, если бы это было возможно.
Когда выполняет функцию LINK, в
LINK contract
сейчас - не пользователь.
Оба
transfer()
а также
approve()
(чтобы позвонить
transferFrom()
позже) функции полагаются на
msg.sender
, которым вам нужно быть пользователем. Но это не так - это ваш контракт.
Когда делегирует вызов функции LINK, изменения состояния сохраняются в
your contract
- не в ССЫЛКЕ.
Но вам нужно сохранить изменения состояния в контракте LINK, так что это тоже не вариант.
Хорошо, я продолжал искать, искать и искать ....
Пока я не нашел что-то потрясающее на их канале Discord. (Скорее всего, это тоже написано где-то еще).
Гарри | Звено цепи
Токен LINK - это ERC677 с функцией transferAndCall. Итак, в зависимости от того, как выполняется вызов функции вашего смарт-контракта, который генерирует случайное число, вы можете изменить его на функцию transferAndCall вместо той, которая просто выполняет запрос VRF, с идеей, что она будет передавать достаточно LINK для выполнения запрос VRF. Затем в вашем потребляющем контракте, который выполняет запрос VRF, вы реализуете функцию onTokenTransfer, которая просто вызывает вашу другую функцию, которая выполняет запрос VRF. Конечным результатом этого является то, что когда пользователь передает LINK на контракт, он автоматически выполняет запрос VRF в рамках одной единственной транзакции.
Таким образом, вместо того, чтобы пользователь нажимал кнопку, которая вызывает функцию в вашем потребительском контракте для выполнения запроса VRF, они нажимают кнопку, которая выполняет функцию transferAndCall из контракта токена LINK, который, в свою очередь, передает LINK в ваш потребительский контракт и вызывает функция onTokenTransfer в вашем потребляющем контракте, которая затем вызывает вашу функцию для выполнения запроса VRF, который будет успешно выполнен, потому что он только что получил LINK для запроса. См. реализацию этого в моей предыдущей записи хакатона «Link Gas Station»
https://github.com/pappas999/Link-Gas-Station/blob/master/contracts/WeatherCheck.solhttps://github.com/pappas999/Link-Gas-Station/blob/master/src/relayer/relayer.js
Короче говоря, это возможно, потому что в моем контракте есть
function onTokenTransfer(address from, uint256 amount, bytes memory data) public {
receivedTokenTransfer = true;
lastDepositer = from;
lastDepositerAmountInLink = amount / 10**18;
}
Для этого я могу вместо того, чтобы отправлять LINK на свой собственный контракт, я могу отправить LINK на адрес контракта LINK с указанием передачи полезной нагрузки данных transferAndCall, MycontractAddress и суммой LINK, которую должен получить мой контракт.
После того, как этот платеж будет отправлен, chainlink отправит мой контракт платеж и вызовет функцию с именем
onTokenTransfer
(По моему контракту). :)))
Надеюсь, это поможет кому-то в будущем.