首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从另一个智能契约中调用ethereum中已部署的智能契约的函数?

如何从另一个智能契约中调用ethereum中已部署的智能契约的函数?
EN

Ethereum用户
提问于 2018-04-19 12:46:29
回答 2查看 905关注 0票数 0

我有一个部署在特定地址(例如,0xABC)的智能契约。此合同是ERC20令牌(例如,ABC令牌)智能合同。本合同于2017年11月**部署。

现在,我希望有另一个智能合同,它可以充当托管,它可以持有ABC令牌,直到满足特定条件。这份合同还有待部署。

那么,托管合同如何能够接受ABC令牌并在满足条件后将ABC令牌释放给有效的用户?我想从代管合同中调用ABC令牌合同的.transfer()方法,从托管合同中获取和释放资金。

注意:这两个智能契约都部署在不同的地址,因为它们是在不同的时间部署的。

EN

回答 2

Ethereum用户

回答已采纳

发布于 2018-04-19 20:37:37

像这样的东西应该能起作用

代码语言:javascript
复制
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"})存款。

票数 0
EN

Ethereum用户

发布于 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,唯一的选择是要求用户首先将令牌发送到您的契约地址,然后在您的契约中执行锁定令牌的函数。

票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/46160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档