Transactions
為什麼我不能將 ERC20 代幣從我的錢包存入我部署的合約?
大家好,我最近開始涉足 Solidity 開發,但在 ERC20 代幣互動方面遇到了麻煩。
我想要完成的是將 ERC20 代幣發送到我創建的智能合約。
pragma solidity ^0.5.0; contract ERC20 { function totalSupply() public view returns (uint supply); function balanceOf(address _owner) public view returns (uint balance); function transfer(address _to, uint _value) public returns (bool success); function transferFrom(address _from, address _to, uint _value) public returns (bool success); function approve(address _spender, uint _value) public returns (bool success); function allowance(address _owner, address _spender) public view returns (uint remaining); function decimals() public view returns(uint digits); event Approval(address indexed _owner, address indexed _spender, uint _value); } contract MySmartContract { function approveDeposit(address tokenAddress) public { ERC20 token = ERC20(tokenAddress); token.approve(address(this), token.balanceOf(msg.sender)); } function depositToken(address tokenAddress) public { ERC20 token = ERC20(tokenAddress); uint tokenAmount = token.balanceOf(msg.sender); token.transferFrom(msg.sender, address(this), tokenAmount); } }
我的錢包裡有 BAT 代幣。使用 BAT 代幣地址呼叫approveDeposit 函式後,我嘗試呼叫depositToken 但它返回錯誤。
我究竟做錯了什麼?
為了在從合約中的函式執行時成功完成:
token.transferFrom(msg.sender, address(this), tokenAmount);
您需要
approve(yourContractAddress, tokenAmount)
使用該msg.sender
帳戶執行。但是,當您從合約中的函式執行此操作時:
token.approve(address(this), token.balanceOf(msg.sender));
您正在
approve
使用您的合約賬戶執行,這意味著您允許其他賬戶從您的合約中轉移代幣。此外,通過this
作為第一個參數傳遞,該其他帳戶就是您自己的合約。換句話說,您正在批准您的合約從自己轉移代幣,這當然是沒有用的。