智能合約能否在觸發時將其擁有的 ERC20 代幣發送到另一個地址?
我知道智能合約地址可以接受發送給它的 ERC20 代幣。
假設有兩個智能合約 A 和 B。A 是實現 ERC20 代幣的已部署智能合約,B 是我要編寫的合約。
我想知道我是否可以在合約 B 中編寫一個方法,以便在通過發送交易呼叫其方法觸發時,將合約 B 地址擁有的一定數量的 A 代幣發送到我指定的另一個地址?
一個後續問題:在手動交易中,發送者必須簽署原始 ERC20 代幣交易並將其發送到網路。對於智能合約B,是不是只要呼叫目標ERC20智能合約A的方法就可以使用B地址擁有的代幣?是否需要任何步驟來“簽署”轉移?
謝謝你。
**1)**取決於您對“觸發器”的含義。如果沒有某人/某物向他們發出交易,智能合約永遠無法做任何事情。因此,合約不能自行“監控”事物,也不能在這種意義上在後台執行。否則,是的,智能合約可以將代幣轉移到另一個合約/地址。
**2)**因為所有的動作都是通過一筆交易發起的,所以最初的交易發送者就是“簽名者”。發出原始交易的人還必須為可能的契約鏈中發生的所有交易支付(使用gas)。
編輯 詢問者添加了有關該問題的更多資訊後:
通過呼叫
transfer
ERC20 代幣合約中的方法將代幣發送到另一個地址。該方法實際上應該只是修改合約 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)); }
現在,您可以根據需要對其進行調整,您的想像力是您唯一的限制。:)
對於第二個問題,我相信它已經得到了回答(高於或低於我的答案)。