Solidity
如何與ERC20介面互動?
我的目標是從 ERC20Wrapper.sol 部署的合約 BAT 代幣發送到我的硬編碼地址。
我創建了 ERC20 介面:
pragma solidity 0.4.18; interface 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); }
然後我添加了 ERC20Wrapper.sol:
pragma solidity ^0.4.18; import "./ERC20Interface.sol"; contract ERC20Wrapper { ERC20 constant internal BAT_TOKEN_ADDRESS = ERC20(0xDb0040451F373949A4Be60dcd7b6B8D6E42658B6); address myAddress = address(0xAD53363200C71751FA325ED7bE483722256C3501); function BATSend(uint tokenAmount) public payable{ ERC20(BAT_TOKEN_ADDRESS).transfer(myAddress,tokenAmount); } }
然後我實例化 ERC20Wrapper.sol 並在 Remix 上獲取它的地址,將 200 個 BAT 代幣發送到新創建的合約地址,並嘗試通過在 ERC20 介面上呼叫 transfer 與 BATSend 進行互動,並在 tokenAmount 參數中輸入 20。
預期的輸出,我的賬戶將有 +=tokenAmount 並且它沒有發生,tx 被確認並且賬戶金額沒有改變。
首先,正如@goodvibration 所指出的,您不需要重新
BAT_TOKEN_ADDRESS
轉換為 ERC20 介面,因為您在分配其值時已經這樣做了。其次,您的
BATSend
函式應該檢查令牌轉移是否成功,因為transfer
返回一個布爾值(如果轉移成功,則為 true,否則為 false),如下所示:function BATSend(uint tokenAmount) public payable{ require(ERC20(BAT_TOKEN_ADDRESS).transfer(myAddress,tokenAmount)); }
現在,關於你的餘額沒有增加,可能是因為你的合約餘額是空的,或者低於你試圖轉移的代幣數量。
每當您轉移代幣時,您都應該知道 ERC20 使用了多少位小數。在您的情況下,BAT 使用 18 位小數,因此您應該將要發送的代幣數量乘以
1e18
.