From 0c878f79a296dbf37ac80d78ad35d366a07172f5 Mon Sep 17 00:00:00 2001 From: joseluu Date: Thu, 26 Jan 2023 19:18:33 +0100 Subject: [PATCH 1/5] allow for custom error decoding --- web3/_utils/method_formatters.py | 5 +++++ web3/exceptions.py | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/web3/_utils/method_formatters.py b/web3/_utils/method_formatters.py index d2018951a7..f748fca18f 100644 --- a/web3/_utils/method_formatters.py +++ b/web3/_utils/method_formatters.py @@ -95,6 +95,7 @@ from web3.exceptions import ( BlockNotFound, ContractLogicError, + ContractCustomError, OffchainLookup, TransactionNotFound, ) @@ -758,6 +759,10 @@ def raise_contract_logic_error_on_revert(response: RPCResponse) -> RPCResponse: raise OffchainLookup(offchain_lookup_payload) # Geth case: + if not data[:10] == "0x08c379a0": # custom error processing + # raising along with the data value to allow processing in user code + raise ContractCustomError(data) + if "message" in response["error"] and response["error"].get("code", "") == 3: raise ContractLogicError(response["error"]["message"]) diff --git a/web3/exceptions.py b/web3/exceptions.py index 235b9ee8ea..ab9762d09b 100644 --- a/web3/exceptions.py +++ b/web3/exceptions.py @@ -250,6 +250,10 @@ class ContractLogicError(Web3Exception): Raised on a contract revert error """ +class ContractCustomError(Web3Exception): + """ + Raised on a contract revert custom error + """ class OffchainLookup(ContractLogicError): """ From 8ba3983e69a68e47e005152f865970f54ae447c7 Mon Sep 17 00:00:00 2001 From: joseluu Date: Fri, 3 Feb 2023 12:29:05 +0100 Subject: [PATCH 2/5] make ContractCustomError derive from ContractLogicError for compatibility with existing exception handlers, sending to a wrong selector leads to an error with no data, this should be a ContractLogicError as before --- web3/_utils/method_formatters.py | 2 +- web3/exceptions.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/web3/_utils/method_formatters.py b/web3/_utils/method_formatters.py index f748fca18f..02e02f9126 100644 --- a/web3/_utils/method_formatters.py +++ b/web3/_utils/method_formatters.py @@ -759,7 +759,7 @@ def raise_contract_logic_error_on_revert(response: RPCResponse) -> RPCResponse: raise OffchainLookup(offchain_lookup_payload) # Geth case: - if not data[:10] == "0x08c379a0": # custom error processing + if len(data) >= 10 and not data[:10] == "0x08c379a0": # custom error processing # raising along with the data value to allow processing in user code raise ContractCustomError(data) diff --git a/web3/exceptions.py b/web3/exceptions.py index ab9762d09b..6d598447f5 100644 --- a/web3/exceptions.py +++ b/web3/exceptions.py @@ -250,7 +250,7 @@ class ContractLogicError(Web3Exception): Raised on a contract revert error """ -class ContractCustomError(Web3Exception): +class ContractCustomError(ContractLogicError): """ Raised on a contract revert custom error """ From a3ac3a0d7969f9b26f635b7f043276117aae6168 Mon Sep 17 00:00:00 2001 From: kclowes Date: Wed, 12 Apr 2023 15:20:58 -0600 Subject: [PATCH 3/5] Add tests around custom error revert --- tests/integration/geth-1.11.5-fixture.zip | Bin 52196 -> 51692 bytes .../contract_sources/RevertContract.sol | 31 +++++--- .../contract_data/revert_contract.py | 28 ++++++- web3/_utils/method_formatters.py | 13 +-- web3/_utils/module_testing/eth_module.py | 75 ++++++++++++++++++ web3/exceptions.py | 2 + 6 files changed, 131 insertions(+), 18 deletions(-) diff --git a/tests/integration/geth-1.11.5-fixture.zip b/tests/integration/geth-1.11.5-fixture.zip index 0b3a75a8df0b534d1ae183cda4ca4ed3894f6a65..581185897c5ca64b83ca7c951b972fc95c69e393 100644 GIT binary patch delta 39607 zcma&NLy#^^ur1oQjor3w+qUi9HovxQ+qP}nw%xm}`=1kW2ltI$P1dAxWkptIRz_vj zaT@4#5-7Z)3@8{H(Ep4#t>^@JLeSIyfRXfnpg|)E81SwYt< zbfaLko7}Xzv7rMW{JFd>(2)c-Ox2-8>WAj3Hi1If=bZw9P=d|c@x*E; zRnKCiz4J_lh*8_l$?0ObTZf+D?~d)SS9%1V0zeNLEmdcAk(bO^1lWwBqhRH-f*Va- zT0ftpjavjOx(7Ydc&BGQ&~7Yg4*=mFm~4YY*004Fo2l5SGe{50$;~ObTC2iDlr^FV zAW+AhVIl7$e{=EM>XXr(@XUabDn(G$#)W5UE~Zi{eb)8G7!6UjDU4EqW?CsEm6q{N zTj1i2{n0r?ZzrDKuJ>1=Lo&q)x70f=$T%IxQ87bevm53z4}7XY7=^oY)J=SYVn|}O zMa0dIDQNk#K1ir@h_+k*t_xO|P1mIg5PhH@CR6E;M#g-5dh_PZ6NnX}<}sxrwIcDs zo$g({xe=E!5P=Alq6Vt@T3umS9yuSHs+-JTgvvukv!-&E<}{vWoA=ZsnjsNnV+Ik^ zr;bP4hYyvUtzZGvK6rR(oWq-Ei=Ex$VwZ}in{B*x=#bHR$~X^X&Mo9?RrR~7o|r6K zj=Dv>ZRj&>WPV(uA2&}D0>?<2149G-&*hU&!5ID*vB1gy7lpv7|Ht{0?7+#P z|3md63wuMq9CrXQx^S)qH{U*EuW`-(3iK;Cz_WoumCzZ3i z)^kVb7KB|o9&X5>GtmF580vrGE9oCNGt}9Cq-hR(VM+85_#*y5P+vI=eV zGK@yNU0?4fcTk}JmpL5k&MyfZk{0m)kA<0;iII_+?a$`_azXfwHZB()PJi)=i$gFX zfglsIlZ5p>gCbyarp=iCfH5IM$d@{e{$@v0!yPzahf0i8GU;vKBpZJ*3=9M$nM4PL3Fx!iVniB!h;>Ue9^KHtD4}5bTtnBCgJAZ^*p6tWg7 z%MDz&Fpt=|_q_6DfIFIU6wwdA3|OkyPx!av&SA=le9xi1efNoS(6D_)JS!}>wJ0jE zSgzl7`nOh3U zo*@_7r6GsNi4FO0zP!7gW4AA~qiM*&cg@IH6~qo^|4D%NB8G261mqi5p%9mI5+0;L zzEm}qQ9;YgKJyX$Uh5uHMfw2BX3FCK?)d*kiuy=gAY2kI3^~9=j&H3mA|OGDnxci4 zje<;SuA-5&g|~@wg-f7~uz|9Hv@bj&BO@gwBPYO$rbtQN&&fD8WsN^A9Q!WDQ{YY` zs+-9*@JeVcvhjpQ#^4DS!qJ{Tuhd#CTYG$b7zpCatU_!ge_5Vk4lL#C)WPbjBbbLw zlbfiQ#}-1r z0>?sqC(kZ9-TJKi_T3KOl_XZ|?>_Xm%?;cm+`WtGEJniKF;vtpLvh_1R?Ma+>L0H5oc9!$)$QvCIgC0%46-HE;A z1iApe?~nowe!25Ll^Z^$$d6v%2!&m%hwk2z??uYq3fxmWKLm}ySU^qCvYo!1fpKG$ z9UK~b=Iy-^AY4jx9T1g26ca|W8Qi)wsPA5<&NCBDu{5C-i&|Dv>c98Zq%2b2*dc3l z9!u@3s;s8><42bVd?%kOWevR-c_ zz&Fm4Z8gPZKi})~P_Y>u;+N<>>DOhh4D042xRdUSAiZpH4&eKoHPdVShtI+9>{wtt zoNHg^Qn=XF+Npkfx#6|WlmE@8dyi8&&ud=G<+iVgX5zQTuVSa8;Dn5aqJvN+hwDi- zW@t27EqrCLueH?;!Wv=kuAtY~#wF09&R_NW?mR{>CB`GsS}c(lj^(gwT%VHm{llV) zex2b7+nKU656JR`RvFktHT%*hXvIFQ#xm}zyL>L{#ir}Z2ifnSJJVrV{xZPgps@ly zP20oy@cO>;Wn-|L@_+`meI{^sH&E4NnJ6Y|S1aeqyS(5ulpOclofTu^w_aGf9o16^ zt9d7X1?X#vPWWZ@cBFTFrIK7%|jM2Q&w0Lt+7M>?8XclqUQeZbs;vy-3y zWxv03W7O!ffv?LRdSH0vPHwg~4rh9_a=7iMKflc(uGLX>jUoP+=L?*#qNTt2dL%7> z31x^iRP~+CA*aB~qeDDH8|ijFDlJoI!L(xU-a{oG*1`q5+UqU<{)U76Al+FIarS8~7Z&r1f4h^$8m{AXwy zzvL{#Rz_Vs$Tl_ZS{=5=mf4u&y~sVS`(kegz*7s`teWgt`PU0YnO`+dvI$P84a7G6 zxz;?)7*5?!Vn{+NkK8IoxAy(8N^8MiyeS_UTd_Zo_|1_-o?KQTJE$t13>{q3^EGQR zY<{0bU*0P@fU$I~cI`Xmx_u6nm#1>pWSv_0VM8nijxt76S*i=?ld1mPYnZ(0?!};7 z04xh9gNS=nOx`!I>+X8Rm=o~$^iFBifbH~lBMP;6mO^U!OecyqqkV|vs~WVc(*&al zCl+0rrjvFcC6TSRvNa4VQ6#lxe=2))`1_#`>7+la&-bJ_b_$WVoX$EZfXC=;IaQ@v z7WV1Ef%>377@f1ZAmdg5I^x8|v($YG@C2Sai8WDKvwcp{WZtT0Mb*lew??oDTuOpK zLl}9*X=IW1{uchd1wkF%BjK@*&lH2WnZ)+xrtdaT?_j2dRSn+GH<=cC__EPKxA5f< zNds6T`!@3%WFFEhqL;`mpWZUbeUmv1A=1w3jHjY4{Nml?hT*9z2K@eQ8v80WI{iz|D9i|oSJ## zva~)gL1#bRY%tg?D=uc#Aw+(PJGi|56!PZU_emeD^&EX3kxb%NTZ1eC_I+O`AbX)D zh5~ZlmFHDq&e{4u)3*X6dW8S()g9^j(qMU4(p{Hp#BJ9|h>_TLDfrU>-IiO!3p;x; z9XOLbT%)Jq%}{Xae^36Y-oo$QJZD=y8p?F-;`nn#U9VY3p#-Tnee*eMk-hym^cFS* zUiQ!X_Je!g{-u&GdUV@#d?a&|$s+|&uJJb!pVpMF*IO;bVqQ5ontQVe{O+LPWQxw^HZF|4VScN!xR93_U9-zH#9GoiL z5kNe~#f63`VuJOiDQz0g0}w|_;OA`0+MAV;e^Jq}>nHwr0xBh(yWJNDmw1-g9dUGv z6y#`q%Cj+g%BbL*V7j|;%zgHne*dTyED5Qtqf3ZhPi#H|9`=OP{$Z)H+JF4yf6FI# zd5y_-;br3AnAjP8GS)~k2e`AC=&Hh1UsfOZx<8a0{M{*Yrw0>KGgpY;hXQ?JpP! zHphD9qoOtM@JEzbN&V(Sxj5`@8oja9-=8oamZM_2&qFK>{=8n|S!X(%mCawFP2Wx5 zx>J6=P$iE6R4D26G5-{KJ&2stiXFV$cGPv}c1!7-S@byEv=!!Jx(a?z3<~`5{iPz` zy9jk7GV6>FgzCcIjJIMVoNETl$9ROVBjELN_nG`ia`Th^Yi9oF!=~fV&dup?(-It) z?=t~46WQ57)Rt?}+WjManB%G^A?}TUqxaYRFP&o-p!8oIfoT_{9pqcN8w=dG?sWYh z+ivwA^6-i|m(jFL@J#=BG^fdC=!%P=q|$_j3FwFXD78qQd`Fis@?z5Bgo_F&L?qoT z6O?kJYB(2Yo4}*(;9aN)ICI?d%S`0ZeXM4OG)c>kvy34XmPO@p(>MR~#YUmRQ+ht# z?*Vpj0PIZHWP9%Vay!bg4vlqG&@)Qny1kd|R;l0I#wr?vJKz2(Q=X4aU6XT;$+St_ ztJ2^*JfuA@_TI0S$yN1g!DaY#&YbTdfsaqLfIX}|S5`6qNv89JS)238^`V_y!j)Z} zU$}Ldoq+Na*|87FjnH5HL95#t$k#v|lr7X1K%M!Y69PIxx^li6Y7_8&#ewxmy7s$C? z0Ajnb$CVKl`m5O(xGuKunfCEJH5naXAaDaCH{0b#*}H(YwLx_4i~Z5pyVF=;|HwEd z@3P;Py{Omgl?kQdgKYLT5zL)gs( zL(w6i)pz?o+9f#xvV{EH-TaV51KX2z0J9|S`)>K_s3%9Sfg-#=g1+qwjZ;9Lkm3tv zPNN}|i;|AtiK(K_Zg>pYP5u>7-4<@B%5HSl_ut`^GIaqCzJHr<c z2gr0y#_)Mi-FA`xi6$;faE+P&;p+2sxj}CY&u!WFT3rDJ?iRUg^T~2~N6L}_Sooev zH~OTrAJ_!;#(J3YpF7HX92TJaP3D~4qUrK{G7||hc4_(krrVb66;iO=+F?m{TU9+n zvF`FSm@4as@YpN_ERIWuv9}k)rxqQSmVt<0p}IP?<|4@1PG$S)wVhD3=tviT4`5zi z#D!!nmicn+)HScg_r&(fyhW!0-~dled>@r8&G)01gsbJUnKL<{o-706^*=|a+Ezz5 zC2~idQy>Tt(tpNrFFBGRb3HuX?b-qmW7lwIH3fJtXBLad;PlT&Dr5wPb@1lY#+1*V z->;RNzNSx^BtVx!v;G-s{5Z|-K3rWrT8{X9?^mySl2EQ(LSI~{lzMUkxXj3hUmUZU zho}-{6~;*|IA^j`;{(f+wfe@2>+S{un!~MKdj$+F1A}^iQ5TnmI7%fhQ`rpz#a;IwFDx$DOn}@SHwM-?C{RqC)N?X9{ZeClOhnyOHi{nNYQ%AO%35vDTI=|T zKel@q8Oq?~Y>9>T{(fQsx)v-NN$L_%otmLRSlGrHn!{Xk#`pH{lGe zvxX?nzm}I>*3lDm{IkBLAdPH(uTz4$@P=xqEhc@$WgT|7sqN*ftCvf!l8fVe=@$J{ z9MJp2nsgv5ycKeLBNOk0kU?3rEpalKW1?jwd^CVAGpiMusj&a6KOIXI%}`NxiNnK_ zd@s11whO07)=}lXWnZ}1QRgooj@jIc3sia9(e~x>7Hg~0Y{}`3Rk^%HTgjqEolVr~ zwpu*zyTazONJc-|F4}h9mKNz_I1g@|JnT5XU7 znBz}?K~XR%J{eI!3D!T%Aom;N?M5<~t0{6JtdCprUJLRF7L?+bvqVB>T@=idP8(j3 z6ev=_tG0{KzBHKpc2f<0fCX~<#}1JKSS!i>OPHTdJE;p?+$Cjs(fq>!CyAnDpeo8} zc;PU=5a~FTasnFDY;zi#lG2{6GFWZDD>;m&U{+Y zZjV0=bZ#V*ltCq0rQ|)3+tDtnSi(Kj61ES(A0k%CUtAb9w~3Ec6kPGM$UeC?m<6IH zziG;=85V)X6(T5~B|YG0{>`7!-olU^!njnr97SjlEK-OPx+x#G9fS*ASuLG$uI2iE z4$;8tZ&tiz{Xlh?)524PpZkfevq|h;jRRjB_ft6*jIOL9JT)S2NF1gE_6jAUIVT2y zdIa>LVgE6<0chM1O`OQk7eJ3JMxzY<;1HT!ygry=E>%dGQr|8aj_Wwm$((oy8Z%&S zIo$wBEj$-mEGjKEsi>4pn|{HX&JaXRBsGBq%B32gOsIrr(OyC04IIhr98M#=Aghtj z>UvV>M?v)oMbVlpqns(8dFa{?Pu>8qFZ6gW?NKxCl@(&!Pe_hCAUy$(zPa_k}}H_uU`mGq%k5*qlTlXD3T+A9HTUQ zk1y7aEQ|~hX38rredN?lmT0J7XAf;km(dF+rf0;1s=Oa@AarS-G(3yJVRr^t53Wf< zWseYQP9vKP7_;K`9lAGoGglcVXBPLyAGv5ZD3YgNktH~Kkcz`oFu_RakwiY~00peq z5F@GKI#V?8lb)6nGJ(Kzn4fQfn0K~h#;-F{MPz*5gkoV>bm0y`yttdkYj#feMUlJH zBA(3BW)LRf+$#cbuqMnPjPn7E``Fk;iK~T)tN-*u%u!bjxv~DR<4xzsuY+&#MH3t4 zk}kqH5ti-`dh{a44M#Yjlp#0VGGo{7PkN4$?!t$pqjvkh((!C+3{%Kq3)n`70QWhr zrz)lGvUDnvPP|gPc`gR`?nG(suHBB^(%IGZwlz@sXc60k`$f_r=0j1Uky~tew^-{Yy#hWk1M*jU~6N^U*KX`XxDu` z#oCqPYR@448SF|n`JRg|Q2%}WnPtc3Xv5yyF!M=TH1}Z>cq*szr;ydt;NPN5c;e?E zku}bys{N_g23sc~c$5MhIRx{)89M}>4MI}T3Vx%*PL+I@20KVHvgrmc>6{Y%5hQl0 zCwlG#2eBY>SQ^z6AaP&b>y6vGD*iQp>+@@JVcn=R!v_^(o1SShsc{#%-wn<$7H}M{T5Axk-LWrWfS<4P= zvGB3%eWqg(N)9a;P$xIjKBt706KrmXWEU#LjmYPckNpajDZX4AjC~$)sF}|h9YzYg zt<+D5wjTqMo=T|%0fS{>ZH^iNqIp6I?}r>RElRYc6yD1Zvv3h0JSjIL$TaE34Kx2N z3cMvdgYYQ(&pjXDu8r>{5az@ekyw9Lq&rvSk4YIfM(NLjEk;DEctY7(?t}(2hDS0g z+|=3q%tYlzo|;Wzv*~vVr-7eq$KO?R;5+WxcLZUFd)U`Pmu4MLJA!v&wC`r(>1srX zhAX*%QW#uB#y|`|xR98}48MW8V1r`R9xJW9eBinBNF@)@syUNjz`9>?80oD+A-H>> zZ*ormB;fODVH0L^r=3*2c0Obgh9h5@%NW{trhH~M=A_8<{UbC6B|<-W=GLBmHlmoM zYT|>=6X)g;+8NFT1LAE}k0l}*7*e?$*~Mxx-zzRQa0NtR?o=TUCBTV->W`u}fjH0` ze85L7m4gb%U0eJeoNoioGplaIadbzCTXg6iFBvUX7%9$fvOmI*{oE`S{AIN*IZdXe z7N23erZUz-VhmB2Gp0p`pU+UbrcORmCXP%RtQAqTm2j>g7$j@#PN{B6)PJz>Itkt5 z-5=U@ApE#7%`NBs)Y+MiY}w!#Y&|=RGJ^5Aq!|RjC3$jS(@0HYThKF!VU?8SQ3WfK zMNVb`KK$y}CLC{tFf$0w6OacdNwUnGQlhqPL6oNfe!z5zNHU` z2FX0%ria*9`&g4WW;neJ?ADI!)23w(=@q7Uvguw>`slf+)?A2hBfR3bqTCn$f=A?u zdoG5P((_}SpoxWZN?oghmAFJR*9uqp(7*%IFgxHt;Z%cEJk}GX!w*(hA9TdwO6hc!f62MD102!5+CUV0LJ%#Gn<~V+pKiW>uJO%>f z$i6VMY#Qa|4;4)1su|v>zX_vLrcOLi;>pf|at+Dug{IxuDy~AcOU9xN>qNC`2#Gl- zuJNEY<*}F*OKpo|kL4Z@C*%2#6d*bbbn?5gMH|nu2bR)MLnbg50@CmZ`cw}m_DlSM zy&h`w-}A2`Peo9MUA#Rh21u#NOOXIs?VUwKQaeh+#P&Njj5mCOn9@8yxuzkFGH{Pz#KL7cvkJ?{0xswNeKf$$VFaw+$$%H8% zyx$qti)Q;FB1*=rvS=bz`OtsjtGL3S)R}fO^T2sISYX&P;CnJ)25Tj~0 zddZ$JijGo1@h-n;Zi3fEA>~1#u{nA?G!{EV@va=&353*N^9ie2yW(Bv5ZP&o;q=_? zTTF5!9a_`Ji*WveB}wCw0Qe~KAiHkV>L*tI9txNi@(5Q(&?3Mq)B5=EzgTVvpxT0D zxkb=U(Rr;bO9(SsdOm6C#h&VnX*+`qT`zKJ)|@0^k_%~GtRhHm2$IEtLGis{{g^^J zq=seM=-vqig!jMtjRx*MK@rEryMll2a!KoTFs9Cg+Bqc^ekx5PR z^AUrP8BTe!&59lji&5)@YWl_RqZVv1Koee!i*7!2#jzuGCLanbMvR>q6weO8*Ta>~ z{xF?@@S_cqJK&ueM-LqT9X}anAvKQJ&POKu1Sk8vUQGdvk|tM+`)b1EF~5;E!Ojj~ zp=>SM#e4{YtQkl82(hMd5oViuWqdG+A5WQYiNo@;F^!@8QM54~H-C$tp5Tq`PZ}|S zEjLQitoqk6ZJeA>Igt_oiQ_5z1wDAgm9T5Oh{v#9zV^aoY*nD2W!Ir{8H$U zk+*Pl0>uE3Ni>se)PzaQ$Y6>hN|*|ak#`P_c!!DnL(SI3TV>BV;Y5;AJOt*6mN`Ia z`iFR3lLW?;^eKc=8abL+ga+>sJjk>oD)XjWL#d-$H`!8slp4n-fY=Is6r}Y6g8R?j zQ~#J7Zkk#Uzuhe#`Z%9@QF+edW)2eILHx>Z){yW5&1L4 zBPU~kp0+A6t^DO!$J7dgsMT54XpnTbtTos-D>R4I$4aY?XoHA*?GN_9Z`QG~PrCif zKEZo{^Q_K2GyxG`VBE7CkZ!9K=LEa>v$4+OpM5)d^?S~p`oE$*iPuor6K>V~KFiy| zrW8_AFOZ6?z$9ZcN+q13zmAa(|IkMB#8D73!q` zpaH7yBW3?&&lJd)j>zvPlCgc5xwzO=isbhxWECW(B+!EfJika|%Ktv-*h3XR6Q+9x zIU4+>8)LXf-ZQ&zie?=b7!Tt4qJeV&WF8p>J8>#6?!)i~KUozQ>}L!gwjyh*$)AtF z_MXghpd>)mii+RRh+;>cxi;WfjVv8Nw`I>uEuHiT}fN{kiOq;?Le5NEO5 zk|Z726x3c}nep2jPFxdabQVi*P+PAo?s%c(knTm%#|T2UhjtPsgYb_AW)rre3!}uP z61)vFbFKNgwJb8*_H=79i|EtNM8Dp;c}z?}_QU*83+Z z)&B*rZ9EDQXQ=wb;#2{KX<7?hLC<#zF|XYcB)g&MW&@(dId}q+q;lfPC$7NEcKVs( zvdv)6WlVE>rkk6*J6`Q>vV z4+w$j?5CaH%QnNO!<|HRuWi=X_2)>7*f4KT=SrJ=?eh_Kc6q4fAdzI^X zch-tqU~jIkDR&OQe}F}JQE>I6#m8LYu{rzCn6a%e!MsZca>*JSRc_kNuIR<4=w(C9 zwX|9329ML-{t3QK~bRxreg`@Wb zh2lvKw^c|o0vJqp-Xi+7N7kgFiS45iCuK;S-~k%W5|l`Q^q78%BL)q^dJxA~#*HYj z2U5+2iG{NGeT0IsapD5#f-@45f_HbVBVo~@L94z5wn`~Wc-!guF@&FFOVsaug#k0P zSMWIkpAkOn5+bq4$qds3H5b{V&X+%s^BU2Vb)`f&~!c&A< zncD^a3;LMV@2{{hi~#(>O7p*94~cI7odCUudPNj{WcQRLhX8S9i9zr3nkg}*VM!l$ zatN@bPzTQGMmTb0Wn!X2^$eS_W3giM`-x^SKWS?KciyyQUVLV1at=})#o;_}hR_2# z?n7cnvLLopfdvKV3mTP_;|Xco^0&B;YvAsy(hQB`D`J^EI0^+U1bsC_r>`sfUB7Qw zr|_pu((EsF@1aY0T_~$`u3xmTqqAF#H2J%~f8;tAkN|?>3 zxvD(C3}&$|&j*udwR+5`lqL1!zJ~bZX7gmkd%pT_P`f&68`a*-AO4nJ`|-kNbJ zO=aCF(+cB57cMt~WQRSn4}~7~3zNrA%ry!2$B`&qp&rqK45jkapx)iq4X#4 z;>w10&Lue`ufhlX{_wA$on6K@rP5ulQ*%c*LDBv3eMyWxMa>rDX{OEk?i27BhEBA% z-DAg~7@k+RMgP2rNZ_svc0^k-kwRai(l|&ZduVvF)d z8#ZJdWTh+>5DyS}_SZ8N3tj>IhXtV)>7zj5~6Zl3MP+`4#I}4JiLR zXsbZ55fZD_Q{kJY z|I0CD2B|7JtcsQB1k}>KnzANs(CQ21VAQZrB%Js}@t^V54FY=D#EN3d6LU&{OUbSv zcEMe}Bv~j@B6}247MUva!dVlN;~OUOuX`{CS;7JTbsUt2)PdkV%ANTWHkk;tVzW$e zOo<{24lE(OnyfWDFx@<3L^}^|NP0+7^gd8&+7~vWn!y5y!u`;)t_Lo1=3=WMS5( zg9e!zS-u%1Ahn>S=9k$bVTxo)_39di8R0(Unp19QJHB#>J7jy8P)g&Ii~3TOqA3~% z?1%SHSo0bClFS3H2WF$n1jrco?(GyJT#U_3G@4rwgu4Ff_T`NcGU5kt{8!=<*AE{O z4`7J}l0f_&j0RJ}an;bs-l)l~pZksywu88aaI5cK1j4)%A{pSdoL|HC$5FA!dZq-H zUpYUbl(ncI+rmx{A3?ETg?bYYebd(fuZqGapJxHt!;BbM$5?{GN6Fis<&mP|Oy?>Iut?*#a!!558(h>w z((OJNZ+|QQF3gDQtA6^4m=R(E&A%Gf04k#0yN7Y0GNVq^ztse{6fEec5yF!trB0g( zz&as{REK7)91E51FL_ZFU{eOZTtJvb#-zSr zP3#2rVnm~aoJHb=PN0yoXyu4k9j;M2v-(Grhh(cjhbl&gl9*nrx>zT=@yavBK4F_I&I;p~6U|HHlsDv_ix|I3R@k=~ zXoj_lMVdDir*0F`?N%2*gb`|8`LDSuKuGqWwu(QK<76OUM76L$$vEh@i^8pRb*K=>~oq$wrG zFXM%RWU|pxhbt%2__&-Lz<|5T*C#K>XiQ4#0WqY4k)O_mM1=@92w^VE z>al_eYjrrV(}E6SZ$QL)L9P|t&`tj#zxI+SnHP~Hl z6=5UEUiu}@lDmT6gCBzsjGN7$FMdsE*h*?+HfSQG6yFLB!b>^;*U!CyO{Uv`C;6L7 zapS#d7cXIx(utJH8oEn5v8;BuK{;8G9gx~0OX2ok4hWid{ezR;Pi$@>Wd~Z-N^G`e z#+H)75F=AW;@Tk^FVPc*rnd%wbu@2@5-Yko65sE_#bC9)Z(8H>PNw811;+*!vst=$ zsWIY@SGFOh3ddk!%IOwba7t+=vAS2JksTBwA1&ra6jrCW5SsWFW?{zNg*9g%MYbXYrwwk**idU|avNgtf{NMs8gx`VP3ys!=@B90uY-x=fdRP(z3 z1zTPC#PnbSxHGcR6mU$j7)O(&CiKX0^6~2>nHiT*BW8~Odz1~wPV_8^T``vTlQOiT zA}!Se#JZ*7#1?oD^PU2*Zr!!+P&Q(V5xQI%|NdM;Q(O_SKW34=tG;7lY`bHD5xL8C ziG5{>%-DszxaKO}_2CQ=Uu4=lBka3#hRL#{RXb*(tB-V21~2HLq*gGg3T@A?zy=}b zpfl1Icj}DdZyprV2jClTWl99?`~QK^qi%J(GLy<7b$vvVpE-sA^jGQ19{qp8#%h-!qxyds~piaSwb&g53(lAYDoB&dd#*gZ% zxw|-Gx<#~)H4kJ)-D`eEDm|C@1!qHdq~X}SyaHrC2sReDX8ysSxZy0EY=UlAk|8-l z(kR?UI+kP3DRTp4k0*|?zw%yWr+ApjTv**NIvBf15M7ot3PPSLYqM?dmV!L$V=Q?6 z66Q{v;kUYDEIxV@qK;^qeuzUY`vmyPCUfAuRCtP!Hu>DGp>&=L#6_1>plkG5yr*+i zH@viS+%kb~w;Q|Js@RH*a7tV!-4`HgRGN|d+F5llWN82$c-)Osogp>e^u0A)_?;&+ zO=jc}1_fZQqftg-&H{eD1WNK!I@c-plumyr8oEk+*obg-`+l6gzHwS+VNX4y7F|hB zQzUwGsx@f28%7TgmA=<@-0jY$#$LFYq?Rx`)ftMb-mHO39sfm|gv{Y}idLR^%nP}e z{+zbj!GZ(o@HrmF?!FSw%w0UZiT((4x@lgA*fcbLKK)e8o3qr;#9|}@r8P&tdtXfS z$*7{d-65y!yC(clX{ba+@j5HI$30)oUa;JI3CZx8Lo1!7_v-N?vM-Y^@h^zjL@-_4*54 zoQ!ap7yNjsD+021iu%=fF88nO96nxo2&*@B(ROf})pD%36}W}oy;(bdg}?!N<4A7H+kA zaM)LUkC7$qBHJoQDvtAGA6p+47|s*!f*kc(9%EmD)Nv#I(Z62<%{`ZnIt3AyUjsmM zucP-t?8hS@#{TDKltb`(hH*Lk=(nep14~uwm67!wuL?Ipy(;U}%)Ae02dxDzz`tdx ze#%6obwI$vRb~8p-l&6I`ntwn*7|LtrHp7x2==u z-OhE0d&>DMZQ9PidCRy+puQV<_zTdcwL2cuqP^>qgu8_m$S)wOeq4@EAWgT@{}L*d z&F-$Fx$LOB-VGqdc=#s5csE&DK~zAB`MK;WE>a0td3da ztP2#ZE*8I=^k9gPbVg`F5SrE+{w{scEoq?GZqiXTsq~aA)PeuTM8cv!!xT&zr0DYe z6hzYK7ad;Cr@B*jQ?T(tS5<_!+(-WRFOD*;Zkyzi$e&)FX3LSZm+oL`YBY**;~mTZ+&=FI6{iR965 zrDPEF=X>8mQAS!IuK}PZof_)Ee#J6f6aIB^e9v-WT*O}ipZWdF)e?sw;;;a1AD8`~ zeX=D#phk4*o|BA~5U%~lTbecOac?D`%jYKs1fIP!sjp1P#NBefSnF$#a{l_aP!N^A zau?w{+YAT)>D9$jSG!95^7B8bN5o`HjyL|_WC&YA_LDnSO8{P=RSXOr(eA=)7we{U zp2Ck4wFCGkAm_DFR9(ND+XTCt|`2&@^xeq1GMy2$7^Z|Wy zdvVFF6V|1^g-MY)x)F0COpl8R_o?~|z2>rF^QPD(xk>TU6 zEO3t4<@!;c1#lk%6{KVEf6zdPNtEMHNZ!hh#be4Msmr6fQwHd^l1g>KrVr z_~#neKM9{5p%m>!*@aWXUi;P!MDA|$ zB=5O*K&FT{%b3FD*}=JwE09h0j}d4ZDu#QH`3ax?**h&DQK!o0TZMaY1c%yZHIG*c z?&`k=`dU%w4?IQ0bL}8`KF;{h^a557klmJ3dCa2N3>J>|SrTuH!5%(E+>5TArZ>WC zhKasLyXT_zP<{~EiT(0vnFRm$g@?dKa)tCVzGirCWRdUvi z)Sn!szZ%MXwj<}!H%Kl&eu4RBq1l0*f(Kl81D0I)j_SyJ zfY*qTL|iAyG4u%N3se{s6>pwSPM*%=u_UVuDJp9ss1VCI zBBi|}vwbbA(*z3eqYQ5Z1?iYMrS_NXMN1jOi}})}cx`!bf5JDa`JSg8)~w?6`G0T8 zXqz+oC zW*g9s9&2SUNfum=*>ARYQ@8oo;kz$J!w|KkrKypwZC^HG$GjVzhmW|c%}6e4gNzgA ze(m@Trnfbmj!uc3X;AQbgKAiLl0!|Z>4vAJo}aX$F6CL~r+pah=>mJ?Q5Kz^=keN- znFb9V}B52p zNf>2< zHPp84i@43*WkPUp~Z33A{sir`shu|j%ckh%fPd9T}o-D+| z=`>J`THXlwZwhqyzPelpW8f4Bm+l5UAo4Q&zrzcD`IlTuA|{RGT)a^JvlBDb$E8oRRj&Qx0BEJYup^Zq99Aj7wCKY>F?5@>=@e)`FUr)l;D#P;;*jcGJ1-W0T6;}aDs2zw6_MqCyNM6-dD ze^-^8B)C*k*N2+4d+)cW+=;W{v6UGvWCp_9b@d7zW5>*DN>s7j3fi%S~wyU<_6n_Q~14r$s`Q)QYlL)6R8 zelxQ?6kCie@Ax_K#(KMxaMOpey{P}maB_A}=Ozr}G+KUHJWd6FrE|u2UpO3d>jX0R zbJ`{cpTHlWoOhtl1=lf=U56f&J&5-P>Aua>AgZ`Rk>SUdm)}KzfGZG^!|o9}b!Wup zSY?`YRgf3^JmlYSASgW!@MqzPuze=>MFm3(BPp2qWe;O=_fXq?2akthFs3qu5UK2 zR$SpUJl+`E90lYrTTc&Mg*IXra%x z?`uZO{Q}JCHTx`Qt>nDk@2!^KrsQ0oX|>6qy|-GSAM;Lgm|>h@8MKTNoCyFzhOyt* zpZwrypc0$KE*uwC>E+Ryu#7IKF+Qw54u~c&Ur@B*cs2CGV)s5TEe$0r`WSauL#_R= zWi@k%oBB3K(21AGvZs(qNs+nQ+=*EAqcyIdfBR*>pgiiMe_U$y$>W%0UYTiwOL}c7 zS2wP=Y<^TqVNq8He^80!*QFakA;in#BIghYX{J9I=`5y=fNU3637vb?TdsNwfTuAdx5HjlF=i62JrY2TZ=GvwHtc-_^cDNjf zjA#X2g#5-{kk9$%jXdAQZqL_r7v-%3fj`jxEQ#-Ku;Qy! z2)dJ%0!`;c4I`zh*KU*3ZP(lZwnliy#@B~XDrJE3mBj0J$M*O*kHYx=8SEMAPFi7O zt^OQaqXnPQDE^+eHGJXg<5SS8tWQRd0vX8C2i!HR2VHGUsqdsI3Ahr z=1yR>#@wqQ2RF{20Mqk+tvhsR;gk*OBA(TG@$62c2?JPlZam%I=$kLY=2%TjKNYE% zYZY77cAWI{Zk??WerOae%pw_i(2tu^{NwAzk?~u4c4iCI_pE+r5*9Ku@7$ z+=onDv-MzK*!eBPG^T9{U!l(Hb}U<2dD4iEu^TzUx$ATcH2F4@6{MC|;%I)YDj1G9 zn%w{CQMAqQ3rZI{&TMG_=W4!>L1dinRz>sPY-mO+vwJXIgtmjzWP7TY$>F!5Pn4qG zuZ*eHff=uSn2z^kf&o!Ja-`dYofb;oy(YrK7sH93bFZk$H_Qhhp+I(zZ=7;U^Tc-sDL z-$?qGb4sa@*1Zq!o1-myq~G@`OsjeeiLhkc)abhjR;&*W3Y)(YE+cs|Ozd5U1XCXi z_8e@If5@Q3!O}SD0h*OyKYj`N@^U8Mv0|OL+e;mh1G5|zO5g(vUo>31bfHQu052iD zHPI!DiM*f^;)9)4&&Y&B5!%xoJF9|0PO{W{#Hbw7kTf1Hp$r|Oz(kPqERG{Q);{mk z$?z8M^Y}%J^P;?-T|d~U&o^*5_}8_IAmXVSqUh`@3OcwbH*zV18)d&qn0P1JR9vl3 z=`OU>f&8*2#!soUFwD*9VMC$oh&r*G zBmf9ge{QCF%@I)SX+xXkOR|3SI=CyLgX((1b-?d22Od!8*A!Ow?alMYglkZj<_rqs zO8RJF{-WrJ-O+#?u!Yo9`C~P^n>=$3&(wmBKv=h7?C6Ds!=XOC78W-I@u4D~`D;ho zi!BjLi}z#UOBmD6Z3$fVT3tE=%xK6@2w)iS+;$@wA!~)qqWRh17ko;UMTiGs%7u?f z3+AeOPe0TVqMkL9pg`}6jL(DiipK!`Y?~`G6bNqX{%YG*wYY~Tdh)qTc|4c@CfWk; zC`BY~A2G)bX6Ad^fXm4tfz^RQud4p<_Du&`5wrSq5m*Vil}4o*zf>rZgoTO-6|-&x10Rzf`Do6=SpNypiy6!CU^-#k}Q+_b}aG`N{|^c-Q%3 z59RQ7Q^;Z!`Cf)?x44Q2`V?}!=K!hriAtyA(jv$*V=PPMFmkJ%W2>Q+0{d!;hIqHF?&2CT|pVQPh$Z$H1RnyD9 zYo>Y#OqT9F@2armm(=mJhG(kM;@98TK)8HR%Ys_c@>vbW_0IbYS$u8tp)5MHhPcaT znhXP%C|m4+D~@f8t85{{cLy5I%c>S9rG*5ZVYtQ{5{e34ZZ99#Q{-lyN5fO5>_L+R z^-v6UHj(pw=u8!Rg-8AY+8hWQS8*_Pk~Y_?M_Pd|F_yfQ5onzo{!eWac!98;`( ziljfXsYEtQ>{3BG{00n{7w$@Yi>?dXVq~D6B3%gV?HcmPa(Ur~dKOxetI+i4<}lQrRoWS9d*; zRwyV%h`2gLs42`!WtTPfq5%0bjQ8e+UkL;&r=Mlx>$R4?OlHN)RrldefUZrXlCOX& ze}Sq)q^V-_nO6qRDQOzV5v&@4o+DQZ%(&dMoI(SJ6e)q!L$r!{_9X3> z%9e16)jQ0OK5L}jIWw{6%wC+oEibWGpCgY&AkTi&jGg->4r=t^PSu zy)f%j_c9iKY4^^--fycKpUrZ;KE@)FntAyu@^as1A9{fgrmstspf{sBl~+|?m_Jol z(ObLHcjw!IBOmnR)^Nip;I?7*3H63zFlR8&pGJOOgT7KjiCc}lgE*UC+(#?49BiB9hbL5UG6sR_r{HGH zaMqGH<}zJbL#fd*3Nf0QQ85~caWSzO2TF)*rkgbT>l=r4)qGg%PLsBgPdfG04Kgb? zY;mxF9|F@%y6+iGS~ygkKSq-(Qaa{`1LKG!x;xQ`?oezW1=r7?Nzfpw^=_QZ8D=Bu z2n>+(qvjPommF1Mh^AWCO5MWAIzlIknCxl_pCC{cCUh;)Oc3tP=?VT*2o>htXKsRP%ijjr0NiBE0x*8fAZ5puk6@76iU`{^37#`w9Yr^oRe@#K_T<&cIa9%-T@TQIAeiMr1smPiB=K zW$?lis_9i5vmC+#}v+Lc!X7w8nA8zgCV#5TORY3)RSl#mU)F8(ghHzQw6Lt^oY=a}}I zD}S8${-g0%Q#3V3YUmG~3GY8-B4|NZjO`@&Bl`3iWe?{ zd}=s(!}@w`J#jVc)l}FqlST}6n_8gu%4jCF&D`MwVPn#GIH027;gYm3!#x9ibhVEq zc<|8xW=)M5tHic<0}fsL!40%cBJ3;Et&Rm57&HH4_~MRhgX4W#MqHHi28x-Jj&p3^ zf(A+oV~F@fEoAYOH_FGh;un1a{zvpa2iCL+XeS1Bfk$SJv7 ze5NZh|1};Xe6}AIajDFBB5!knA*0?WwftH@zJE`Hd959$SSRhGCP;L1dTYzL~v1(@(*4T7}>b-`uRJpa@vFNRjM{##$FBHT8z z(T9r4Hu?5E#%jvQ^OwaKh0`2o==$CM)O?w~%P{~F#gwnWG*W(4LF|lmx8}5Tj!?sW+8IkbkatT9=X|ODP$`e4h=)n>la9L(rv5N5M7CBDz+? zV03m}8JuiRP;|x1R``u)@*+yBz5q>Zm%<>RME}=ARsR^`VjiTE76A6aor`1lYYC2+ zv1Fj^^|NshfR#$*Y03e5?IP5%a%JkF?fEQ>SKM?k@Y|l!wm7E!_r}Oi*hfL|N#<6_ zjV(Oc1oGd!k`*nacGaXtSZ(z17ZZMG5+mLQWYmZYRf8V-2tIF`{ij6h;fD7VXLZV^ zv1{5W1<(8GvP?p^eQd&V{K}1o6J1 z)s_3zVTojk5DAH0FN*4&V>)tqT(zpBtCanWGoIGe8QejW3p->x4N_k(GdsRWj2U-p z#y(V$0Y(~}s=)nCgG!Q*rrxp7jcX-~?Gq+@P2s&ZT&vEBbYBAjTv1)}z1dw-*Q@iq zqV$GtiCl10{H4`(p~l;*oMqz7z2GvbO7v%DaWbURUc3o$(!uzQ6Ze}b(mzq zL>zw=^HEo(eRTNrp?gXd7#&s>x#N`&6fd@livE3)Ya8U|^A7xO3gBy26#?c?1hZyrod9ENc2O@ns)dC~xZM$n~`{!Yl3 zRG6DGCg9Uphr9&Iv}SWaoU&2QOYtF&LwxuOwS2}f4zmkf%G>&82t-zt=Jv!STJreh zD4avOFK%6ox!Vn0xLjC|W#tmFQX@V6j~yr6#>q_e>$xFL>31xmZ(kK>Eyx`mD33oG z6D&7pWnT*>isZ=H1+D#z{dDsqV`qF&4YFLf))+Vpucw?9=*XgoH`HW<3xsRkD40dd zIGb28e!-~cbwTz7^VSuBo`HeszC>&5oo%7MT9S>6l3A+{$=GT7EDdfqF(188F$ZBs zIRTTzXJh5~X%{Weu%YbLMOudEqR2Yji<@WGe+?p3TH~E%X`yl2KC4;NPi@;)@Ym$H zKN0Xnm{SZokH14JvJ|R&$I%^O94x{ZgojIxPm(!65)#9Zl+*XK z?3>T;B7OwiEs=t_+>Q{$&M2RzikVGHgcE4W6^i!$6F9fC{+7JT#g!4pvv4lipDbkw zXVxkcR3+;~1Xm@yZR}YJ-SQ&}bl|(KAx}UV4h?@+Bp)@-+3j-P%h_1gY=Lniz8#%b z8M1Sxrd{QY%(DmuMsDy{TbRImuZHHr{ph%oIV~#7Htz|kh{(u3rP%sNuQ2UouUI+~ zdc|QH%P+U)Xzmc?W~0KB$-|yPsjoJeY9+~5{u8yA_;w!)!xic_G){UD-D=MWhli*i z9Yywc)DxZmCbCdtTg-HZHOP>+feBW8S|y+gRkUJ~5W~tKSU%`3__p{m9q2$8wmzZL~(TakK-F zao?(t{~k}9{Cf?ysn}n-)*CUI88vVako`F8H0(H^P6*&^#X?lU4rB1@U~|I$SlXGI zX?iIwF`S>uVkWIUSiV(f?59?FQBgkJ=qD#mR2p+F`j$gV6@Q}`Kh+0niMhH%@2eX5 z+62@&sG4OVF3OL22@gcR??IDcL7SsD=c63!;GnD%Y78>SkV^W8Q!X4wjxbEnyPtf9 z*1P<=kQM+4n6hB#Z9yIh?TOoWyqsecaSSlQ-;$O>@}f#D#N0@YSR0zG#Rl-W6IK&p zvk^{Gnp%vian+644(8R|{p4??*37|#w=bzVJiolj={!t^uT;6)XV>h+YD`3u-5&!W z?%fF6zkO%te{tPfI1^El7FKHQn|*P%6mvOew%`K-xb5s5!(6rkXHgA}{$PD2V;zHe zKhfBaei^msVs3+CM8!5=2L>k&qTbog1ty7`NVBddQFKs$1pY4s{!5%*kE|Qhz02mL~eDkp=`*p%y;n3kFL84W1C@+vm=IAD# z=-$FSl^;VZwxPNj^)h;hi@s9~Vk|!rMPlmUV%( z-9)HH$D_5T#s(iFV`yf?pL<-QMh?2ovX%hi*_4Nsba;4Rr6w>VV)wAt8VYTbEblBe zUB4TkC5djy{g4cwxbhpH0u*ox6jw0z3!72SyzH>NINzNL%cy({JHP>mu~#N-uXO!2 z-k(l{|31hscbn2YDxn~44J1YlP49Z;?0HwqHGxA>^j;w~3y4&ZI4aFMHJlYLktgjt zHFsL_S(7sV<0h1C?EAb{{(zUrI1mubzW^rAB@GE+qt!RFK3n(ruK0vMcy-aOn#(cv z>noz)u$LU|8Jrf)y0V0LYB7yC(r~?<2JUW+I5X<-vr`cX#WH!0_v%7JfMc$rIg!|k zlsUS=qPa+#LTl%y!Aaw4#r?zM*v`}7i(O#Qpx@KM9lH*b%pM|C#>o~=)fX!jekmDJ zQY3#MZS9MpAA$ceIT3B3s-_U>eGCCVyF%)VCHYp1eW_8BWF$eX5#>!xY?JaL;kNh~ zgyg#HvzPdtSrBv`sUdwGLxXYMB~s?2VcwUWA-ykgM*8U%u0wZc*p&OioOr@9L|ip= zb!m=R$wxyIr(z|N+6!1``N=J^+x!K=vR$meD3zB2%o0~Y=z`713@gj8oAuXFqmnat za5h>v;xF=S!N`a=hD2M=fO9vPSj)EjB4&8oJcF=-l*Ci`{wtdP@9vlrYT@r=q3HQ+ z1P&h_%jXtwyA`PuQBA+k{A;5&)i0b2_800(Q{z0UuRf_Y6~`>0kZBxU&5m)MI1;V` zLL(kzI!Uqjf|F)^@}4SN21oE(@ozWMH}7R3+xn;wv+V&_z6DX9%9)~csucG)F-q0_ z5t&LAZkM6WO0C}Z6`U-3a|i)!lO-MFm4G^0{N{J@{5FPfJJ!8l43tXCHCxw|V{b2pSLX?!qO>fZ zt+Oinp14y6cipV-SfRM^`eEcjhRcp{lYIoo%(AxB$ItoHH})a#5txB=E7FCXzPc1C6)=A zArGtrTNzLOZMwAOKb&(ezd!8*X5LLkZpCnJ&ox8|Q@JK&k?)UF<4iSV>eGme$Ex6~ zL->`$G$EVFK1G9NRo*av=*It%_i1ZU55}MX>Oy5@(Owj8fd8A9FHIA9xgsdG9erPS zvZz0mEer=#O4@`0=IIQ@hrVg&pQ&xkpS11CPFVwu^j6qqsh<0O6)-5vO!;sO>o#&z zR8J?gl5Rt+mF}!aQYA|a#4Qs)NOp`54;^u0=FE62nkTKhIV@!(V=`X?oc^`Lr?bb> zEX?yKkun$B&53ACNi@$Os;aJHVfa4%l?mIlq8;ABvh2Q9EJlT2XTQ=E z&g?JEboMP#N}v}+@7SETPd7Md9B7k_KNP`=JGDMfrMYo6(|<{$dKl#X?y*==6%W{o zuZC-n?Tt4l)>kQ*OkXeYfEVU#oE%iCq$8IlKRXf2lN&wmt%oMlSxE9UbD!CVnAzbz z6vQEtHCn`3>td;Szd38kMO^NBngo3IEyLB*jVn_e1Txzk^U0ZvdecSfm9P=y(wx2n|xnOKZ<8F%v{;9f@kyO0m$Jf<_o2 z7a?!lA5ScEIu=215Pu@Bf8-H7G><_kF!vo7Y#Vi^6u68`EYFJT0CreHT6ReCBB?40 z;pmarqj(xcMVZ^qrB0WxOC7>!7axQY?O9ynwXZtrReH@r%HJUMrIfsSS_n3>=QfJ2 zBRCt$kE zsc#a1dPfh$$ZSBeTTQKGo2T&4ZWSdv62<;_d6h_6m60MUkz%U&xp>NBaTce1v_(E1 z0h>NK4LRHcjroG>*9dk`*P-l+`=5_*R?kmSnzbPpJNIj$sdgQYZMDM!H#Ct6Oq11j zB=>psovlZSo3SV792f9k&$-y_T0?diYR$O*;9gZYgGu0Ic{jS0pC8N@Vt=2IPDY~E z$JW6n3V|+0q{+>&D)9rVGAjyE|1->s4$QxuxO`cIq$+$kdCd4|w|_7FdE+&i!Dks!Y6fFo`|po6YehvbT&Tp1I|dgl)% z_r@S_of@%>G=VWt!x{%N;EQRtGx}D>OY8EhO+>eH?`$d=v-chS{~ljpoq)bA3gL6; zO$y}!8zDXMV3%de9>gS1pGDmdTv%Er_wl?$y7t$@`atdXTXl&_5O;_fs$lKzTc~Um z^7e&k3BgKw_kdX{-#;Y)LUUA@+rI$r{WBKe?MR35f|Z8uM!%0m{iFKgo1s!LgPs=P zbg0jbP2q9Wh!NqNJ5GZ$`vSgw36w14ZYHT>_oc#PGZC5}3F6gG5uQNX=r~a&SyfT1 zyGoDS`Bd;}xLT^Z{43RRyHw_~_n5;-5JY&83-t9&s_RWgq+){&%r}f$jF4X7z2)ED z{r;HW{|QeuFm2wSe)5s><)!!Y@fp2w9Fu;P{K%1Zan>S(`~1ww_jcN;6T)`d=@Z8G z<3lBxN~+ry@ygHcS{~U+6>5`p)o`<;7}Nz5Ea1b2r!(iV7RrVXv@ypMbPA&~$4hI* z*sXM4l`~6|@aL)%F-_5Y0L9A2`wExM*!(nOa|YYnCO>4{cGzYup#qOW8B_8D`)^cU z<1i}7_J6JH%A{9O7mTO=b@<}8h^;KxS;@a5!JRbjn%^xPBZ^JpR3t|{qSeD`lKRCY*bO zL$*V6O}<34D9bq^Q&QI;^{bn#KWyNz*90Nb@zyMUD9L4>^dm#jWSq256t9_@*;726 zKag_u$T%pXy?J^v@rS4Becb&!OI^y;$*0hXAlg5fOPa4N0n+U-NVcfyYt$IwV^w~6A- z@c3}s?9_g#a{*VyqW93hWp1MM3F6^Dcyy&z0cC{piM<0sgy<$@;sIC$py=Z#gKrT< zR(qXO$bLb&d2OeWkXlLbN=RYSLZAf6u$&_Z?7}*PSe6P20gcHw`ttGEuak8;Cul8W z!UttMG}GxWH?uTT;Rp%kZL%4>1P2xQJ>Q*I-JZ@>yH^m$;@w&&kUdab$rp zBogH6V6jrDs*{t)Z|k|_bE^!EukE_^*U@SLJ9!1B>-G_kaarQy4pJL8Q;mG9wyZBw zPQK)8m3OWVptgTe{sE-Ca>Em8>tIP|Snmz9k56h?5Skj|`?`dSo!9jC7WBWki{JA;$HrFG4kn(9 zJs?~?i)!90Ew-h`n~s1Ot+!4?_D#`!BQXPnNPdf6cde*GYa5Lz{LNe(} z)Ona32NcH1Ti&~O^EiU2I5t*jh|qQJW$4ye7Sb1~9pvw7Ty@wM`$L26Ico44QFzi_CzQV zJiNch3^3P@@}mETf1{eJ!wNrVHPMq_(7$>39YESUf0$CJeOs(DW*n**CU){yL@TzG z=g6}cLydD6K1MBG%p*D$V~I9r{Dl$TS^2*h?$f2kZ|~0_AQzf{|EqLPpMg~i*x?0<#nI1w$9qk)sVn zL#9G7Cm0dBnIR7OsUQbtPMY^KjJTmHo#{TmEIF{~gR2vM@;g)O7~^S>$;8&xCx88R z0pLw5h9-VZNEK7&3o~?2Lbm zF|OG{oH4i=YpgM{S&tYpU&?r12=TZ@UI?KSvzfkVZ2&XlOkeE2(@fvjGTF8tD(qTC zTqLwh>y9q*y#8k@~p1SEJBMvo+si1~f}eZjbt4*Cb($^^gI$Ox+MWD_wm8J&XkjGU;hcV)x^^ zrd^*(eBndMB%`%iUj?RuRs3vIy3r;RQB-uV1kS*he`kF9j=a*sSqHG)cq7Hi4f#X5 zP9DCu=XH4oNWEf!07?HB_3l?;$S}=sXpw;^+4%)xBvM#r8-!AzW>8|aQOrVl%Q7k8 zd3s_F(aimM9D*smc@zXv6lNoz^f`-10A2EK(>XHoGZfz+tf4obZm$L5KhRd)Jg8a$q;kuW`v$yOo6ytsvbMu_ zLP^ShtsW>W#!!QnwL1^u1S}}I^PTTYl@DCd^yC>#>n!D$)v!|CSnUh zn9K8y$RZl%P{c%J#>35O3WkMsOEL^5zrYB#C|IJ@NO6A#7q5WmDIoQNFg4_G(k*PO zyp^v6Y-_H94zBxZpG(7$!V)LgmF8ASLQY;(Q3peV9?t?=ZkTSk67KMhxbM2*7vls^ zxFO@gozR-q@GV)3wQ|+->W>9U zM7J`$pb4ILucVn+t5R;O zyZmufQa5JmKW6z;(5CB>3P_IU?`nRiWaVmWNf@6cGcS*HCUcn>I=$ie$6#AaV7Vy&yWcOMmtx{o6nTn z_?~=6p=&SHJe~@MU#PtGF`N~qbA6Y41131)2U;5TQ0tXD{C&75<}>cp3yux(JUYZx@S>RK zPm*tV##c7Z?inA(>L)uXeKpcVJ1db%uh>?|CeqGhsLg0D)s}O9GvF>en}DRc1(!`& zym@>p@zjB5>JzAtj&{j*w6YI@M^$@a(>eMMl$#H^gMjJaFdYh44)5FHi6ift7C8@A zV%N8E17z;~O`LznYM@@?n58K_s$|arYrq|zE#%Zy%_$XrIrRSK{9mj@LdkJ1TB=>LXHh4e!H+Fio!FYl! zwC2%2kg|Jofk%J^-S;;LDg05(&v?{4waRQX`%7TfLuL(__m~{Y>+|}EoR`^{e`#CM zv^!vGJ*%)W-%I3jrzvBoGk(Vs!(^)h|F`o# z)yR3;oKQTWQtm3>@e(HD=1L23WUl8#uD;{?3!6xCRNR@CC1@^=VJNrjd%m9vrUBFkuote&npfoKuejJb^J+KK%3&dK+Hfm`Tv`$%)cFP)%*#X|KwEv z2`d5mzpoir0NFSvoUW@2BJe*P2!F_8zzm{cqwvlBIX{#9Was*lA{(r$&-dE&XSPB( zLIjh%B0iK=t%8*G?zI!GL!g5r`gvS8%tyZ+L=FQ*@ K3cRU*Su5G?K+DUyl9%V9 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 btuV6re89K$I*kE|0f{s-2}xQ30pR}tfH3`z delta 40025 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 diff --git a/web3/_utils/contract_sources/RevertContract.sol b/web3/_utils/contract_sources/RevertContract.sol index 07f24a7d9b..812e0b0a0e 100644 --- a/web3/_utils/contract_sources/RevertContract.sol +++ b/web3/_utils/contract_sources/RevertContract.sol @@ -1,15 +1,26 @@ -pragma solidity >=0.6.1; +pragma solidity ^0.8.4; + +error Unauthorized(); +error UnauthorizedWithMessage(string errorMessage); contract RevertContract { - function normalFunction() public pure returns (bool) { - return true; - } + function customErrorWithoutMessage() public pure { + revert Unauthorized(); + } + + function customErrorWithMessage() public pure { + revert UnauthorizedWithMessage("You are not authorized"); + } + + function normalFunction() public pure returns (bool) { + return true; + } - function revertWithMessage() public pure { - revert('Function has been reverted.'); - } + function revertWithMessage() public pure { + revert('Function has been reverted.'); + } - function revertWithoutMessage() public pure { - revert(); - } + function revertWithoutMessage() public pure { + revert(); + } } diff --git a/web3/_utils/contract_sources/contract_data/revert_contract.py b/web3/_utils/contract_sources/contract_data/revert_contract.py index f0697047f6..b9f44a89d7 100644 --- a/web3/_utils/contract_sources/contract_data/revert_contract.py +++ b/web3/_utils/contract_sources/contract_data/revert_contract.py @@ -1,12 +1,34 @@ """ Generated by `compile_contracts.py` script. -Compiled with Solidity v0.8.19. +Compiled with Solidity v0.8.17. """ # source: web3/_utils/contract_sources/RevertContract.sol:RevertContract -REVERT_CONTRACT_BYTECODE = "0x608060405234801561001057600080fd5b506101aa806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063185c38a414610046578063c06a97cb14610050578063d67e4b841461005a575b600080fd5b61004e610078565b005b6100586100b3565b005b6100626100b8565b60405161006f91906100dc565b60405180910390f35b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100aa90610154565b60405180910390fd5b600080fd5b60006001905090565b60008115159050919050565b6100d6816100c1565b82525050565b60006020820190506100f160008301846100cd565b92915050565b600082825260208201905092915050565b7f46756e6374696f6e20686173206265656e2072657665727465642e0000000000600082015250565b600061013e601b836100f7565b915061014982610108565b602082019050919050565b6000602082019050818103600083015261016d81610131565b905091905056fea26469706673582212201bcf63171d1edaa8e200af05c22b99aee2cc9f22b65c86f98f9722c252ae5ae664736f6c63430008130033" # noqa: E501 -REVERT_CONTRACT_RUNTIME = "0x608060405234801561001057600080fd5b50600436106100415760003560e01c8063185c38a414610046578063c06a97cb14610050578063d67e4b841461005a575b600080fd5b61004e610078565b005b6100586100b3565b005b6100626100b8565b60405161006f91906100dc565b60405180910390f35b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100aa90610154565b60405180910390fd5b600080fd5b60006001905090565b60008115159050919050565b6100d6816100c1565b82525050565b60006020820190506100f160008301846100cd565b92915050565b600082825260208201905092915050565b7f46756e6374696f6e20686173206265656e2072657665727465642e0000000000600082015250565b600061013e601b836100f7565b915061014982610108565b602082019050919050565b6000602082019050818103600083015261016d81610131565b905091905056fea26469706673582212201bcf63171d1edaa8e200af05c22b99aee2cc9f22b65c86f98f9722c252ae5ae664736f6c63430008130033" # noqa: E501 +REVERT_CONTRACT_BYTECODE = "0x608060405234801561001057600080fd5b506102ad806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063185c38a41461005c578063bc53eca814610066578063c06a97cb14610070578063d67e4b841461007a578063e766d49814610098575b600080fd5b6100646100a2565b005b61006e6100dd565b005b610078610118565b005b61008261011d565b60405161008f9190610173565b60405180910390f35b6100a0610126565b005b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d4906101eb565b60405180910390fd5b6040517f9553947a00000000000000000000000000000000000000000000000000000000815260040161010f90610257565b60405180910390fd5b600080fd5b60006001905090565b6040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008115159050919050565b61016d81610158565b82525050565b60006020820190506101886000830184610164565b92915050565b600082825260208201905092915050565b7f46756e6374696f6e20686173206265656e2072657665727465642e0000000000600082015250565b60006101d5601b8361018e565b91506101e08261019f565b602082019050919050565b60006020820190508181036000830152610204816101c8565b9050919050565b7f596f7520617265206e6f7420617574686f72697a656400000000000000000000600082015250565b600061024160168361018e565b915061024c8261020b565b602082019050919050565b6000602082019050818103600083015261027081610234565b905091905056fea2646970667358221220c90b36e5aeee601ff5cbcb4c09ca883f8fb491dcd68715bfe22db08d2cd76bd064736f6c63430008110033" # noqa: E501 +REVERT_CONTRACT_RUNTIME = "0x608060405234801561001057600080fd5b50600436106100575760003560e01c8063185c38a41461005c578063bc53eca814610066578063c06a97cb14610070578063d67e4b841461007a578063e766d49814610098575b600080fd5b6100646100a2565b005b61006e6100dd565b005b610078610118565b005b61008261011d565b60405161008f9190610173565b60405180910390f35b6100a0610126565b005b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d4906101eb565b60405180910390fd5b6040517f9553947a00000000000000000000000000000000000000000000000000000000815260040161010f90610257565b60405180910390fd5b600080fd5b60006001905090565b6040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008115159050919050565b61016d81610158565b82525050565b60006020820190506101886000830184610164565b92915050565b600082825260208201905092915050565b7f46756e6374696f6e20686173206265656e2072657665727465642e0000000000600082015250565b60006101d5601b8361018e565b91506101e08261019f565b602082019050919050565b60006020820190508181036000830152610204816101c8565b9050919050565b7f596f7520617265206e6f7420617574686f72697a656400000000000000000000600082015250565b600061024160168361018e565b915061024c8261020b565b602082019050919050565b6000602082019050818103600083015261027081610234565b905091905056fea2646970667358221220c90b36e5aeee601ff5cbcb4c09ca883f8fb491dcd68715bfe22db08d2cd76bd064736f6c63430008110033" # noqa: E501 REVERT_CONTRACT_ABI = [ + {"inputs": [], "name": "Unauthorized", "type": "error"}, + { + "inputs": [ + {"internalType": "string", "name": "errorMessage", "type": "string"} + ], + "name": "UnauthorizedWithMessage", + "type": "error", + }, + { + "inputs": [], + "name": "customErrorWithMessage", + "outputs": [], + "stateMutability": "pure", + "type": "function", + }, + { + "inputs": [], + "name": "customErrorWithoutMessage", + "outputs": [], + "stateMutability": "pure", + "type": "function", + }, { "inputs": [], "name": "normalFunction", diff --git a/web3/_utils/method_formatters.py b/web3/_utils/method_formatters.py index 02e02f9126..c4771bb0b0 100644 --- a/web3/_utils/method_formatters.py +++ b/web3/_utils/method_formatters.py @@ -94,8 +94,8 @@ ) from web3.exceptions import ( BlockNotFound, - ContractLogicError, ContractCustomError, + ContractLogicError, OffchainLookup, TransactionNotFound, ) @@ -759,10 +759,6 @@ def raise_contract_logic_error_on_revert(response: RPCResponse) -> RPCResponse: raise OffchainLookup(offchain_lookup_payload) # Geth case: - if len(data) >= 10 and not data[:10] == "0x08c379a0": # custom error processing - # raising along with the data value to allow processing in user code - raise ContractCustomError(data) - if "message" in response["error"] and response["error"].get("code", "") == 3: raise ContractLogicError(response["error"]["message"]) @@ -770,6 +766,13 @@ def raise_contract_logic_error_on_revert(response: RPCResponse) -> RPCResponse: if "execution reverted" in response["error"].get("message"): raise ContractLogicError("execution reverted") + # Solidity 0.8.4 introduced custom error messages that allow args to + # be passed in (or not). See: + # https://blog.soliditylang.org/2021/04/21/custom-errors/ + if len(data) >= 10 and not data[:10] == "0x08c379a0": + # raising along with the data value to allow processing in user code + raise ContractCustomError(data) + return response diff --git a/web3/_utils/module_testing/eth_module.py b/web3/_utils/module_testing/eth_module.py index d985c07399..6baa148d9d 100644 --- a/web3/_utils/module_testing/eth_module.py +++ b/web3/_utils/module_testing/eth_module.py @@ -55,6 +55,7 @@ ) from web3.exceptions import ( BlockNotFound, + ContractCustomError, ContractLogicError, InvalidAddress, InvalidTransaction, @@ -977,6 +978,44 @@ async def test_eth_call_revert_without_msg( ) await async_w3.eth.call(txn_params) + @pytest.mark.asyncio + async def test_eth_call_revert_custom_error_with_msg( + self, + async_w3: "AsyncWeb3", + revert_contract: "Contract", + unlocked_account: ChecksumAddress, + ) -> None: + data = revert_contract.encodeABI( + fn_name="UnauthorizedWithMessage", args=["You are not authorized"] + ) + txn_params = revert_contract._prepare_transaction( + fn_name="customErrorWithMessage", + transaction={ + "from": unlocked_account, + "to": revert_contract.address, + }, + ) + with pytest.raises(ContractCustomError, match=data): + await async_w3.eth.call(txn_params) + + @pytest.mark.asyncio + async def test_eth_call_revert_custom_error_without_msg( + self, + async_w3: "AsyncWeb3", + revert_contract: "Contract", + unlocked_account: ChecksumAddress, + ) -> None: + data = revert_contract.encodeABI(fn_name="Unauthorized") + txn_params = revert_contract._prepare_transaction( + fn_name="customErrorWithoutMessage", + transaction={ + "from": unlocked_account, + "to": revert_contract.address, + }, + ) + with pytest.raises(ContractCustomError, match=data): + await async_w3.eth.call(txn_params) + @pytest.mark.asyncio async def test_eth_call_offchain_lookup( self, @@ -3225,6 +3264,42 @@ def test_eth_call_revert_without_msg( ) w3.eth.call(txn_params) + def test_eth_call_custom_error_revert_with_msg( + self, + w3: "Web3", + revert_contract: "Contract", + unlocked_account: ChecksumAddress, + ) -> None: + data = revert_contract.encodeABI( + fn_name="UnauthorizedWithMessage", args=["You are not authorized"] + ) + txn_params = revert_contract._prepare_transaction( + fn_name="customErrorWithMessage", + transaction={ + "from": unlocked_account, + "to": revert_contract.address, + }, + ) + with pytest.raises(ContractCustomError, match=data): + w3.eth.call(txn_params) + + def test_eth_call_custom_error_revert_without_msg( + self, + w3: "Web3", + revert_contract: "Contract", + unlocked_account: ChecksumAddress, + ) -> None: + data = revert_contract.encodeABI(fn_name="Unauthorized") + txn_params = revert_contract._prepare_transaction( + fn_name="customErrorWithoutMessage", + transaction={ + "from": unlocked_account, + "to": revert_contract.address, + }, + ) + with pytest.raises(ContractCustomError, match=data): + w3.eth.call(txn_params) + def test_eth_call_offchain_lookup( self, w3: "Web3", diff --git a/web3/exceptions.py b/web3/exceptions.py index 6d598447f5..5ab804caf4 100644 --- a/web3/exceptions.py +++ b/web3/exceptions.py @@ -250,11 +250,13 @@ class ContractLogicError(Web3Exception): Raised on a contract revert error """ + class ContractCustomError(ContractLogicError): """ Raised on a contract revert custom error """ + class OffchainLookup(ContractLogicError): """ Raised when a contract reverts with OffchainLookup as described in EIP-3668 From 224c1c4a8a2affea9fbddef73b958b6d219a6a0e Mon Sep 17 00:00:00 2001 From: kclowes Date: Fri, 14 Apr 2023 10:16:33 -0600 Subject: [PATCH 4/5] Add tests for estimate_gas --- web3/_utils/method_formatters.py | 14 ++++----- web3/_utils/module_testing/eth_module.py | 36 ++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/web3/_utils/method_formatters.py b/web3/_utils/method_formatters.py index c4771bb0b0..b740493ea9 100644 --- a/web3/_utils/method_formatters.py +++ b/web3/_utils/method_formatters.py @@ -758,6 +758,13 @@ def raise_contract_logic_error_on_revert(response: RPCResponse) -> RPCResponse: ) raise OffchainLookup(offchain_lookup_payload) + # Solidity 0.8.4 introduced custom error messages that allow args to + # be passed in (or not). See: + # https://blog.soliditylang.org/2021/04/21/custom-errors/ + if len(data) >= 10 and not data[:10] == "0x08c379a0": + # raising along with the data value to allow processing in user code + raise ContractCustomError(data) + # Geth case: if "message" in response["error"] and response["error"].get("code", "") == 3: raise ContractLogicError(response["error"]["message"]) @@ -766,13 +773,6 @@ def raise_contract_logic_error_on_revert(response: RPCResponse) -> RPCResponse: if "execution reverted" in response["error"].get("message"): raise ContractLogicError("execution reverted") - # Solidity 0.8.4 introduced custom error messages that allow args to - # be passed in (or not). See: - # https://blog.soliditylang.org/2021/04/21/custom-errors/ - if len(data) >= 10 and not data[:10] == "0x08c379a0": - # raising along with the data value to allow processing in user code - raise ContractCustomError(data) - return response diff --git a/web3/_utils/module_testing/eth_module.py b/web3/_utils/module_testing/eth_module.py index 6baa148d9d..4f1c6880f7 100644 --- a/web3/_utils/module_testing/eth_module.py +++ b/web3/_utils/module_testing/eth_module.py @@ -3533,6 +3533,42 @@ def test_eth_estimate_gas_revert_without_msg( ) w3.eth.estimate_gas(txn_params) + def test_eth_estimate_gas_custom_error_revert_with_msg( + self, + w3: "Web3", + revert_contract: "Contract", + unlocked_account: ChecksumAddress, + ) -> None: + data = revert_contract.encodeABI( + fn_name="UnauthorizedWithMessage", args=["You are not authorized"] + ) + txn_params = revert_contract._prepare_transaction( + fn_name="customErrorWithMessage", + transaction={ + "from": unlocked_account, + "to": revert_contract.address, + }, + ) + with pytest.raises(ContractCustomError, match=data): + w3.eth.estimate_gas(txn_params) + + def test_eth_estimate_gas_custom_error_revert_without_msg( + self, + w3: "Web3", + revert_contract: "Contract", + unlocked_account: ChecksumAddress, + ) -> None: + data = revert_contract.encodeABI(fn_name="Unauthorized") + txn_params = revert_contract._prepare_transaction( + fn_name="customErrorWithoutMessage", + transaction={ + "from": unlocked_account, + "to": revert_contract.address, + }, + ) + with pytest.raises(ContractCustomError, match=data): + w3.eth.estimate_gas(txn_params) + def test_eth_estimate_gas( self, w3: "Web3", unlocked_account_dual_type: ChecksumAddress ) -> None: From cc3f27aed2800a374adb71a15468951876e0b110 Mon Sep 17 00:00:00 2001 From: kclowes Date: Fri, 14 Apr 2023 11:13:35 -0600 Subject: [PATCH 5/5] Add newsfragment --- newsfragments/2795.feature.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 newsfragments/2795.feature.rst diff --git a/newsfragments/2795.feature.rst b/newsfragments/2795.feature.rst new file mode 100644 index 0000000000..096132b431 --- /dev/null +++ b/newsfragments/2795.feature.rst @@ -0,0 +1 @@ +Add support for custom revert errors