使用 ERC20 Token 的方式实现 LXP,设计思路如下:
Token Contract 可能需要是一个可升级合约(因为尚有类似如何回购/销毁的逻辑无法最终确定)。合约接口如下:
interface LXP {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
// grant mint role for minter to mint value LXP
event GrantMint(address indexed minter, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
// restricted transfer, only allowed to transfer to some specific addresses
function transfer(address to, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
// allow minter to mint value LXP at most. Can only be called by admin role.
// emits a GrantMint event
function grantMint(address minter, uint256 value);
// mint value LXP to address. Can only be called by someone has the grant to mint, will decrease the allowance of mint after this call.
function mint(address address, uint256 value);
// mintBatch, emits a Transfer event for each mint
function mintBatch(address[] addresses, uint256[] value);
// 销毁 LXP 到 adress(0)
function burn(uint256 value);
}
主要在以下方面区别于普通的 ERC20 token:
- 限制转移条件,只允许一些特定场景下的流通
- 通过 grantMint 赋予某个地址 mint 一定数量 LXP 的权限,后续此地址可以进行 LXP 的分发
对照到 LXDao 的工作流程中,使用流程如下:
- LXDao 多签地址部署合约
- idea 立项之后,LXDao 通过表决,确定项目的 LXP 额度后,由 LXDao 多签地址调用 grantMint() 给予项目负责人钱包地址对应额度的 mint 权限
- 项目负责人自己进行分配控制(时间,分配比例),这些都不在需要 LXDao 的参与。