2
2
"""
3
3
@title XYZ Broadcaster
4
4
@author CurveFi
5
+ @license MIT
6
+ @custom:version 0.0.2
7
+ @custom:security [email protected]
5
8
"""
6
9
10
+ version: public (constant (String[8 ])) = "0.0.2 "
7
11
8
12
event Broadcast:
9
- agent: Agent
10
- chain_id: uint256
13
+ agent: indexed ( Agent)
14
+ chain_id: indexed ( uint256 )
11
15
nonce: uint256
12
16
digest: bytes32
17
+ deadline: uint256
13
18
14
19
event ApplyAdmins:
15
20
admins: AdminSet
@@ -37,6 +42,8 @@ struct Message:
37
42
MAX_BYTES: constant (uint256 ) = 1024
38
43
MAX_MESSAGES: constant (uint256 ) = 8
39
44
45
+ DAY: constant (uint256 ) = 86400
46
+ WEEK: constant (uint256 ) = 7 * DAY
40
47
41
48
admins: public (AdminSet)
42
49
future_admins: public (AdminSet)
@@ -45,6 +52,7 @@ agent: HashMap[address, Agent]
45
52
46
53
nonce: public (HashMap[Agent, HashMap[uint256 , uint256 ]]) # agent -> chainId -> nonce
47
54
digest: public (HashMap[Agent, HashMap[uint256 , HashMap[uint256 , bytes32 ]]]) # agent -> chainId -> nonce -> messageDigest
55
+ deadline: public (HashMap[Agent, HashMap[uint256 , HashMap[uint256 , uint256 ]]]) # agent -> chainId -> nonce -> deadline
48
56
49
57
50
58
@external
@@ -62,23 +70,41 @@ def __init__(_admins: AdminSet):
62
70
log ApplyAdmins (_admins)
63
71
64
72
73
+ @internal
74
+ @pure
75
+ def _get_ttl (agent: Agent, ttl: uint256 ) -> uint256 :
76
+ if agent == Agent.EMERGENCY:
77
+ # Emergency votes should be brisk
78
+ if ttl == 0 :
79
+ ttl = DAY # default
80
+ assert ttl <= WEEK
81
+ else :
82
+ if ttl == 0 :
83
+ ttl = WEEK # default
84
+ assert DAY <= ttl and ttl <= 3 * WEEK
85
+ return ttl
86
+
87
+
65
88
@external
66
- def broadcast (_chain_id: uint256 , _messages: DynArray[Message, MAX_MESSAGES]):
89
+ def broadcast (_chain_id: uint256 , _messages: DynArray[Message, MAX_MESSAGES], _ttl: uint256 = 0 ):
67
90
"""
68
- @notice Broadcast a sequence of messeages .
91
+ @notice Broadcast a sequence of messages .
69
92
@param _chain_id The chain id to have messages executed on.
70
93
@param _messages The sequence of messages to broadcast.
94
+ @param _ttl Time-to-leave for message if it's not executed. 0 will use default values.
71
95
"""
72
96
agent: Agent = self .agent[msg .sender ]
73
- assert agent != empty (Agent)
97
+ assert agent != empty (Agent) and len (_messages) > 0
98
+ ttl: uint256 = self ._get_ttl (agent, _ttl)
74
99
75
100
digest: bytes32 = keccak256 (_abi_encode (_messages))
76
101
nonce: uint256 = self .nonce[agent][_chain_id]
77
102
78
103
self .digest[agent][_chain_id][nonce] = digest
79
104
self .nonce[agent][_chain_id] = nonce + 1
105
+ self .deadline[agent][_chain_id][nonce] = block .timestamp + ttl
80
106
81
- log Broadcast (agent, _chain_id, nonce, digest)
107
+ log Broadcast (agent, _chain_id, nonce, digest, block . timestamp + ttl )
82
108
83
109
84
110
@external
0 commit comments