-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtrc100_locktoken.sol
More file actions
98 lines (91 loc) · 3.17 KB
/
trc100_locktoken.sol
File metadata and controls
98 lines (91 loc) · 3.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract trc100_locktoken{
address public InitSender;
address public trc100_addr;
struct MapPos{
uint pos;
bool isVaild;
}
struct Token{
address addr;
uint256 begin;
uint256 nums;
uint256 ldays;
uint256 ltype;
}
Token[] tokens;
mapping(address => MapPos) tokenPosMap; //地址位置映射
constructor(){
InitSender=msg.sender;
trc100_addr=msg.sender;
}
function SetTrc100Addr(address addr)public returns(address){
if(msg.sender!=trc100_addr)return trc100_addr;
trc100_addr=addr;
return trc100_addr;
}
function trc100Addr()public view returns (address){
return trc100_addr;
}
/*
锁定平台代币
可以自愿锁定一定数量的平台代币,在一定时间内线性释放或到期一次性释放
该接口只有地址本人提交才有效
begin:启始日期
nums:代币数量
days:锁定天数
type:(逐天释放、到期释放)
*/
function lockToken(address sender,uint256 begin,uint256 nums,uint256 _days, uint256 _type)public returns (bool,uint256){
if (trc100_addr!=InitSender){
require(trc100_addr == msg.sender, "lockToken Forbidden trc100_addr!=InitSender");
}
require(!tokenPosMap[sender].isVaild, "lockToken Forbidden isVaild");
tokens.push(Token(sender,begin,nums,_days,_type));
tokenPosMap[sender].pos=tokens.length-1;
tokenPosMap[sender].isVaild=true;
return (true,0);
}
/*
查询平台代币锁定信息
*/
function lockTokenInfo()public view returns (bool success,address[] memory addrs,uint256[] memory begin,uint256[] memory nums,uint256[] memory _days, uint256[] memory _type){
uint size=tokens.length;
uint[] memory ret_begin=new uint[](size);
uint[] memory ret_nums=new uint[](size);
uint[] memory ret_days=new uint[](size);
uint256[] memory ret_type=new uint256[](size);
address[] memory ret_addrs=new address[](size);
uint i=0;
for(i=0;i<tokens.length;i++){
ret_begin[i]=tokens[i].begin;
ret_nums[i]=tokens[i].nums;
ret_days[i]=tokens[i].ldays;
ret_type[i]=tokens[i].ltype;
ret_addrs[i]=tokens[i].addr;
}
return (true,ret_addrs,ret_begin,ret_nums,ret_days,ret_type);
}
/*
解除锁定
*/
function unlockToken(address sender)public returns(bool,uint256){
require(trc100_addr == msg.sender, "unlockToken Forbidden trc100_addr!=InitSender");
MapPos storage item=tokenPosMap[sender];
if(!item.isVaild){
return (false,4);
}
uint tv=tokens[item.pos].begin+tokens[item.pos].ldays*24*3600;
if(tv<block.timestamp){
return (false,5);
}
if(item.pos!=(tokens.length-1)){
tokens[item.pos]=tokens[tokens.length-1];
tokenPosMap[tokens[item.pos].addr].pos=item.pos;
}
tokens.pop();
delete tokenPosMap[sender];
return (true,0);
}
}