如何將乙太幣轉入 ERC20 代幣合約?
我有一個功能需要在滿足某些條件後向代幣智能合約和個人賬戶進行轉賬。
function completeSale() onlyOwner public { if (something == true && balance >= requested) { tokenContract.transfer(requested/100); seller.transfer(requested - (requested/100)); buyer.transfer(balance - requested); assert(address(this).balance == 0); complete = true; } }
但是,查看 ERC20 標準,transfer 是作為令牌方法實現的:
function transfer(address to, uint tokens) public returns (bool success) { balances[msg.sender] = balances[msg.sender].sub(tokens); balances[to] = balances[to].add(tokens); emit Transfer(msg.sender, to, tokens); return true; }
然後如何將乙太幣價值轉移到 ERC20 智能合約?如果不編寫另一個需要低級呼叫(即
tokenAddress.myPayMethod.value(x)
或tokenAddress.call.value(x)()
)的函式,這是否可能?
你一般不會那樣做。這是一個關注點分離的問題。
OP沒有確切說明最終目標是什麼。一個常見的場景是代幣合約和眾籌合約。讓每個人各司其職,不要混淆關注點。
ERC20 合約的工作是跟踪使用餘額並促進轉賬。就是這樣。除此之外的任何事情都超出了鑄幣/供應和基本會計的關注。
CrowdSale 通常會以某個(業務規則)價格出售一些代幣。這個“商店”“庫存”了商品(代幣),它出售,可能購買以換取 ETH。因此,它具有接受乙太幣和轉移其擁有的代幣的簡單功能,並且可能具有兌換代幣的方法。它與錢包無關。ERC20“鑄幣者”或“部署者”通常會收到初始供應並可以安全地儲存代幣,並在代幣出售時定期“補貨”商店。
如果將代幣合約與人們可能想要使用它的任何活動分開考慮,事情就會變得簡單得多。
希望能幫助到你。
這兩個函式有不同的簽名。轉移ETH的函式是
function transfer(uint _value) public;
而傳輸代幣的有兩個參數
function transfer(address _to, uint _amount) public;
你可以同時使用它們。只需提供不同的參數。
查看下面的程式碼,它完全實現了您想要做的事情。您可以將其複製到 Remix 並進行測試。創建兩個 ERC20Test 合約實例並將一些餘額(ETH)轉移到其中一個。然後你可以從有一些乙太幣的合約中呼叫 transferETHToERC20 來將它轉移到另一個 ERC20Test 合約。
您也可以呼叫 transferTokentoERC20 來轉移代幣。只需確保呼叫另一個 ERC20Test 合約的 transferTokentoERC20 函式的 ERC20Test 合約有一定的代幣餘額。
**警告 !**該契約並非 100% 安全。它不能確保不會有 uint 溢出。它只是為了回答這個問題而編寫的,並且只實現了必要的 ERC20 功能。
pragma solidity 0.4.24; contract ERC20Test { mapping(address => uint256) balances; uint256 totalSupply_ = 100; event Transfer(address from, address to, uint256 value); function () payable { return; } function transferETHToERC20(ERC20Test token, uint256 value) public { token.transfer(value); //this is going to transfer ETH.Only one parameter is provided } function transferTokentoERC20(ERC20Test token,address _to, uint amount) public { token.transfer(_to,amount); //this will transfer tokens.two parameters } function returnBalance() public view returns (uint256) { return this.balance; } function totalSupply() public view returns (uint256) { return totalSupply_; } constructor () { balances[msg.sender] = totalSupply_; } function transfer(address _to, uint256 _value) public returns (bool) { require(_to != address(0)); require(_value <= balances[msg.sender]); balances[msg.sender] = balances[msg.sender]- _value; balances[_to] = balances[_to] + _value; emit Transfer(msg.sender, _to, _value); return true; } function balanceOf(address _owner) public view returns (uint256) { return balances[_owner]; } }