-
Notifications
You must be signed in to change notification settings - Fork 16
/
DelegationProxy.vy
117 lines (84 loc) · 2.95 KB
/
DelegationProxy.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
113
114
115
116
117
# @version 0.2.15
"""
@title Voting Escrow Delegation Proxy
@author Curve Finance
@license MIT
"""
from vyper.interfaces import ERC20
interface VeDelegation:
def adjusted_balance_of(_account: address) -> uint256: view
event CommitAdmins:
ownership_admin: address
emergency_admin: address
event ApplyAdmins:
ownership_admin: address
emergency_admin: address
event DelegationSet:
delegation: address
VOTING_ESCROW: constant(address) = 0x5f3b5DfEb7B28CDbD7FAba78963EE202a494e2A2
delegation: public(address)
emergency_admin: public(address)
ownership_admin: public(address)
future_emergency_admin: public(address)
future_ownership_admin: public(address)
@external
def __init__(_delegation: address, _o_admin: address, _e_admin: address):
self.delegation = _delegation
self.ownership_admin = _o_admin
self.emergency_admin = _e_admin
log DelegationSet(_delegation)
@view
@external
def adjusted_balance_of(_account: address) -> uint256:
"""
@notice Get the adjusted veCRV balance from the active boost delegation contract
@param _account The account to query the adjusted veCRV balance of
@return veCRV balance
"""
_delegation: address = self.delegation
if _delegation == ZERO_ADDRESS:
return ERC20(VOTING_ESCROW).balanceOf(_account)
return VeDelegation(_delegation).adjusted_balance_of(_account)
@external
def kill_delegation():
"""
@notice Set delegation contract to 0x00, disabling boost delegation
@dev Callable by the emergency admin in case of an issue with the delegation logic
"""
assert msg.sender in [self.ownership_admin, self.emergency_admin]
self.delegation = ZERO_ADDRESS
log DelegationSet(ZERO_ADDRESS)
@external
def set_delegation(_delegation: address):
"""
@notice Set the delegation contract
@dev Only callable by the ownership admin
@param _delegation `VotingEscrowDelegation` deployment address
"""
assert msg.sender == self.ownership_admin
# call `adjusted_balance_of` to make sure it works
VeDelegation(_delegation).adjusted_balance_of(msg.sender)
self.delegation = _delegation
log DelegationSet(_delegation)
@external
def commit_set_admins(_o_admin: address, _e_admin: address):
"""
@notice Set ownership admin to `_o_admin` and emergency admin to `_e_admin`
@param _o_admin Ownership admin
@param _e_admin Emergency admin
"""
assert msg.sender == self.ownership_admin, "Access denied"
self.future_ownership_admin = _o_admin
self.future_emergency_admin = _e_admin
log CommitAdmins(_o_admin, _e_admin)
@external
def apply_set_admins():
"""
@notice Apply the effects of `commit_set_admins`
"""
assert msg.sender == self.ownership_admin, "Access denied"
_o_admin: address = self.future_ownership_admin
_e_admin: address = self.future_emergency_admin
self.ownership_admin = _o_admin
self.emergency_admin = _e_admin
log ApplyAdmins(_o_admin, _e_admin)