From 24a9d9d36f67d219bceaf7120db14e2c6ed5817e Mon Sep 17 00:00:00 2001 From: Simone Date: Wed, 9 Oct 2024 14:59:51 +0200 Subject: [PATCH 1/4] Add Gelato VRF unprotected request detector --- slither/detectors/all_detectors.py | 1 + .../gelato_unprotected_randomness.py | 78 ++++++++++++++++++ ...0_gelato_unprotected_randomness_sol__0.txt | 6 ++ .../0.8.20/gelato_unprotected_randomness.sol | 61 ++++++++++++++ ...lato_unprotected_randomness.sol-0.8.20.zip | Bin 0 -> 6629 bytes 5 files changed, 146 insertions(+) create mode 100644 slither/detectors/functions/gelato_unprotected_randomness.py create mode 100644 tests/e2e/detectors/snapshots/detectors__detector_GelatoUnprotectedRandomness_0_8_20_gelato_unprotected_randomness_sol__0.txt create mode 100644 tests/e2e/detectors/test_data/gelato-unprotected-randomness/0.8.20/gelato_unprotected_randomness.sol create mode 100644 tests/e2e/detectors/test_data/gelato-unprotected-randomness/0.8.20/gelato_unprotected_randomness.sol-0.8.20.zip diff --git a/slither/detectors/all_detectors.py b/slither/detectors/all_detectors.py index 44a168c2b..c317b6c0d 100644 --- a/slither/detectors/all_detectors.py +++ b/slither/detectors/all_detectors.py @@ -97,5 +97,6 @@ from .statements.tautological_compare import TautologicalCompare from .statements.return_bomb import ReturnBomb from .functions.out_of_order_retryable import OutOfOrderRetryable +from .functions.gelato_unprotected_randomness import GelatoUnprotectedRandomness # from .statements.unused_import import UnusedImport diff --git a/slither/detectors/functions/gelato_unprotected_randomness.py b/slither/detectors/functions/gelato_unprotected_randomness.py new file mode 100644 index 000000000..bdc3a6fb0 --- /dev/null +++ b/slither/detectors/functions/gelato_unprotected_randomness.py @@ -0,0 +1,78 @@ +from typing import List + +from slither.slithir.operations.internal_call import InternalCall +from slither.detectors.abstract_detector import ( + AbstractDetector, + DetectorClassification, + DETECTOR_INFO, +) +from slither.utils.output import Output + + +class GelatoUnprotectedRandomness(AbstractDetector): + """ + Unprotected Gelato VRF requests + """ + + ARGUMENT = "gelato-unprotected-randomness" + HELP = "Call to _requestRandomness within an unprotected function" + IMPACT = DetectorClassification.MEDIUM + CONFIDENCE = DetectorClassification.MEDIUM + + WIKI = "https://github.com/crytic/slither/wiki/Detector-Documentation#gelato-unprotected-randomness" + + WIKI_TITLE = "Gelato unprotected randomness" + WIKI_DESCRIPTION = "Detect calls to `_requestRandomness` within an unprotected function." + + # region wiki_exploit_scenario + WIKI_EXPLOIT_SCENARIO = """ +```solidity +contract C is GelatoVRFConsumerBase { + function _fulfillRandomness( + uint256 randomness, + uint256, + bytes memory extraData + ) internal override { + // Do something with the random number + } + + function bad() public { + _requestRandomness(abi.encode(msg.sender)); + } +} +``` +The function `bad` is uprotected and requests randomness.""" + # endregion wiki_exploit_scenario + + WIKI_RECOMMENDATION = ( + "Function that request randomness should be allowed only to authorized users." + ) + + def _detect(self) -> List[Output]: + results = [] + + for contract in self.compilation_unit.contracts_derived: + if "GelatoVRFConsumerBase" in [c.name for c in contract.inheritance]: + for function in contract.functions_entry_points: + if not function.is_protected() and ( + nodes_request := [ + ir.node + for ir in function.all_internal_calls() + if isinstance(ir, InternalCall) + and ir.function_name == "_requestRandomness" + ] + ): + # Sort so output is deterministic + nodes_request.sort(key=lambda x: (x.node_id, x.function.full_name)) + + for node in nodes_request: + info: DETECTOR_INFO = [ + function, + " is unprotected and request randomness from Gelato VRF\n\t- ", + node, + "\n", + ] + res = self.generate_result(info) + results.append(res) + + return results diff --git a/tests/e2e/detectors/snapshots/detectors__detector_GelatoUnprotectedRandomness_0_8_20_gelato_unprotected_randomness_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_GelatoUnprotectedRandomness_0_8_20_gelato_unprotected_randomness_sol__0.txt new file mode 100644 index 000000000..aee2ea4dd --- /dev/null +++ b/tests/e2e/detectors/snapshots/detectors__detector_GelatoUnprotectedRandomness_0_8_20_gelato_unprotected_randomness_sol__0.txt @@ -0,0 +1,6 @@ +C.bad() (tests/e2e/detectors/test_data/gelato-unprotected-randomness/0.8.20/gelato_unprotected_randomness.sol#42-44) is unprotected and request randomness from Gelato VRF + - id = _requestRandomness(abi.encode(msg.sender)) (tests/e2e/detectors/test_data/gelato-unprotected-randomness/0.8.20/gelato_unprotected_randomness.sol#43) + +C.good2() (tests/e2e/detectors/test_data/gelato-unprotected-randomness/0.8.20/gelato_unprotected_randomness.sol#51-54) is unprotected and request randomness from Gelato VRF + - id = _requestRandomness(abi.encode(msg.sender)) (tests/e2e/detectors/test_data/gelato-unprotected-randomness/0.8.20/gelato_unprotected_randomness.sol#53) + diff --git a/tests/e2e/detectors/test_data/gelato-unprotected-randomness/0.8.20/gelato_unprotected_randomness.sol b/tests/e2e/detectors/test_data/gelato-unprotected-randomness/0.8.20/gelato_unprotected_randomness.sol new file mode 100644 index 000000000..1a173f7d4 --- /dev/null +++ b/tests/e2e/detectors/test_data/gelato-unprotected-randomness/0.8.20/gelato_unprotected_randomness.sol @@ -0,0 +1,61 @@ +// Mock GelatoVRFConsumerBase for what we need +abstract contract GelatoVRFConsumerBase { + bool[] public requestPending; + mapping(uint256 => bytes32) public requestedHash; + + function _fulfillRandomness( + uint256 randomness, + uint256 requestId, + bytes memory extraData + ) internal virtual; + + function _requestRandomness( + bytes memory extraData + ) internal returns (uint256 requestId) { + requestId = uint256(requestPending.length); + requestPending.push(); + requestPending[requestId] = true; + + bytes memory data = abi.encode(requestId, extraData); + uint256 round = 111; + + bytes memory dataWithRound = abi.encode(round, data); + bytes32 requestHash = keccak256(dataWithRound); + + requestedHash[requestId] = requestHash; + } + +} + +contract C is GelatoVRFConsumerBase { + address owner; + mapping(address => bool) authorized; + + function _fulfillRandomness( + uint256 randomness, + uint256, + bytes memory extraData + ) internal override { + // Do something with the random number + } + + function bad() public { + uint id = _requestRandomness(abi.encode(msg.sender)); + } + + function good() public { + require(msg.sender == owner); + uint id = _requestRandomness(abi.encode(msg.sender)); + } + + function good2() public { + require(authorized[msg.sender]); + uint id = _requestRandomness(abi.encode(msg.sender)); + } + + function good3() public { + if (msg.sender != owner) { revert(); } + uint id = _requestRandomness(abi.encode(msg.sender)); + } + +} \ No newline at end of file diff --git a/tests/e2e/detectors/test_data/gelato-unprotected-randomness/0.8.20/gelato_unprotected_randomness.sol-0.8.20.zip b/tests/e2e/detectors/test_data/gelato-unprotected-randomness/0.8.20/gelato_unprotected_randomness.sol-0.8.20.zip new file mode 100644 index 0000000000000000000000000000000000000000..013d3ef28d1b71bd8543ddf8923c81735f85437f GIT binary patch literal 6629 zcmbW+MME2af&}1T#hoC*-Cc^iyKC{{8r%yMcXuydBtUR?mqIC8Ah=5@USQwb`(AeD zFsJzipQZ`|q67dQfCW(ZRWd4TSm+=j0RZG-002J#0I;)hw)Ao{_jYynaPzXU_OkhG z?qTWr+0Dh(#?zC-)6Lo3#?Rf&!^_;#!`j}#$A-hv)6EqX5eZ-l0E7YnVlgpxy#IK? zrHgZIBA5lEt`7A56p@MAAaTkS&t5|AI~nn$4N^X~OLNM_ zX}ZWz?z}Gi@|W`YjxCwX9W}!ih##3A`&(E!W|{!j-fPGydv4=nZUrul0-dy?#>sNS zWhTc)v_Vf8r;~=9RvDRks2E!{xm)>wteNnxW%2UyHA_RwE;}{!%Rc5zZOyhXu{i!6 zr5|9z6yb3+tJ-4-CMhq%WqW=-YS24CJG=Ml*)`)bpn=?xarc}g$wE1m00*<}2?ePp z+5DaA0R^tb=#zvDQJ2W|GJgbYJ;WAu{0N6v6;%TT!=S?!cPOVjV7fEk&Sm1HkLQSS zl8*gbs)@hYyB*1b)(stPv#<11|3||mmtd2}me1z?Pg3uoz4i@RUGjOVFN}{AW@`7> z9Q1}nR|bwIa%V-#d30&GO>@t*c#;fS4XCTt%4@>?z5lrK>1xsE_}6Jf@p0`Eh{+?z zIB4a31e20`=tJj={YA*xnb3tS-FFie+%d@B)Gr7aQZ2^Tiv1d(u6NZn=ck6#cG1*c z8~AoSlKoeCe{K+-Sy8LMa`rr7%!i8Gi6L`#QWm54#O7WB1Rfy|?z_5GHgJ;;>w?ng zdlZ#~Y%}2WnL{&+bSq-iUz~?WVoa;|?J-D++T-Si<9k~=pP!r456#GGnT8u(Pc!b! zP(Botck!@m#;*u+I$~=ma7H+Bc_Q3Q&EHF(#-j-~(b;YRG&~`+eVNuU=d8wAXjh3w z(*^O9N#E)^1)iqkj)-?zyA2z3&s4t)51Xk)U;VwEX0ecORY$!oGF;_!yJAaN2_EAp z!1)|$^7^ll_j+wbzI42y!1w|H|0-`9@4IJw=MT{aD4q-L$1l2bJGNd+qhayt_H zWNM!EbMc+|m^{2Kt0|E2hL^Cz^)=XIR@XK)V$ASTZ0oM@ouSf6U$}>i2=MQAK_&3!O!T?WeWghX6+&@h>5#je)x*iIkm@wTDU9d*5|+&{MUrm%tn`}%8 zs<}78&4$2fg?}#Jv*ACDkrNo;6Fmq|hN(ij+IK^cKNOZhGQ9C3n32^IJ)1q$diXNL zn}*iXjX;VW9nG+P0f-Z~>{A zIEDZNCZrx17e!!a^It=Vc($O@Qcn+y*hg;8R{bv-xxBh4WaK8crkH%waPwDBn3g`2}Z!cDzTkWy!sm*5d~dd@G)^@Q~M0PTV{>HN5@f&$JcFm z%r~A|c97b)1o7VLrSGO&2S6U{+9b1o=0DoWW0D?)i~0_tPFO+{G{3?oM#_B?ld6-` zJW8{`Id_EBa1Oxl2 z;&`smo1_gNnMshQw9K8Hk{AVsJhH8yn3xX;H~Y?Qc~0t zF+sf=rgk4A7X6!7Khly1SIXxn-6Z!6prx!aCxhx{yh1J0qF1AK^A4QfgoWkt3Fi@^ z6~>@h9*Y(|bXRD#Jj>qWcP>-(3i?5Qh2*^3dnlc_tv@zlE}-w0aTH6TWFJ7?>@%rn zCtnbS=Tz*#%MgunqlrEg)IdvsXmR{lZx;1lC4JERICwbyqhFfl{Ys`}f-|+4Xc?UM zS3vN7-iU^Z@l@1E0Q`mlf4YKgEM6UV{VbbXDuR>e{XSnu7R?@Efh*6R_>Jk~r0V5A ztVpfDmpbdw3m`Kw`_HU?;Ov_F1+r@Xf#UdK2>(V$dnR6h^Vg%0`24y)lV22jD87k} z**)t&VO>Dz^)?UB6}@bXzMb5dytUoAoCc71Nzu-AWROffYD0B0!@q5D+fWC}ZU4gh ziRXo>>*Gg}(A746d)JV^w7-wce{%%r7cOlZ%Zm-cpqLca2SWlmwUujlTMOT1%Lm zKa73X2BT-tO&d}wo?&h>cD__|%i1~Hn^QcG5l*=UwlLwmpUP3gY3{EJf9g;T!C~rm zbkTl<`5XKM%Z8#8{_zgA`h0$f7x7hN&p9`SmO9;QXy#OL&@*G zH)~)eKarq_A_jzD|ZxD*(O5J`DpQ$LU4URD4|HQ$FO{kC6g-EI; zpb>+l@G1MHsAy5Fx`@@-{H@uIuC!nn?)&!TlADCK5nV~dnzOzjIUpnaaJ zB{|>V0F;WRzV{hns+cY$N^0QAK{tUbG_vITsGvSScLpzXgt@U ziii`@nrZrBkD<0t!Lt_UOxu~qjP^#ijUf#m!4ETSa^`fot->U}z7&}`@1dpZWR)Xs zSCM3lkktz`)~T+b7X{5t)Yr-d@U}6XPvEbgC6S$;Ewh)tuIkil^S@8pW0`8r6ht9U zp&|=df?dv2AAx#ABae&Llb*kbIrFC8MHV(h&ejM~LG|n6M}^e-@_p?2hhIA$mKI7J z?S7{dx5jAT8ub|lSL|{x*fuW@vmdYtyRi3^E_@|1?M(FLoW@xT3z%;AaSXOKD2tdJ zRxg#2oAFXDDvFP`vrP0~M9zwrp4%2H8=3sTL-qRuJt&Y6f?s?!O1H1!aN10019%Nn zO?;Qod5U|2w>|fbdYjZrXftg5yT4U)yorWh-XgZA)%~-AbQy(^M4jSFE~n)Hq8KmJ z6+QK!Y%w>H^)7lnL}*1!RdAbn_-*~}dcoB3!8fZFheLxYWkRO&p_Qy*f}Ci7`x{tC zq(%Oab;fI3``4U{$K4mX(BDf0<)2B|p`eWwDsR1HwN`Y7ahXvW{G+L!`2bUNVB%?# zuu6EFsYvOC8o+>Cm|pdm8B)UD?+6#(qMbccTbBAad2q)_P%uUPsxbvF0PWfk2#RU4it zzV4T^NLdF*AD9-Qh&X6-VGrU`D2`8m$fj-!&mW*-7sJ{jOXpDv=UDV2ZjF!X`SJSF zb8yloPZty2&m4LAWB*Dd@aLUFE+Vb(3xT`5%Gxp`a-i>SD>}6C>pwP<&N92WKD?fK zvj!3egG7f=jQUU2;a%7&!@rNEho;LkD`-h6zOriNS@ppI4@K^-{yl zwXjKkx+!SeUWaR-E;mOukDWVW38xt_T?ozz2QWk@+prCZN$@b(*M>ZS#8^h4cYpr0 zdkSsWC`dJ$j=7q>OW)A}o8O+b`&d126a)_K{#Z-6ek+KWYNx?ZD15vq9HXE5j`qkG zGX)Yy*+J!^5WYsJ4s-T5I6U*cq4D#G7joxL)*Pbp5`VB0xNviqaJalmc6`_b^myL) zr(S?1W+v~lQ%tXhV70VOn*e)~*`FM7Q*#xe4qQ#i_u`uh$5P$p(@L_k2g8Ll+&}t- zN=I%^%xEhvza%&h0#y38t@5uaihJEY{56G_tIf{WJUV}tHU(E@JtWv^l+@*Ss#iDW z%;s<5WD;SPuD&2f7X;|A)(r+U>aCa8yS%LG-jXaT3^05B5=>q)#Hh3~W+A8oRTfYh z1r{7Kq5ZZ?jms>Gt}>Jy9skg+62*-`#4RJGgPTMd16R%N>*`OYM-m7WI7EzcF0mP_ zOQ<+&0%J1N*K5Mp1!%6_1JAXeKD?GfBXC3~v6+%dZD=h-a(7^g0-RhN#<-DJlOgni zlRsbk)Vf8f939iyg1&;o*u2*r$9QZRrkaS%;s;Cee%Ym~jUGj5eo$IpnCqi%Sk!!UE?DEBX@zSCVGKsK;a%o;;T@ zK6?h>oZbZQ7;_NUaR;7tBx3M51h8VpEw2}+RUDKg~g)Rm$y#}!;Y>_q@Qks zOvS4GI2uOFZv1aX`KEHljbtqZSnm8Bbq?2;(Sw}_<@NnyUUp=;wKWL0k)LfnEYc3$ zBM>kyVuk&!IoF0d-j^11Lie!x7b+j@(+muiIy=7qYEEr4A^urVtL4ZLb@%UEcX~Sy z>_(AC`rkDxQeJn$w9!ni`FOSEJ*^%oTLZE!xwimgPsKcrf=6Y>*J=mKZ^?ZNhO>-2 z$c^V9%^LO}8^ZhblUi$5dQ=*JmACO4mkvKkJYyi+juxNX=-XPwaW_1=B3T^EbamvQ zO-u2qW;;HM?_`nXgzMg1Ae@{&*0#KsbC=v)^Hv*9%2aCIqhg`rWUp!8)D(Y4#JJc- zGQjxLjeTB(p3uB6d|(npXrrxf6kH}e^1`7&bZ+|xcV1PVC3VhSf9UGO67mkbi1+K5 zNnQzc{_24j5u{2HIC=98vdiTM&xw$FpLmok^U`0Gbii}83NZ_@p9Dx5qoV!igR zoL|nV5>3tC#cp!Y#l&^4>`%v{8Ri3s-G#-aK67L^<+fUZL#Uen%jdIVV=*Q>t*6hC zLY4P)(#?m0SajaY57nk{-0F_Cf+8v2Z$9!NUZR{-f7I*}O_C$8U!VlR;qWOdS~&Oe ztmjxRPbjdrx`*f0jjCPhA26)3BA>X7bLB;9+<>GWW8q`6W2`~Pc|^<_C?OtTiF--);KqWh29 zchxwJe^~`TQ9N3U@Wy;0idlBOZ*25}ujf7$lZ~IY_6~P(=ZxH1aZD8*$g2c_6`$T! z{Tcn|v*T5C7p76#gNAYuElK_502+COB2iI#;sZ7d9Wu_InYfvjLjZ-ULa4L3ttr|KAiLBC;>nY+6b%=O77s0}-=_w{0f>%cuX%8&>_?Kq>- z3fmhyLSP~~t)%zt!7gp9)=fzA&03EHDVV?|#yhrWXODck<<|*H=?nBJWgdbhZd&#j z=M_sfy$IE&gg0&aWW=*2{)0+7;BNi`pZ@6(g|SL#@MR01ROYnI{6{)*=wPD>aY?e< z0dT*dEuSvzYj0n_@^@JGsP*QYeirdbA#*CYaAiMkGrK;WOYPKw? z;!d*nS&cDY-&tEI8+Xr$7crl%r(jr^)30#A$1Nrt6jLjd_bpNl4|$jq+VC-XFoxgb zjz=kLt~zrmyaB=8XzV)E3pIK=i`(1^<)FbQ;@)ArXd-_8HtyLE11Tix@!R|Tcbl@4 zxKbYU_~D$&^)MlYWHeLn&fa$3fBjF^tB@?wHJ&5NP$L%HEiq9pQ0P)n3{T-*;8dVz zq2gDl>^b^4d;;qAx9=7Svt|SD9)vUy253nF@mvJbPjE}y#5<~d@faoB?9Vnu>|09rDV*Sws?BUQh)KeJd%Rbvn?h<@<4F& zpaWk9E5{lu@~a0d*vin+PqV70!?Wd|Qu*#HES-y2f^Fhh>Vca1B%XjxqH1KL+(is7 zZDXQUphSDm(8M3-zB@yI6{X`mzT5Mhzkrws@qw*CFT`I_nN?uV!n%lC8&=(9Fn zyD$0jh@b-7t2Jm3pniq7c}x@QHytNd&yXHjtJ{|~(}_K7o)XUt?vg+9 z9RbgkZUQ(xn@3)ipmT*AeLd&kd!F>j&L-TfPipq>d=0DyaGP&X1*tEeb#`iYb$Q$d zdmD*$W^zr!AD6Y+Lb~fq>Pb#8ymSxQUxd&mpjnX zYf9XV2<({)8_@i08c+?ruEY$tiWDF+ebtQXxWl z$Zhq>lvHIFrt-2`!A{4ga)B#bj9r1+FVu?lfZwmT46Nwg{#z0!)#!qG>=6pQ3jIlN zMb@Ch=30SRi3d#dBm(MLeq_R)k6y@%$_lf`8f+O$Z|jwp0(7Spq)Yj`q%Qn_K~Eb- zrh$1fa!Ojw5QwKJ1xw4ypqmcwNt|e}Z_miw(@t{pZ?bV&@0xeppw^@IQxe}>)i7GVjNpaI*yIu zYTH&5w;LX66a{g%>N(7L5CM@jQ~~q%Y~#Z~`^8PB4o*7eVB(M(qpfuuG4g@EGSlcc zbhpuDE~_|>`;nOEj(N>WfkR_lc6x?Zn?Cov0UANel9O@DlOc0gM5ocxG!?YQxnep> z!m+CdF1t2fh0HT*JB=gH*rbeR35#wYL>Y-&W}-?x8z%k2;T&s@R0!FGlxR7=roEES z9a~2aa>c;7816ifesT$o4?bk!>bJ`)S8xk6wEGUM*oi8Rnuu7=$cG4_FV!65ZXge{ zEggEZ4z$%Gz?82xHz6{JmJ>HIY4O*_!Mzc*O-HGu{DPqrm>SYri9puD7aj*CA`qZV z5-L%9-r9;kBGTx{{xNe By$S#T literal 0 HcmV?d00001 From 138b62664d1295f617db47e8d1dbba70c7256a9d Mon Sep 17 00:00:00 2001 From: Simone Date: Wed, 9 Oct 2024 16:53:49 +0200 Subject: [PATCH 2/4] Add test --- tests/e2e/detectors/test_detectors.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/e2e/detectors/test_detectors.py b/tests/e2e/detectors/test_detectors.py index 2c6a5f55a..a1ec1cf64 100644 --- a/tests/e2e/detectors/test_detectors.py +++ b/tests/e2e/detectors/test_detectors.py @@ -1714,6 +1714,11 @@ def id_test(test_item: Test): "out_of_order_retryable.sol", "0.8.20", ), + Test( + all_detectors.GelatoUnprotectedRandomness, + "gelato_unprotected_randomness.sol", + "0.8.20", + ), # Test( # all_detectors.UnusedImport, # "ConstantContractLevelUsedInContractTest.sol", From 9ce83021d7beb3b5f31c0e989759c12ca0d8d7ab Mon Sep 17 00:00:00 2001 From: Josselin Feist Date: Thu, 10 Oct 2024 11:48:21 +0200 Subject: [PATCH 3/4] Update gelato_unprotected_randomness.sol --- .../0.8.20/gelato_unprotected_randomness.sol | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/e2e/detectors/test_data/gelato-unprotected-randomness/0.8.20/gelato_unprotected_randomness.sol b/tests/e2e/detectors/test_data/gelato-unprotected-randomness/0.8.20/gelato_unprotected_randomness.sol index 1a173f7d4..108859e9e 100644 --- a/tests/e2e/detectors/test_data/gelato-unprotected-randomness/0.8.20/gelato_unprotected_randomness.sol +++ b/tests/e2e/detectors/test_data/gelato-unprotected-randomness/0.8.20/gelato_unprotected_randomness.sol @@ -48,6 +48,7 @@ contract C is GelatoVRFConsumerBase { uint id = _requestRandomness(abi.encode(msg.sender)); } + // This is currently a FP due to the limitation of function.is_protected function good2() public { require(authorized[msg.sender]); uint id = _requestRandomness(abi.encode(msg.sender)); @@ -58,4 +59,4 @@ contract C is GelatoVRFConsumerBase { uint id = _requestRandomness(abi.encode(msg.sender)); } -} \ No newline at end of file +} From ecc20101dee3ac88fa6d5ae5d54539e4b02524f6 Mon Sep 17 00:00:00 2001 From: Josselin Feist Date: Thu, 10 Oct 2024 11:53:43 +0200 Subject: [PATCH 4/4] Update tests/e2e/detectors/test_detectors.py Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- tests/e2e/detectors/test_detectors.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/e2e/detectors/test_detectors.py b/tests/e2e/detectors/test_detectors.py index 2fa9dbbf2..d2f191a4d 100644 --- a/tests/e2e/detectors/test_detectors.py +++ b/tests/e2e/detectors/test_detectors.py @@ -1719,7 +1719,8 @@ def id_test(test_item: Test): "gelato_unprotected_randomness.sol", "0.8.20", ), - Test( all_detectors.ChronicleUncheckedPrice, + Test( + all_detectors.ChronicleUncheckedPrice, "chronicle_unchecked_price.sol", "0.8.20", ),