-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathERC20Plus.vy
112 lines (92 loc) · 2.82 KB
/
ERC20Plus.vy
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# LP tokens (ERC20 plus mint/burn).
#=======================================================================
from vyper.interfaces import ERC20
from IERC20Plus import ERC20Plus
implements: ERC20
implements: ERC20Plus
#=======================================================================
name : public(String[64])
symbol : public(String[32])
decimals : public(uint256)
totalSupply: public(uint256)
OWNER : public(address) # set to core
@external
def __init__(
name : String[64],
symbol : String[32],
decimals : uint256):
self.name = name
self.symbol = symbol
self.decimals = decimals
self.totalSupply = 0
self.OWNER = msg.sender
@external
def set_owner(new_owner: address) -> bool:
assert msg.sender == self.OWNER, "ERR_PERMISSIONS"
self.OWNER = new_owner
return True
#=======================================================================
balanceOf: public(HashMap[address, uint256])
event Transfer:
_from : indexed(address)
_to : indexed(address)
_value: uint256
@external
def transfer(to: address, amt: uint256) -> bool:
_from: address = msg.sender
self.balanceOf[_from] -= amt
self.balanceOf[to] += amt
log Transfer(_from, to, amt)
return True
@external
def transferFrom(_from: address, to: address, amt: uint256) -> bool:
self.use(_from, amt)
self.balanceOf[_from] -= amt
self.balanceOf[to] += amt
log Transfer(_from, to, amt)
return True
#=======================================================================
allowance: public(HashMap[address, HashMap[address, uint256]])
event Approval:
_owner : indexed(address)
_spender : indexed(address)
_value : uint256
event Usage:
_user : indexed(address)
_delegate: indexed(address)
_value : uint256
@external
def approve(delegate: address, amt: uint256) -> bool:
user: address = msg.sender
self.allowance[user][delegate] = amt
log Approval(user, delegate, amt)
return True
# permission check via underflow
@internal
def use(user: address, amt: uint256) -> bool:
delegate: address = msg.sender
self.allowance[user][delegate] -= amt
log Usage(user, delegate, amt)
return True
#=======================================================================
event Mint:
_to : indexed(address)
_value: uint256
event Burn:
_from : indexed(address)
_value: uint256
@external
def mint(to: address, amt: uint256) -> bool:
assert msg.sender == self.OWNER, "ERR_PERMISSIONS"
self.totalSupply += amt
self.balanceOf[to] += amt
log Transfer(empty(address), to, amt)
return True
@external
def burn(_from: address, amt: uint256) -> bool:
assert msg.sender == self.OWNER, "ERR_PERMISSIONS"
self.totalSupply -= amt
self.balanceOf[_from] -= amt
log Transfer(_from, empty(address), amt)
return True
# eof