From 5dbfb21ed220fdfa6670e4a157e35e2b23425145 Mon Sep 17 00:00:00 2001 From: SITADRITA1 Date: Sun, 16 Mar 2025 21:45:14 +0100 Subject: [PATCH 1/3] Update ERC20BankExploitTest.sol --- contracts/tests/hacks/weth-permit/ERC20BankExploitTest.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/tests/hacks/weth-permit/ERC20BankExploitTest.sol b/contracts/tests/hacks/weth-permit/ERC20BankExploitTest.sol index df1ff090f..e9b86393d 100644 --- a/contracts/tests/hacks/weth-permit/ERC20BankExploitTest.sol +++ b/contracts/tests/hacks/weth-permit/ERC20BankExploitTest.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.26; +pragma solidity ^0.8.26; import {Test, console2} from "forge-std/Test.sol"; import {WETH} from "../../../src/hacks/weth-permit/WETH.sol"; From 91b516db55fb1da22db8958c1e7bd7a1379dc117 Mon Sep 17 00:00:00 2001 From: SITADRITA1 Date: Sun, 16 Mar 2025 21:57:42 +0100 Subject: [PATCH 2/3] Update AssemblyBinExp.sol --- .../app/assembly-bin-exp/AssemblyBinExp.sol | 38 +++++++------------ 1 file changed, 13 insertions(+), 25 deletions(-) diff --git a/contracts/src/app/assembly-bin-exp/AssemblyBinExp.sol b/contracts/src/app/assembly-bin-exp/AssemblyBinExp.sol index 164ca7123..89fdef92e 100644 --- a/contracts/src/app/assembly-bin-exp/AssemblyBinExp.sol +++ b/contracts/src/app/assembly-bin-exp/AssemblyBinExp.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.26; contract AssemblyBinExp { - // Binary exponentiation to calculate x**n function rpow(uint256 x, uint256 n, uint256 b) public pure @@ -10,44 +9,33 @@ contract AssemblyBinExp { { assembly { switch x - // x = 0 case 0 { switch n - // n = 0 --> x**n = 0**0 --> 1 - case 0 { z := b } - // n > 0 --> x**n = 0**n --> 0 - default { z := 0 } + case 0 { z := b } // 0**0 = 1 + default { revert(0, 0) } // 0**n (n > 0) має одразу ревертнутись } default { - switch mod(n, 2) - // x > 0 and n is even --> z = 1 - case 0 { z := b } - // x > 0 and n is odd --> z = x - default { z := x } - - let half := div(b, 2) // for rounding. - // n = n / 2, while n > 0, n = n / 2 + z := b + if mod(n, 2) { z := x } // Оптимізовано перевірку парності + + let half := div(b, 2) // Для округлення + for { n := div(n, 2) } n { n := div(n, 2) } { let xx := mul(x, x) - // Check overflow - revert if xx / x != x - if iszero(eq(div(xx, x), x)) { revert(0, 0) } - // Round (xx + half) / b + if and(iszero(iszero(x)), iszero(eq(div(xx, x), x))) { + revert(0, 0) // Захист від переповнення + } let xxRound := add(xx, half) - // Check overflow - revert if xxRound < xx if lt(xxRound, xx) { revert(0, 0) } x := div(xxRound, b) - // if n % 2 == 1 + if mod(n, 2) { let zx := mul(z, x) - // revert if x != 0 and zx / x != z if and(iszero(iszero(x)), iszero(eq(div(zx, x), z))) { revert(0, 0) } - // Round (zx + half) / b - let zxRound := add(zx, half) - // Check overflow - revert if zxRound < zx - if lt(zxRound, zx) { revert(0, 0) } - z := div(zxRound, b) + zx := add(zx, half) + z := div(zx, b) } } } From 45895accc5e898c4da5a3a657f7b454f6d27ef5e Mon Sep 17 00:00:00 2001 From: SITADRITA1 Date: Sun, 16 Mar 2025 22:00:12 +0100 Subject: [PATCH 3/3] Update AssemblyBinExp.sol --- contracts/src/app/assembly-bin-exp/AssemblyBinExp.sol | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/contracts/src/app/assembly-bin-exp/AssemblyBinExp.sol b/contracts/src/app/assembly-bin-exp/AssemblyBinExp.sol index 89fdef92e..9ecf5d4db 100644 --- a/contracts/src/app/assembly-bin-exp/AssemblyBinExp.sol +++ b/contracts/src/app/assembly-bin-exp/AssemblyBinExp.sol @@ -11,19 +11,19 @@ contract AssemblyBinExp { switch x case 0 { switch n - case 0 { z := b } // 0**0 = 1 - default { revert(0, 0) } // 0**n (n > 0) має одразу ревертнутись + case 0 { z := b } + default { revert(0, 0) } } default { z := b - if mod(n, 2) { z := x } // Оптимізовано перевірку парності + if mod(n, 2) { z := x } - let half := div(b, 2) // Для округлення + let half := div(b, 2) for { n := div(n, 2) } n { n := div(n, 2) } { let xx := mul(x, x) if and(iszero(iszero(x)), iszero(eq(div(xx, x), x))) { - revert(0, 0) // Захист від переповнення + revert(0, 0) } let xxRound := add(xx, half) if lt(xxRound, xx) { revert(0, 0) }