Solidity

智能合約能否在觸發時將其擁有的 ERC20 代幣發送到另一個地址?

  • March 27, 2018

我知道智能合約地址可以接受發送給它的 ERC20 代幣。

假設有兩個智能合約 A 和 B。A 是實現 ERC20 代幣的已部署智能合約,B 是我要編寫的合約。

我想知道我是否可以在合約 B 中編寫一個方法,以便在通過發送交易呼叫其方法觸發時,將合約 B 地址擁有的一定數量的 A 代幣發送到我指定的另一個地址?

一個後續問題:在手動交易中,發送者必須簽署原始 ERC20 代幣交易並將其發送到網路。對於智能合約B,是不是只要呼叫目標ERC20智能合約A的方法就可以使用B地址擁有的代幣?是否需要任何步驟來“簽署”轉移?

謝謝你。

**1)**取決於您對“觸發器”的含義。如果沒有某人/某物向他們發出交易,智能合約永遠無法做任何事情。因此,合約不能自行“監控”事物,也不能在這種意義上在後台執行。否則,是的,智能合約可以將代幣轉移到另一個合約/地址。

**2)**因為所有的動作都是通過一筆交易發起的,所以最初的交易發送者就是“簽名者”。發出原始交易的人還必須為可能的契約鏈中發生的所有交易支付(使用gas)。

編輯 詢問者添加了有關該問題的更多資訊後:

通過呼叫transferERC20 代幣合約中的方法將代幣發送到另一個地址。該方法實際上應該只是修改合約 A 的內部狀態,因此從合約 B 轉移代幣只需要 B 呼叫 A 的transfer函式。B 本身不需要“發送”任何代幣——它只需要呼叫transfer函式來更改所述代幣的所有權。

關於你的第一個問題:是的。 合約 B需要知道合約 A的方法如何表現(至少,您需要使用的方法),因此使用抽象合約(下面程式碼的介面部分)。由於通常需要更新合約中的儲存,但如果您不需要它,您可以刪除該部分,您需要先檢索您的合約擁有的代幣數量,因為它無法通過魔法知道它有多少代幣有,對吧?它必須呼叫balanceOf代幣合約的方法。transfer完成後,您可以使用方法將您想要的金額發送到您想要的地址

interface ERC20 {
 function transfer(address _to, uint256 _value) public returns (bool success);
 function balanceOf(address _owner) public constant returns (uint256 balance);
}

function get_all_tokens(address token_address, uint256 amount) {
 ERC20 token = ERC20(token_address);
 uint256 contract_token_balance = token.balanceOf(address(this));
 require(contract_token_balance != 0);
 //Eventually do some updates of balances in your contract
 require(token.transfer(msg.sender, amount));
}

現在,您可以根據需要對其進行調整,您的想像力是您唯一的限制。:)

對於第二個問題,我相信它已經得到了回答(高於或低於我的答案)。

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