首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >时间锁定与智能合同归属

时间锁定与智能合同归属
EN

Ethereum用户
提问于 2018-11-11 17:57:57
回答 1查看 9.4K关注 0票数 4

我想创建一个智能合同,它将负责锁定和/或将资金归属给几个受益人(由smart合同的所有者输入)。它将归属和锁定的资金需要来自另一个象征性的智能合约。这可能吗?我的问题是,如何从ERC20令牌智能契约获得资金到我的归属/锁定智能契约,以便它能够根据某些既定规则操作资金。

非常感谢<3

EN

回答 1

Ethereum用户

回答已采纳

发布于 2018-11-11 19:00:37

是的,你能做到的。它将过于复杂,无法显示完整的实现,因此,我假设您了解ERC20合同的实现方式。

通常,当部署ERC20时,初始供应将被“造作”给部署者。下一步是将一些令牌传输到时间锁定契约。锁时合同只需持有特定地址的余额,直到某个时间或块号已过为止,然后允许索赔人的地址撤回。

这是一个非常快速和未经测试的涂鸦给你一些想法。从openzeppelin: ERC20接口开始:https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/token/ERC20/IERC20.sol

代码语言:javascript
复制
pragma solidity ^0.4.24;

/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
interface IERC20 {
  function totalSupply() external view returns (uint256);

  function balanceOf(address who) external view returns (uint256);

  function allowance(address owner, address spender)
    external view returns (uint256);

  function transfer(address to, uint256 value) external returns (bool);

  function approve(address spender, uint256 value)
    external returns (bool);

  function transferFrom(address from, address to, uint256 value)
    external returns (bool);

  event Transfer(
    address indexed from,
    address indexed to,
    uint256 value
  );

  event Approval(
    address indexed owner,
    address indexed spender,
    uint256 value
  );
}

然后,使用上面定义的ERC20接口继续执行时间锁定协议.

我们将使编号lockBoxes。用户必须指定包含其资金的框号。这很容易通过查看事件日志来发现。编号框意味着合同可以很容易地处理一个地址的多个批次,有不同的金额和截止日期。

如果您以前还没有见过它,存款函数将使用transferFrom。这假定用户首先签署了一个approve,授权该合同帮助自己获得一定数量的资金。通常是由客户来协调的。然后,客户端将approve(addressTimeLock, uintAmount)发送到令牌契约,然后将deposit(addressBeneficiary, uintAmount, uintDeadline)发送到timeLock合同。

代码语言:javascript
复制
contract TimeLock {
    IERC20 token;

    struct LockBoxStruct {
        address beneficiary;
        uint balance;
        uint releaseTime;
    }

    LockBoxStruct[] public lockBoxStructs; // This could be a mapping by address, but these numbered lockBoxes support possibility of multiple tranches per address

    event LogLockBoxDeposit(address sender, uint amount, uint releaseTime);   
    event LogLockBoxWithdrawal(address receiver, uint amount);

    constructor(address tokenContract) public {
        token = IERC20(tokenContract);
    }

    function deposit(address beneficiary, uint amount, uint releaseTime) public returns(bool success) {
        require(token.transferFrom(msg.sender, address(this), amount));
        LockBoxStruct memory l;
        l.beneficiary = beneficiary;
        l.balance = amount;
        l.releaseTime = releaseTime;
        lockBoxStructs.push(l);
        emit LogLockBoxDeposit(msg.sender, amount, releaseTime);
        return true;
    }

    function withdraw(uint lockBoxNumber) public returns(bool success) {
        LockBoxStruct storage l = lockBoxStructs[lockBoxNumber];
        require(l.beneficiary == msg.sender);
        require(l.releaseTime <= now);
        uint amount = l.balance;
        l.balance = 0;
        emit LogLockBoxWithdrawal(msg.sender, amount);
        require(token.transfer(msg.sender, amount));
        return true;
    }    

}

没有owner的概念,也没有办法在受益人无法签署交易的情况下,当索赔存放在本合同中的令牌时,也无法恢复令牌。输入验证可以加强,但我想保持它尽可能短,以明确。

希望能帮上忙。

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

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

复制
相关文章

相似问题

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