Solidity
如何從另一個智能合約呼叫乙太坊中部署的智能合約的功能?
我在特定地址(例如 0xABC)部署了一個智能合約。該合約是 ERC20 代幣(比如 ABC 代幣)智能合約。該契約於 2017 年 11 月部署。
現在我想要另一個可以充當託管的智能合約,它可以持有 ABC 代幣,直到滿足特定條件。該合約尚未部署。
那麼,Escrow 合約如何接受****ABC 代幣,並在滿足條件後將ABC 代幣****釋放給有效使用者呢?我想從 Escrow 合約中呼叫 ABC 代幣合約的 .transfer() 方法,從 Escrow 中獲取和釋放資金。
注意:這兩個智能合約部署在不同的地址,因為它們部署在不同的時間。
像這樣的東西應該工作
contract Escrow { ERC20 token = ERC20(0xABCDEF....); event Deposit(address sender, uint amount); event Withdraw(address sender, uint amount); mapping (address => uint) deposits; // The user should approve the contract to retrieve tokens function deposit(uint amount) public { // Accept tokens in deposit token.transferFrom(msg.sender, amount); deposits[msg.sender] += amount; emit Deposit(msg.sender, amount); } function withdraw(uint amount) public { // Cannot withdraw more tokens than deposited require(deposits[msg.sender] >= amount); // Verify condition enable withdraw if (condition) { // Transfer tokens to sender deposits[msg.sender] -= amount; token.transfer(msg.sender, amount); emit Withdraw(msg.sender, amount); } else { revert(); } } }
使用者必須批准您的契約,才能使用 transferFrom 轉移代幣。在javascript中是這樣
ERC20Token.approve(Escrow.addrss, amount, { from: "0xTokenOwnerAddress" })
的,然後呼叫Escrow進行存款EscrowContract.deposit(amount, { from: "0xTokenOwnerAddress"})
。