我有一个部署在特定地址(例如,0xABC)的智能契约。此合同是ERC20令牌(例如,ABC令牌)智能合同。本合同于2017年11月**部署。
现在,我希望有另一个智能合同,它可以充当托管,它可以持有ABC令牌,直到满足特定条件。这份合同还有待部署。
那么,托管合同如何能够接受ABC令牌并在满足条件后将ABC令牌释放给有效的用户?我想从代管合同中调用ABC令牌合同的.transfer()方法,从托管合同中获取和释放资金。
注意:这两个智能契约都部署在不同的地址,因为它们是在不同的时间部署的。
发布于 2018-04-19 20:37:37
像这样的东西应该能起作用
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" }),然后调用代管进行EscrowContract.deposit(amount, { from: "0xTokenOwnerAddress"})存款。
发布于 2018-04-19 14:33:40
这是可以做到的。但是,如果用户使用transfer将令牌发送到托管契约,则将不会通知代管合同。您需要在approveAndCall令牌契约中使用ERC20 (假设已经实现)
approveAndCall将批准您的合同将令牌从用户移动到您的合同,然后您可以应用关于如何允许撤回令牌的逻辑。
为了能够使用ERC20令牌契约的函数,您需要在契约中创建一个ERC20TokenContract实例。
然后你就可以:
ERC20TokenContract myInstance = ERC20TokenContract('contractAddress')
这允许您执行如下操作:myInstance.transfer(to,value),其中transfer是ERC20TokenContract的一个函数。
您需要将令牌合同导入您的托管合同。在这里,我假设令牌契约名是ERC20TokenContract。
有关实现的详细信息,请看一下这个回答
注意,如果您的ERC20契约没有实现approveAndCall,唯一的选择是要求用户首先将令牌发送到您的契约地址,然后在您的契约中执行锁定令牌的函数。
https://ethereum.stackexchange.com/questions/46160
复制相似问题