@@ -77,37 +77,63 @@ abstract contract GovernorCompatibilityBravo is IGovernorTimelock, IGovernorComp
77
77
* @dev See {IGovernorCompatibilityBravo-queue}.
78
78
*/
79
79
function queue (uint256 proposalId ) public virtual override {
80
- ProposalDetails storage details = _proposalDetails[proposalId];
81
- queue (
82
- details.targets,
83
- details.values,
84
- _encodeCalldata (details.signatures, details.calldatas),
85
- details.descriptionHash
86
- );
80
+ (
81
+ address [] memory targets ,
82
+ uint256 [] memory values ,
83
+ bytes [] memory calldatas ,
84
+ bytes32 descriptionHash
85
+ ) = _getProposalParameters (proposalId);
86
+
87
+ queue (targets, values, calldatas, descriptionHash);
87
88
}
88
89
89
90
/**
90
91
* @dev See {IGovernorCompatibilityBravo-execute}.
91
92
*/
92
93
function execute (uint256 proposalId ) public payable virtual override {
93
- ProposalDetails storage details = _proposalDetails[proposalId];
94
- execute (
95
- details.targets,
96
- details.values,
97
- _encodeCalldata (details.signatures, details.calldatas),
98
- details.descriptionHash
99
- );
94
+ (
95
+ address [] memory targets ,
96
+ uint256 [] memory values ,
97
+ bytes [] memory calldatas ,
98
+ bytes32 descriptionHash
99
+ ) = _getProposalParameters (proposalId);
100
+
101
+ execute (targets, values, calldatas, descriptionHash);
100
102
}
101
103
102
- function cancel (uint256 proposalId ) public virtual override (IGovernor, Governor) {
104
+ /**
105
+ * @dev Cancel a proposal with GovernorBravo logic.
106
+ */
107
+ function cancel (uint256 proposalId ) public virtual {
108
+ (
109
+ address [] memory targets ,
110
+ uint256 [] memory values ,
111
+ bytes [] memory calldatas ,
112
+ bytes32 descriptionHash
113
+ ) = _getProposalParameters (proposalId);
114
+
115
+ cancel (targets, values, calldatas, descriptionHash);
116
+ }
117
+
118
+ /**
119
+ * @dev Cancel a proposal with GovernorBravo logic. At any moment a proposal can be cancelled, either by the
120
+ * proposer, or by third parties if the proposer's voting power has dropped below the proposal threshold.
121
+ */
122
+ function cancel (
123
+ address [] memory targets ,
124
+ uint256 [] memory values ,
125
+ bytes [] memory calldatas ,
126
+ bytes32 descriptionHash
127
+ ) public virtual override (IGovernor, Governor) returns (uint256 ) {
128
+ uint256 proposalId = hashProposal (targets, values, calldatas, descriptionHash);
103
129
address proposer = _proposalDetails[proposalId].proposer;
104
130
105
131
require (
106
132
_msgSender () == proposer || getVotes (proposer, clock () - 1 ) < proposalThreshold (),
107
133
"GovernorBravo: proposer above threshold "
108
134
);
109
135
110
- _cancel (proposalId );
136
+ return _cancel (targets, values, calldatas, descriptionHash );
111
137
}
112
138
113
139
/**
@@ -128,6 +154,25 @@ abstract contract GovernorCompatibilityBravo is IGovernorTimelock, IGovernorComp
128
154
return fullcalldatas;
129
155
}
130
156
157
+ /**
158
+ * @dev Retrieve proposal parameters by id, with fully encoded calldatas.
159
+ */
160
+ function _getProposalParameters (
161
+ uint256 proposalId
162
+ )
163
+ private
164
+ view
165
+ returns (address [] memory targets , uint256 [] memory values , bytes [] memory calldatas , bytes32 descriptionHash )
166
+ {
167
+ ProposalDetails storage details = _proposalDetails[proposalId];
168
+ return (
169
+ details.targets,
170
+ details.values,
171
+ _encodeCalldata (details.signatures, details.calldatas),
172
+ details.descriptionHash
173
+ );
174
+ }
175
+
131
176
/**
132
177
* @dev Store proposal metadata for later lookup
133
178
*/
0 commit comments