Solidity

如何與ERC20介面互動?

  • April 28, 2019

我的目標是從 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.

引用自:https://ethereum.stackexchange.com/questions/70155