Skip to content

Commit daa0587

Browse files
committed
review comments
1 parent d7a3a96 commit daa0587

File tree

2 files changed

+31
-9
lines changed

2 files changed

+31
-9
lines changed

src/Governor.sol

+26-9
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,8 @@ contract Governor is EIP712 {
229229
* @dev Values sent to the contracts are sent by the Timelock contract
230230
*/
231231
//@audit vlad. почему это payable?
232+
// @comment maks. если в пропоузал есть транзакция с переводом эфира. честно не тестил, интуитивно так подумал
233+
// @comment сейчас подумал, что даже если так, то высылать эфир будет Timelock, а не Governor
232234
function execute(uint256 proposalId) external payable {
233235
if (state(proposalId) != ProposalState.Queued) {
234236
revert Governor__ProposalIsNotQueued();
@@ -307,13 +309,17 @@ contract Governor is EIP712 {
307309
* @dev Maybe add address voter to Ballot struct and check if signer == voter
308310
*/
309311
function castVoteBySig(uint256 proposalId, bool support, uint8 v, bytes32 r, bytes32 s) external {
310-
//@audit vlad. Не, шанс коллизии слишком маленький. Из-за парадокса дней рождений шанс 1 коллизии 50% за 2^80 попыток
311-
// По фану можешь посмотреть с какой скоростью твой ноут печатает числа в цикле
312-
// При этом коллизия любых адресов, а делегаты 1 токена это супер мало адресов. Потом скину дискуссию по этому поводу (сейчас инета нету)
312+
//@audit vlad. Не, шанс коллизии слишком маленький. Из-за парадокса дней рождений шанс 1 коллизии 50% за 2^80 попыток
313+
// По фану можешь посмотреть с какой скоростью твой ноут печатает числа в цикле
314+
// При этом коллизия любых адресов, а делегаты 1 токена это супер мало адресов. Потом скину дискуссию по этому поводу (сейчас инета нету)
315+
316+
// @comment maks. когда пишу код с подписями, моё натуральное желание это впихнуть в подпись как можно больше вещей.
317+
// тут я подумал об этом, но не смог сузить вот так границу как ты.
318+
313319
// any checks at all? can it cast a random persons vote in case of random signature spam? sounds like i am not really understading something, missing out
314-
// возможно ли в теории наспамить в эту функицю кучу подписей, с идеей что хоть одна попадется,
315-
// в который я угадаю параметры proposalId и support и при этом signer это участник DAO и он делегировал токены,
316-
//чтобы его голос засчитался? трудно наверно но мозг мой вот так подумал
320+
// возможно ли в теории наспамить в эту функицю кучу подписей, с идеей что хоть одна попадется,
321+
// в который я угадаю параметры proposalId и support и при этом signer это участник DAO и он делегировал токены,
322+
// чтобы его голос засчитался? трудно наверно но мозг мой вот так подумал
317323
// add address voter to the signature and the check signer == voter?
318324
bytes32 structHash = keccak256(abi.encode(BALLOT_TYPEHASH, proposalId, support));
319325
bytes32 digest = _hashTypedDataV4(structHash);
@@ -386,9 +392,18 @@ contract Governor is EIP712 {
386392
) internal {
387393
bytes32 txHash = keccak256(abi.encode(proposalId, target, value, signature, data, eta));
388394

389-
//@audit vlad. С комментарием согласен
390-
// Также хочу заметить, что в нынешнем дизайне proposal не сможет содержать 2 одинаковых действия
391-
// То есть у них будут одинаковые параметры и одинаковый хэш. Вроде бы у Compaund это свойство есть тоже
395+
//@audit vlad. С комментарием согласен
396+
// Также хочу заметить, что в нынешнем дизайне proposal не сможет содержать 2 одинаковых действия
397+
// То есть у них будут одинаковые параметры и одинаковый хэш. Вроде бы у Compaund это свойство есть тоже
398+
399+
// @comment maks. то, что нельзя вручную в очередь поставить транзакцию это да, поэтому тут чек отлетает
400+
// "что в нынешнем дизайне proposal не сможет содержать 2 одинаковых действия" - не думал так об этом.
401+
// по сути строка 393 одинаковый бы txHash посчитала, но тогда как раз нужен этот чек?
402+
// вижу тут это так - ситуация если этот чек убрать. queue() в своем for цикле поставит в очередь 2 транзакции,
403+
// но по итогу в mappinge queuedTransactions будет только одна. при execution пропоузала execute() вызовет executeTransaction() на эти две одинаковые,
404+
// и по идее Timelock ревертнет на линии 103, так как транзакция уже не в очереди, а txHash у второй такой транзакции такой же как у первой
405+
// по сути наебнется весь пропоузал?
406+
392407
// may be unnecessary check, because there is no way to manually queue a transaction in the timelock contract
393408
// as a check for collision, it's really unlikely since txHash includes proposalId and proposal.eta
394409
if (i_timelock.queuedTransactions(txHash)) {
@@ -444,6 +459,7 @@ contract Governor is EIP712 {
444459
function _checkProposalMeetsQuorum(uint256 proposalId) internal view returns (bool) {
445460
Proposal storage proposal = proposals[proposalId];
446461
//@audit vlad. Precision loss не будет, ну или он слишком малый
462+
// @comment maks. мало у меня уверенности в solidity math
447463
uint256 quorumAmount = (i_token.getPastTotalSupply(proposal.startBlock - 1)) * quorumVotes() / 100; // precision loss?
448464

449465
if (proposal.forVotes + proposal.againstVotes >= quorumAmount) {
@@ -495,6 +511,7 @@ contract Governor is EIP712 {
495511
* @return uint256 The threshold of votes needed to propose
496512
*/
497513
//@audit vlad. Не учитывает что токен имеет 18 decimals, считай proposalThreshold и нету
514+
// @comment maks. так же не уверен в использовании decimals
498515
function proposalThreshold() public pure returns (uint256) {
499516
return 1000;
500517
}

src/Timelock.sol

+5
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ contract Timelock is ITimelock, Ownable {
105105
}
106106

107107
//@note можно запустить только в период [eta; GRACE_PERIOD]
108+
// @comment maks. имеешь в виду [eta; eta + GRACE_PERIOD], и разве не ) в конце?
108109
if (block.timestamp < eta) {
109110
revert Timelock__DelayHasNotPassed();
110111
} else if (block.timestamp >= eta + GRACE_PERIOD) {
@@ -124,6 +125,10 @@ contract Timelock is ITimelock, Ownable {
124125
// Сейчас оффлайн, поэтому не приведу примеры issues из репортов
125126
// Это было в Moonwell на C4, JOJO на Sherlock и ещё пару раз
126127
// Но это распространённая ошибка, забывают `payable receive()` добавить
128+
129+
// @comment maks. тру. так же не уверен с этими receive() и fallback() функции
130+
// технически, сейчас Timelock не может иметь эфир, потому что его сюда нельзя прислать?
131+
// это можно было бы заэксплоитить?
127132
(bool success,) = target.call{value: value}(callData);
128133
if (!success) {
129134
revert Timelock__TransactionExecutionReverted();

0 commit comments

Comments
 (0)