【Solidity】发送ERC20代币到合约

这个文章将会教你如何把发行的ERC20代币转账值合约内。

  1. 首先必须发行一个ERC20代币
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract Coin is ERC20{
    constructor() ERC20("TestCoin", "TEC") {
        //初始发行1000个币去到作者的户口内,并且是6个小数点
       _mint(msg.sender, 1000 * 10 ** decimals());
    }

    function decimals()public pure override returns(uint8){
        return 6;
    }
}

2. 发行代币了之后就需要把代币的地址copy下来,然后部署以下的代币合约。
参考文档:https://learnblockchain.cn/docs/eips/eip-20.html#api-%E8%A7%84%E8%8C%83

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

contract CoinContract{
    IERC20 MyToken;

    constructor(address TokenAddress){
        MyToken = IERC20(TokenAddress);
    }

    function transferCoinToContract(uint amount)public{
        //必须调用token当中的approve先,授权给本合约总共允许挪动多少资金,否则直接调用transferFrom的话肯定会报错的。
        //委任第三方转账的话,必须使用transferFrom
        //以下是把自己的户口当中资金打入合约内
        MyToken.transferFrom(msg.sender,address(this),amount);
    }

    function checkBalance(address _addr)public view returns(uint){
        //查看本合约内有多少的代币
        return MyToken.balanceOf(_addr);
    }

    function checkRemainingApproveBalance() public view returns(uint){
        //查看本身的户口,允许第三方挪动的自己还剩下多少
        return MyToken.allowance(msg.sender,address(this));
    }
}

注意:让合约帮你转账去到本合约内,还是帮你转账给其他地址都必须授权给本合约先,否则合约无权帮你调动资金。换言之也就是你必须调用approve然后才能调用transferFrom

【approve】
– 调用代币中的approve就是,授权某合约能够帮你挪动多少资金。
这function无法在代币合约中调用,因为安全需要,所以必须调用回代币当中的approve function。
approve( 合约地址,挪动的资金额 )

【allowance】
– 这function主要是查看你所授权的合约,还剩下多少资金能够挪动。
如果你一开始总共approve了500个代币,然后你transfer了100代币,那查看这个function应该是返回剩下400个代币能够挪动而已。
allowance(你的户口地址,合约地址)

Loading

Facebook评论