我想创建一个智能合同,它将负责锁定和/或将资金归属给几个受益人(由smart合同的所有者输入)。它将归属和锁定的资金需要来自另一个象征性的智能合约。这可能吗?我的问题是,如何从ERC20令牌智能契约获得资金到我的归属/锁定智能契约,以便它能够根据某些既定规则操作资金。
非常感谢<3
发布于 2018-11-11 19:00:37
是的,你能做到的。它将过于复杂,无法显示完整的实现,因此,我假设您了解ERC20合同的实现方式。
通常,当部署ERC20时,初始供应将被“造作”给部署者。下一步是将一些令牌传输到时间锁定契约。锁时合同只需持有特定地址的余额,直到某个时间或块号已过为止,然后允许索赔人的地址撤回。
这是一个非常快速和未经测试的涂鸦给你一些想法。从openzeppelin: ERC20接口开始:https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/token/ERC20/IERC20.sol
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合同。
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的概念,也没有办法在受益人无法签署交易的情况下,当索赔存放在本合同中的令牌时,也无法恢复令牌。输入验证可以加强,但我想保持它尽可能短,以明确。
希望能帮上忙。
https://ethereum.stackexchange.com/questions/62126
复制相似问题