【问题标题】:Allowance failed when attempting to transfer LINK tokens尝试转移 LINK 代币时津贴失败
【发布时间】:2022-12-12 20:35:36
【问题描述】:

我正在创建一个智能合约,用户可以在其中创建 NFT 抽奖活动。我将使用 Chainlink VRF 来获得可证明的公平结果。为此,创建抽奖活动的用户需要向合约提供 LINK 代币。我正在尝试使用津贴转移这些代币。

  function initRaffle(address _tokenContract, uint256 _tokenId, uint256 _ticketPrice) external {
      require(_ticketPrice > 0, "Ticket price must be bigger than 0");
      require(LINKToken.balanceOf(msg.sender) >= ChainlinkFee, "Insufficient LINK supplied");
      require(LINKToken.allowance(msg.sender, address(this)) >= ChainlinkFee, "Allowance failed");

运行 initRaffle 结果为 Allowance failed。我已经检查过,LINKToken.balanceOf(msg.sender) 大于费用,所以这应该不是问题所在。 LINKToken.balanceOf(address(this)) 为 0。

出了什么问题?以及我如何创建一个工作函数让用户将(费用金额)链接令牌转移到合同。

【问题讨论】:

    标签: ethereum blockchain solidity smartcontracts chainlink


    【解决方案1】:

    用户需要直接在LINKToken 合约上调用approve(yourContractAddress, feeAmount)(而不是通过你的合约)。这设置了allowance

    然后,您可以使用 transferFrom() 从用户的钱包中提取代币(不超过允许的数量)。

    bool success = LINKToken.transferFrom(msg.sender, address(this), ChainlinkFee);
    

    【讨论】:

    • 啊,我明白了,如何创建对令牌合约的 approve() 调用?
    • @root 有几种方法。最常见的是使用前端 Web 应用程序,您可以使用连接到 MetaMask 或其他浏览器扩展钱包的 ethersweb3 JS 包来构建交易(到 LINKToken 地址,包含执行 @ 的 data 字段987654333@函数)并请求用户钱包签名广播。文档:Connect to walletSend transaction
    猜你喜欢
    • 2023-01-18
    • 2022-08-03
    • 1970-01-01
    • 2017-05-29
    • 2019-04-13
    • 2014-09-08
    • 2022-01-22
    • 2021-04-15
    • 1970-01-01
    相关资源
    最近更新 更多