From 618b0f3ca4d567b6611c2f93dcf958080ed0b7d0 Mon Sep 17 00:00:00 2001 From: trung2891 Date: Mon, 25 Mar 2024 09:33:02 +0700 Subject: [PATCH 01/10] feat: mint burn mechanism --- .../artifacts/cw-ics20-latest.wasm | Bin 590952 -> 600002 bytes contracts/cw-ics20-latest/src/contract.rs | 123 ++++++++++++++++-- contracts/cw-ics20-latest/src/ibc.rs | 61 +++++++-- contracts/cw-ics20-latest/src/msg.rs | 1 + contracts/cw-ics20-latest/src/state.rs | 2 + .../src/testing/ibc_hooks_test.rs | 1 + .../cw-ics20-latest/src/testing/ibc_tests.rs | 62 +++++++-- 7 files changed, 217 insertions(+), 33 deletions(-) diff --git a/contracts/cw-ics20-latest/artifacts/cw-ics20-latest.wasm b/contracts/cw-ics20-latest/artifacts/cw-ics20-latest.wasm index da4f53b37f9be3e03ca0e81059aec13443a0ff32..9a4dd0862592d75dd90d4c2fc618dfa59e0e0913 100644 GIT binary patch delta 224468 zcmc${349bq6E{3HdnUUZCgi@z?h+t@1QH10)(jFrMFd3!MFjgww1>ZDj_%ccy4Tl4_X41%dHBC1x7(eBcU{*t&8>NTn&$Jl`NgA=NAnPB z;vM-u-R<+~0nO`83UYB20W|(aj@N5=y@2cWdVR>yP(cG^SvN2<1X+uGn(qY!qlcN-9^qni~;_kFsgbr*)jal zlhFx=q62#mxqv|$x0;rmo?fE4Bf!h25&3l@JfdkgDxrT8st5ldk)qZgu9oG^89H|a z6&wWR15t)w3u#56WX+$PoDtGP0Hn3B2D&3{RQJ#-d33!c#Vk(g4&Ir01nBQG2|>Z+02;j<_uAsLz4k$MFuj=FT@wXXYI3+XLa^mUh@XI#&_o^?IvTIG7d^`h$~*J{_xu2)>Iy4JYnQ(^cCT1L&5 z(34c~I6Xzp7SmF?hn}IQ$)cTZLAO(@HnY%BpW4~9PG5+;h5DoV!@3|rujoM?e5vMMMq%;VXG{)QQxd@(%;iR(m&RB>EYe_9{m^nTa-Ge@7HJ34A))sn7hxf z`cL}L`tPW5x65*IE4R4*i?@yXJ@kP4OMPK2{iz?)SI}Sj7y1!>vg=rRz)mR{-QL9dLaOdVHz>*Y&6CJJ;{7Kk)Vq z{(lLLaD#WF!Q=OJZ9e>b9huy}fF1hV>GcHh{~UZ%c4{T|rNPQ;mp^fBX?Y@|>n5_z;C%5`L9Fn4i!< zS8b?W%4P1@%9y%4~_RY#&$yWSKV9cwgcn+qof1 zRr)1p2|t6l!4iF9)Yr*149~t!dcUA6z^TRB4OLn?KS_iPm3D2FmMWk0iB)(~!k}9kJQ~M}p0=2&QE!O*rSMKvht-sQJ)`85|C4I9MeH9HsUxq6w zs+(aR!8BQMoE(JeF$_eur~ws#l|8b1+!;yeaWJR{OfBL87(W1*8mPt9{2@Y)>cJo; zT6s!682zkAvwJ2_rqM-O;7!O$@#FoJV@*wJ6XFrjO|44L26om{N!h930S3-Pt()ni zjg{80hq^SK>(&CsJp4gon8Cbll_j58r3TQh&NZs^d_|OOylKTcveLQN5~3Rq3{iw1 zr7oFqkS+ysqfYKx>-dXT(>}5GYwBZ74!W&AmlRt62{yNWNiIoQ`kytLvDyvX+{QAO z82G*?ukB9I3VqOwgUk$O^_U{9Nx*y^CCyHFKYp}%h@W>pimJ=q;^c4W4S-KQK>g?w zaozzMYn_lXjXto}r`$)Min0g1<(6oYiiQ92CV7-87OeNA)BECq2fUUz{1vTJsGUq% zBJ>SaGge-Ol_i(LG|| zW=}>4ef1UV#po^>2dxFEJ*@-TYf&UMuWtsknm_C{6r14*!1h?<@(Qiixy^$w_#r}w zMaULStljMCAWFPcByzTRGDMU4-hk-3#nVPio##z&vhA@oTCt{8X5FIl1UachFXCAa(ZxLP4tfLio7%@s`RX-gpef0= zE+b7L5NoVfHs<}ejX?&wd3L(YCmujE9^*5GJ!GH6wkYf_(~6A`!EL~u`@v6m)=H~1 zi9WKsYJQbgQl-@<*%hnM6}znJb7y2U=yN%eWS=1_WOI@@e^W3JrjTZ8ELvpwAkY46 zelF47OhrSK%=4vyf`KYsL)W%w)`_`qNv0XlB+e|7_rNZfT4(2vxBBM?t&j7@TkG?$ zuogttL7^KFeaH19Y1a7Zd1749>#_DUE1-kc;bwjFdE#NFr`Lp}YcvGd-!2IC0SDv`iAKrR{4fK}T3QR6-ghFb2z z$ymQ0xAr!V(&Lt^XfO~NTJ((-E^gnXm?t0u<$1{6D{ez2*39B8+V#xB;_(E!X0`4O z{LgEhpYrnzFc2nyxmO!)w6>eT>$EZ`^kI+bniwV1 zZA`PSXfs%n*Mo9i*$3uLDd8Xmjk(sBZQ92x`njT8RxB;OH6;d6C9Nra<`UU_*i)kC zcLFnLVNbDMRHggFNr25S>1Zcewu42*jTihV$?7r7RlBnuLZ>3;{R<#ZAH{lLg4K+e zD7W84+Xua+1u+D4lZwZtOkR#F2y77^9YTJ|AGm36ojLQYb zEKjNYh5W^goyr_B1c-3?j1MgnD*LYYv7 zao=W5E+5#1SIgL9izhcvRWN~>J(kx^ojFr2m^v?*l2WlH_@o$-QBy9#pQP)VwJxa_ z(wL}Tq#>hv4ERFu(!D_&9R=x%b+lQm_cAteVrMMuMx8aIqB63H-^=-Z1D?vX$_PrE z#gL=LdU@1?Qu`|A24pFSLw=vqzBkobZ?|t3l&Mhnki6Y;b*Ri~#{x)AAFN|WyRfS! zq%q4{13C<(a%(_kk@aSW4D~dpGR6PEGO&@~P&r+Zuv#F&D-+uLKV6L%H(qY9Jc%l- zy2|cOg$gUDV_T`Dj>oCCYcFd)%*5@6|t0nh<%0bD*P4L959SHkPV`4aY0>;i& z6Hcv}5X!^|9drdV8Efu{q?fVTI-@FDbSxl=RjvD~-jP!?5K0L`l1M0~dxH7MWZ91j zYjUS{w9Q)HsSq^V(kVABPBU{oFJLa?J?qa-rPSUk?tH#`8c6(O zF6&YTSoe2nhwKeq2IIL!*LKvwI-~0_K!3jLfbNWQQcbu?%>-sL)#4rT8W4n2F-9SbQO|CJQhuEdoFb|pMy2&=x30!+cTEU9Xxc-w+xo6sHSMfSLhfALYt-FifTwE0MZ z7~u1H6o(nihug*M Go?@w>jLQi}alA47;MlRye_l$kkCp~V>w5J;6AZ8daSChh; za#xmK=MoiGbu+mp{coZR zc&}^jXlAowleluUu}f?nrgxb4syj)%@r|bpbNaypo;JpgMWB0tRUgb!e<&#K{MM6& z%##mzB7IpPxuYIaXQ8BHrDwLT9BqEZmC$R{kTT1t;@SghLb<^_(5+a9b)l+MLhmtT zQ<<#ZxrMRIlb&iGU;zGDs{yCgKR@!6RGGhV?$7uW_T+Ihyry=N_(^$Jtan#(sB^3h zLK}+@d%`tP&D_Bp;K0SxS#_BXA;iYdP);k+gHdlM*JMufcG3q0vw4^y8D+O_<(cL; zJ`*dx_jK;TJz*%pDqWU`L^HZ-H?vHW6=3|BD;`6QBuOUz6Eq-wrM4o>k3D%+Xlj6J zsTXPiiE2roczrdu(L-ajk*RtZ%9M56G*UM=5!r9=L(^_3lX|t-yW3MPCjHkFXnRad zV=aM}PD>fGrILh}xB-bKlQ2e?uk5B2T^#EE9bFc)?3KJB*R}?9>6p;s(G4%Q_`k@b+0+?-&ibeE-@r9|#~S~}`WbJq zUO!{wZ}+p^-{Oj@=pbm5XLryzW(Ttp2lB&&4xZ5dn7s18_bT4X|Ju3M-w69{No4&f0-J;~`TXZ^q5*?5E8+4x*;th0^rc>VgZ&KCcRxm>?$Y%b@==W?>7liwL5 zao0glMgVKlG+s1fgn^6b{~=-Ow~*5~U)O~E4bYkWvqEPUqXY4*WG4J_|AdEjw!8Hu0`|JYzCpLYFYb1(N)rKt(8=I4kV^KGGa9-p3a9+TKQggCi{cZ^;I!jLd z`Wv~vT*~vgev#qyQI~zJZUlf~ck5s18Nq<)zT1;m3n;@t3+Ns(jUa^w238g*$^%da z6$8$oV5srrVB^Vw#*>p9B-h%&lNzMk$^OQZ;a6)6LnzOUC9}`Jk^VqC*3F8e`w26{ z9b#MW*lJy?GHDEQk)f>8T@#iXT|fLlqZ`B;-8eiuL=_tjd&=9e{UVvJoc9*Eq^nq} zV^C|%$#XE+&<15h~JuGR;7b80mKEBRhKRS z4XP+I%Cow5)ijv$?95|lE4vGvypD%8WI`qNvoGDpS<;&ZpHJAw-n67nu5egm?KFs= zBz8?wK%6?q+Y-a9h5hVc^O@z=D07IL8@Af@>}(w|gU#=OdxO<8cmv>iit7B+ompA)TF0DcOMtro7H2f=p<<IPiO%J>*r%>2BuYYw#M6r$*tkPEV zu%nE>tF}r$7HdgW+6(GYhrb123j@}^-X+#6y|VmM*P(w+8}?6}^ffkspLr5_QaIJ` zpy~tm%* z2bpvZar-ji`o)RcjEQTV(>u`e-%zz6PSv}as%eU<^r;o;)1v9o#IzQi7^#)^mljHu z9o-Lt-SZ}@g6JlArYn;{3pI^pKF*mML-Be~;EOQlS=5S_DCo^3V9zIpLeE{l` z2w^6nk7F^BKt+GV&0BK9c-xaM7T@kmt#z?46gjYDN1LS(26BOd&!{)oVAELDgRGLJ zT%*k>%M)aoG&<^3M};wF;1pHI3>v8oYr#g}3Uo^}trKc{%n$H_EtgBHux-Gwf(>Ai z14};|mifrfS~nX9eKb0NKDuoe0Gu1j!w)_{qSnXwn8hs1lA|VDGi$&}?XsAEBtMYa zTSQq*vwS(t3Keht+i8{;XNW}!3^5`mMtJC;(#P#}Oj@?rfdOj>ahAcffUDe@IO(wx z-`<2Fmv%uBmngMM)bCqM%!+)4xf18|xrqkTVisBBPD;r0+^&!@8RhxX%$3~OJX3@bRuZwt>B=remCn7&dH zG}>otK);M*cR5>j`Q?6rs(&;4*(}7km5w$KE(L1PRjob!yY+Vnf6PI?T`pB}eECnY zE!Z%1;>b%u&I4xsct)BT6I}|nWR# zAR0wv)@y29z>M6T%75%mO=E~W#E3w6v186&I${Dp<5+~ri$PMJFdmCNPXJJn9E;v3 zERa)6E{%_>S+)SP>`k7UAYFrH{Me+6_uFoVp)BWyq&8k}B|J8i?hUbJC^6GBrZ5~E zK+nbi+{C;m7i1~mowc?mB$o+$F4SWut8SnX0Hv02&8Xs9D?Bi83~H@oMw1QHo0-Q( zli^qVUr~r_mj16);Y#hf(lIF^m)b@tar5bt67zW|vu#RjKJ8ePxRaF@X=BzS_1{ne z@EcIV)@76u@b@*#xKnk^t5|xmYo(l`SjMCp)o6c;2c@O%^)6Y>7($3}8!_H+R{wNt- zukfsR;h5FU?bgF;C>nB%S1Hc_2`k=@inV(Uo&m95vuuB<4ut-;18ly=0L^Dy8$wFx z02{Tj!u2{(iw>}D8_WHt4zR)duM4xi`}c)&5=M;eT`uj8Vo_Q!XYfG%QL;7+?P|>& zJa+JBysoAg``F}?9HY3>WbXTgdC3ixN|`GmP=mKqQH&*Pnf9pk1JonJDw|?*<+4T$ z$xN!BGH*zezyfTuaBBcyEg$kgleaPdVv6CGC#<1o59uCL;^0IMyA9@F*5MdAM!^kT z4K9d!M62IW*6`3tjUX#M1xNP*o&u}~{UWeQuyGvmaBGueXx>cLkaJGd@xxU6_?*Hf z8z4Mwl)dKmrB-0*nK8Z71LN6kbPrfp3>~cM3~5pqFYhyVEww7oJuMd$Mmcnp9S?Z= z#GbM++aEf2aIK>{F+o8pXo`2sN2xzb9@I^^1kBIZV~`N~#BL@0v0c5eS-GAp@$N>H z;BW)Et)gLrQ+Es?hEoQ>aTCZJ_L|f?q*+&;*Dr>Hg!O-c1A24}91wmZbQHra{ssn*7&-fIyC*W#Q29qr6H1;fUSq=3ep5o00^lCLD z7m(z7pfeex{UT3EnAdPL@t+Y!ZN8itJU8tkPrQaAQkS}fi;S}sDVre}$TO^MHRa5S z{O1No)pBN+WPWB0<>+gCmT`L^mG%1>K`U!`YQ|Dx`uLHIAKL(b)ao%jT3-Sb#IZ6ynV$s6T#gV?&MmI8s=v9RfX{YYYfh+ z;Dw`nd!@7QIqQZCIUurnME{74y<=AJ$Zc+)x#1DilEHeI_5@%gD1+-kKH@TyArNb?!xjvz1eBfC9}fJ0)9nYvV=5X_y^O zdt14^Ak?JD$O>{t<*LpdmX_gDJ4k1l0^AKDsFv?H?AxtjwcdQhCL?a!zv@^#c zA)uOlgT@A{{IYDsm7I9lDwPbTK^#n-6}tRnBoDc~OeJs8IeEJ^=khZ%ce_Kn3_-vw zA@c#=1rHdzts|G8ny#{>Jd9@yA6JHGqr1ixTYpYUvet~Na+L=S>&HoH2ALUsLOvkF zu|(Wz{`k`75<8BU?GaZuAew@5W5(ahK`I=$9OidpLU&+$%7iuw z+sUrcNZxMUJYg^*Z$6%I0sdBBQ4K7nT+sz#Krda8?ng_3~BOR`aW?{WjHpp8_mAsJiOf zV%lu&yS7V^tD$^`EZ_3FN$AJI>yFR08!6|!6yDEqnTl7oSx2sGfk7#{KH5T(?`_Fh zYDhOw1g8wlHAun$yiHM^2le`?YWP-3)~vJsxc+zm=yF2>59%1z2{-iiuYnALi+#7X z=7y|n=fw?QT?FDDQHmPJvRU8XQ0bH`x7yqo##r^cu|59Q-k62a2u&)oUb-=ap1gBo zcc&nes{+j)Kk0Ukk;C&=>(C_T;MTRrXV~0s6Wi(Oq*{*6T2NcU;c7Mk;^Ar^);34( zk=iQNJ1AVt+E(>so_Iqh-(d5s-RXUkdE%8#v00g$;7*U2($oJI^M(hVesW4yw(}x8 zjhTorQH`Tet&gX4aY~k3&8C*1yM3o}r>~!y1ITlyo(#s_HQsvu=I|e=eC@fm_VSM zReM{f6hM_+3Y!2iouc0nZ>}nX>5ZUHG5(0RHPwmxk9hmV@b@uy-d;u3qRn4kmNa{A zzm&FEr`*v4&v)Em11OdNtmSvKqPn@meIpX9&)wqdi?Xw3v{9*$Gd@J_ol3r9aMt%T zA{d|4ndN9<1Nl0mWQag;9t54aah zWE!*E(Hg6Ic1B?PGaQl#XR7J8w%*;6tFX;~bd?8Zw=ZYoGuK7&HbKQy@p?Z)-vZ|Ub};A-Z#j+`8g+(t@~IL3gtD=SyS$o{b6gq zLCyWLCi-)-)ly&Zyn_I5LN_RR_e!S?w&k5RaO!}`vSFpu2AdQOGJlU{vgz(*+5}y- zifaOa6?bRo2jmNPl6RyVl)V21tI1q0dHmcA`pin5m(2xP-EDyBvoAWBvYy)@bH+}t~a!!`UP`Yswu^Ns%wr(F~d2H^5 z)`9tE@1@-A6oBbjtPhJwhew$j5(Gluhm=ik#we81P@6F<-KmWn?=_cXC~-g}*W zW<)oi1z3-9k2U|7O(x{6qG<7g5O12@k*F>~%~Lq6+`ds=5mZv(`IE4H;%9`ac4 z-PgnV{+@0=XV<#*y_Z?{-cw>3_sdrZZ-fXk3vZ=7 zGOb~EWm=a%;2i@vP>?VTMNx?&o{D3r22wT7l7FCP8t=LTS794ohfak`IxGPbz7Ms- zUjKLi#0wv5KwvUh3!WjV((ZkrU2IfRc%=rI6z zcj$nD$5tygN^wjAwjamzf-c2~7+4SlCM64|$9rM&hU#4F@rU#BPU15D2x{XO%cSX> z$SgaV1HJb=JRFON`ACUcZscOO-MaFTcG;&Y?Hqa{+AvP#Aa3>?9eif>BWXl?tu6og zL!Z3FTK{N%WIncJ&F;La;gk=~AY$vA`8=%H9jApX|H9k-n`KA^HtX(P_?N$qU)*?k z_^}hQiT%xEt=cN>jB$+ZNHUNRg9KhKY+5^e7+xdOs$Mi2w$~Gjj$p)>EY7FXthW|- zFGf&(1nlBn6k|a2l*Y5ciG4GKkVsX*OtD%&e&&g{qofC>0r-E8o4gzwfv)_F_XHkC>v4^doaynjgnpJ`Z92JL(QlD3e5 zSx*dZvk;KX4w7z0B~)$rqnI8ZDLdGBk!PI9>;MkA_le>X83f~HB5{B{{vd2bc|~LI z^2Fm#>zgOIjohXAA-fGO06)SBONZ;X-)}v(wD3e0D~i@E7Nm|11Tc-|i52Eyb}E48 zo9uX;>d{dTOi>SFZOlVY1M@8O*=?L*r7UY5J7#6Jl7#NPta;U)ci6No1SO_9FHFwA z;M|Z@XLA1Lyf8VxzukIhSvH+%ty*?+=kM7E(h3b?rvv1H_W%otBU;&)z>F(trMLqp zUde0)T6KH!g!p+dAD;(vfr+PCv!A>vhA61cNztdCsg;yyq+ zCBb6u6=91RE@})=H6KcHnR>*}tZqHG{A?Bp($eMANx3V!LQtHsBAhN$4`98+=_C{= z)~|^qS+}hypd@S2ik7XDjO)TU(nV+ldL$Np7_V5%eCX+Qk`*TtPSL@h*TsOvlnpLr z-ycro(U=sMP8t}*Wh(I7B>1taIEw)W^qls*s-;K} zeN2W}4wNNLIHO$WbJ!8Ta5e2<*^Pu-J}*~w5j*O`E#sV9yNZjKb(p= z5!tD1yFMSD^Ww-X9131D+6Ua_H4kgOL+Pdg$kNRKaqd($xE6wgfIzA&ZKj|UOnbW> z?o!kE7^5Y=`k;w*|1*)=Cg7~=;)6^4iqlcCNra*f+2JNs|0>$q15LUM;Xm9ro@?eV z1Sc(h7qc?iDCgJ;XIyQ9%G(YS2wE#qNs`n=JRvmb6a*jJa8w)<;NWyYh!sQy{=Q8B zpN3=@Fv*DEk?RV#%dtZ6HI_4hQdkDc#!VXx94r`8V9gxMT^JV$1bT-<{KA}L+Hm9L zq=Sgd1;L?`MqzIiF3NyVYa&nJK%iG)vj)Dc&z}uVJ(=_vH z=e|%4Lx>d>M15kJ)Ug^N53AABFO+AVix&CxHXA%xKe5umqB+<4{e?Dh<<&mnr^|D; zU=~PbxcOh~@sB0)a?vM%b`A=wqktxh_PN&P7kkk%EB&QmhI7i8q?%^jYu)@(3-ofy zOYO1Ve*DsjDfW6xY$f6FW9916$bM+`@Cxo1(857Mx!RKIV*G*$StId=39I7eQaZ;v z@8!NU)LMk+gVy$!uctGt0k52Z#_oRQWT!D7!$M=sz zNhM4gEvC-t)ux}R4zmM=-R6F%BRs5b5Y|BWU%aGg$k8cWbDd9)4&W|Wb9Ju$3;HYLEmAiFEpe_!h$X^Gn9cI(~N_03buyi)lXvcV&YU-qm%xbDQb#^j10 zz5nmJF;YEZgGUX%4(^E`y~oi_(>@D-2_CxGuuF_+fL^#;7$mCIopC?Qh`|1iQ`QxWbevsvDwHCb25e9ms_ zWTS~#wpvj*+c0(jEJJ7ciU;6QrUkJD9`uf7p@G|VPOQ?B)Kfpc;sS+OEkjnB29#Mm zvt)5@*wOp(?j&FT0-@h4>c$lmssxL3Y$nS~Fp!A|11?x>7qr4g`Ux<1;yEzUVj#*J zfM6LH12H(E-~f^Opf}fzd0b?D`&Q5R(0b!T+yBiz`od+__;-86bz+Dm=)}u6Jfk0U ziSsIana4{V7+A)2;Fw*~$Q=ku@;Ev$i=P8;C8*-{TCYyRT^ywtj=H7)e1J`qZaO-D6T4aDJ|=WSJV-ao+)Z7)%FSYJ-&E8IjvIL|1mpyJkoaE+qyVC`Ar#=@ z3Ste6EsY7Xquu5{`qn3{Yc?OnVCyzNKZqqTR>=}Qy^~ys0VtnkfR~Lfmg?%9eoWl_ zn_gNQx8&3L*4JBFpW`58Hdk&Lc)av5wwR6)(-ST>)&NK8qJ=l(L1o)OleG z^-<@AE!6vGT9uP-;rnW$(#LDWsIbelF%W+kY(89Q)4=GjH8{ayvqref-{j+i4}rNGX=) zf*9EV(*f&|WZBXtcT$E7H`dfg^Bp4Nwti0_#a+J0=os>om zEI9fLmD^k6w|AggYvFeDZ_A`xX?3}+;nunS;^6y3RS1 zl(xz3@P#3hcneZm`&O?V#}!UyPn53A1?U2d5nBa|cxN*McVs-gBNO*(tlGg>M2vf% zw*!ytr~snn?;jsanf`uTG#~9a6W43py|WyD-`F__dt|vEl*s6e z0LINHb)FEOQsk4)x_ojNo*G0+BPEz>4f`+)GKA&-&~QQ(#**tO3z+xB9W{UX2UTI7 z011U-@EyRG_rsZ(`gec$7!;8J=A5r4+*EDM#j#=vDYTO0H5a;bp#|?8j{9fC5`#V`Y)h+8domjonhV>#xbAF{iOuUnCf?07c1Bd$&|F_xIl zQMf^@<-7YRhQan5zw3MYV9ZY1Q=k|I$77JZ-MV7W>9s2UUtZ85jeF@#fDoIt5m=LP zt>UK)K3W0AlDVBdYn6frF zQsRPRg@49Le*yTM(H^$9mFfm8d48X>w-dVY?%oF7IJmdNMF}`y&qv_^r*{koAS`7r zDWu(rNXPokns1~1mix%8fX>+0)o(XdZf)9kE!e#8CtWenH+`}rYStWIldQwtmqS4LH3rotkoEMgqugv^I3bv z1KCXA0gyxwAXnjvxbv&1ob7)P4Pde*m=C{NCwH?` zY9ey7X^evPEyXrF;-TWGiX4qe&ZVYN7>6TZ6fe&Ndw(k*AVmDXb zBa{?N#YIA>pN$KLY9Li>Pmlvgo5Z~#?O0rGVA_t_BeOTO>yx7l&G*s{Qr z=`h1?@g3f3Z3f_Lh*(D3qt208VXS=6H}K=_s=47>Acswz!ZyF4FvSadoWeE-%EGLS zVFHLQTH&5;{b9~_T&ua zwa+8t(Ku>p$w4Whct=4=C`2!^gz~Wdh2qt6l{$Q|nk5wP2T1YW_vf?F)dfF?d6n|m zi^O(o!_WP5$A)<)gXxpyb!TR&}BI~hVQo#81 zYbF?f!!MPw=j>nGWviNU3UJh&0_=r`cK)yJfy|s=dny#|6=~0}d~aFH-;P2tY)$wr zJ!dQnQUxQ4kz=gkaRlc+^jk;&)6*nd;G(kMi{|{E;=hU4ixj@63`lnUU0!MSdl$ag z4DV0=Uir7(Dvxzz!!OOPi~dMCc2{QnQGvp*{K5UN`=f0EbX<%_5|0OB&mAu!E7K8U z?la;4jvxos3TwunBON>|tUvzj2JNonp)UA)`5_L{nSbbb{M~t|qjmXV!zwr&k(chV zO{2VsP581jV*>nqaDDltIl`B9s_~H=1R*)@a8%xA7_WxHekl+aA07|*xksYKED<11 zaNk(KmMBU}7*a}PA`O&g88PC>pjOPOW<)jPm=whUXnrUIMj6DvELry)DR+9e+sgW@ zz|9gt{J6lAmTM0d&uh8uLH2$uVzlxe^yKF5+Jq+D33EIQ!v#Vi@UEP za*6Kzr&p|)SA6TCRrxHG?e@LqI=r;wpaBE>IxnpiYrS+9?G!mas?3Ii+bs<_Q(jsO zlyDcPFX$IbT~t9nvD-zh$t#lF`0|J&>Li;nD$(V7cs*bWV0vkJJ#fCCnmO8>*V8`qTK2NxK? z>67Zi7-B}KXcl{C9`)eD0s|?(Acsk$V7{XmGdiD9GLtb=`5r8>-cQxIA~~2u_sI$GU~x$diD9Vs1m7=M zq}r*6!wI5qG8HfmJ{imJ2M*(tsWPZkcHDyLHFCv@WZB41$uvPWBCqGbm=DIjtxxuJ z0P6ptM2G~0MrH(LM_&ujZ8TEgUhm=*+iwAr0jCQp#nd2u0aA<#(Qp|TEU&GE%^-G! z=p?#AL{jKHgvSj(>~)Hp znoxhG^~3Vxgk4Ptd)Xq(pdw}a{SMMY?-y&EQdEpG=w!bd0?4)12IctGaN+G^gCb40 zYyhcs<67JF0}BfSH(FOXb)XZmVeYdJR7x`v?=GeZ$O&Gy0f-@~6tSHhvq(8ac$ZtD z(?M9NgrHpUaw=u{u}zM>WC-H249fGddc!?Al1itlt|@I(3~ovYI~8-Al3a})Sh8z9 zDx7{WhS)Rp*_8rA)p!eYv7$Oq*fSIk$GyQH(mpy$lo$@klGM00^r-Oe7u{)h`-=|2)pe*Vj zT4oSJ#znsjDsl#=TwIeubVY&z~A-4&JWQIL*`B;!i)R}RGFX3;vA zP6-{k1H)Y)^T5$J=hDCSRlrpuYVsteWAdmCA6U?(5+->SN1nzaHb9q>0W$Ft*8ju{ zd2|~yrMfniQ~Ku<92H_-K9#791z;n1D#ZGHsviFNMqrnO5wt@D%$1Jc$L)F$L z)8Uk$d5F`&wHSE48jGIKOhUYc<|jGuF)&avSQ&A};0T;Gsqx$S72<^gklb#gLVR9; z6=SRLG^1I5rvdRmGeRV$c(EA`$goS6%k!zy)8{p|iNZocgt_QaNEgy3@jxNQbccAZ zkUA+{9jb4VqpORYD(`(gX-InRbZ0hyxck0M2Ce z#Q(Ts{lW;H$)PO4NGNPzOCO|C`s~V$5i*FDiQQ2ep5Wj@ZI^McIJG$j^q{!1Ikl&Y z#p34FF~t^(m=^4;72hwh|lk{C>ocW@B^at!fZOBgcUiwf5(*O7m1A94{$uNa?~jI-;W3tp?^@B|82Kb{cqhe~#gcqC6jN!G zJI&hx*b&AP8fH(1@};x)6q>Ynx0p`HNH!~>6Dp5Y2zB9DP2$*WGUq*FYlv(b-uZ}_ zTOwD;^(A!NInF)VC{^M_b7&d)6>RBH3hk;JOomwDAEE?lelXk<%-PH zDO=yNSd^bm75ah2;=ao*lrP@|W@yYHn4u#^7U7mSajP!Y#_VD@p7}^# z>KDAZs~qtuz1h$Z!w-3jYGw4A&TL8M>r0r)jQ1cXq2Te#*&8~Pv+KiKt!mdNh$lGD zWzc70{kOQjJFz~8A^mOrR)XYh-*_R@ zqx|3M@*uek!T+s5_!2-MjZHii+Q)}}S;I%u@I4@73umOjGtL3_+`7kTFVJ2)>i@npCJA2B`yxbGtf2t76`(XYa zJ`sl4T_;cgE9!kGP=_XPp7Plc=g_10_ymOAZxVl;K==fLsP2V9Jt&6sqF3;fT|)@u z7T48K+oW&((M4B>!4N8=2^M^q9RBE#kg8G`3zv={&BLuJ5u zYai;a`hq2d`;y&PD#2&;ZP*v^LzjyZ5UIxz4kDP@Hb+RzlM^wIb)GpQp#rdN$PwWa zDX+cVmSl_&yYe066WHA5a>X$1#ib|8PThARRr~GgasKF}SfgEA-dO{C$cY2di6gP> zxW-Vk>xvgO__7fC30oX_o5Y-xs3$^`n4PqqQzlQIyc`F(;L^at#el?jC(#RFqQxiU zjzFBZyAkK|2K1xs=8*JST+Hce9e_whKMt@Fc8A+k*W$nso7$hsTdO?YVDQFrfUrpzLR04`Tg-a62++Y@{izj@be{@!O>VU~ z&1@5EPGzI-R7|_};!5OamWKnOkV%LKl$Vi0V*{SDTp5adcPhrGTI3G^))ivp06GUh zYX?Y`ugO5+EOg=S>BibUfl=>AoA0JR;mgb#qzGj~v6}6?*Dz9DOt{7%7MIp zl~QFpyLh=eB&-_4wu<~B*(x01b@o+MPJ3}z8NLH`O&MK~VK-a9rue=L=0TnCwWSKx zF@!__{|%y7TP&P)VtiXVS1qUza3L_%2W?^RK?<~^Qk4#SB82j%wv!AvvK`G(=@1t< z!z~WAlj5RFxkI3xAP`Q4i*e<2y2F4TW&M6u`h` zvWFZNk#vaT__46M&_(e7Pig`iHTFX(lJhn9sQv;Yh~S;U{HMR?Ax>G`lfuR zM47f&$BGMQ=c9VWgQ0hqD@XU_!Bp5;MThV)E;uf+xsPv$vI2tA3-~k~KU6zz>0Wq; zThb3%L}Ke;>Li8^p{`yZwBSgxm^%a>H@@jrI)x$V%pGF=5E_C|sjwJ!Hl3AvGq2k? zWhH&o3-pjr48M%Z#qVcRwmigV7TvG8fWeJY6%_i|~!YiV`8WLUqOklq@!$2d4il-Xi79 zyAUm0I*k0u{9!}H_6{?$#gq%FV{3f>K%we3_u~4Q`I7-QnM;h|KVy}H9h44bNkr2S z4exaADJ~npHQlkUQMS`iI%WgIFNl>_@L%LQ_^6l+v(J%5n$<6YJY2Zf#2(;KhH4f8 z`cAX2FbKY}Kh~`1em<3Wvl-#A$R7>^JW~}S zpZ~zc%~V>GiP|YerI1vd8?3o2o}Balr^QWgnM| zHj|~(y+!kgR_h);3ArY!P$6m;|)mm zi&a(Z5vPd!v>9LHtR{M>iR1%u`z7eb3lgh(jqJIE3iFO0I;VDsYnO^y<0(lGriuZh zsBd5`kBYjJTRe;e|29tGTlc|O*`$l)(Nqw5UydDi1?46iCVMi&TtyKt3!yS?wfOdO zsu7_}>DALVFjpGP1)-+{TGMPK3C253(TL{7jGOCL5qyS07a^(!goy`3FL7G-$=)$JYazFgc4{Dw$ zwoVtz$546ZYR+V@XAxh2Z8z>0zm5T5zepYe$y6Z9#=->47DM?bOLQDUEg`Ou*jzk0 zmW~s5jfTrs4yTMIWZalO+xZ?k*`ev!$TmRy`IpfN!yzl-KvCU6dwXTs&*YtTTv{44 z4bmlSR{I;IO9~#9F1lY%x8$Ii#=))p@Nz7t1-6)h+TTc%qGCM#Mjwij33Ovqd;147 z0h3DZrmkEyfo`A^A5_P569=8_)8q999pS57vi_ix^I1m>I?wTRF?%A2{k~W|k&5Vp zmHQ^r5^{e6V?{i49rW&X*TDhtsW7gmlFskT6@bk^>Avx+xiSErDD(w7pW5EFhZd#O zP9nzr{Hw75zb|mz&4qyV(bZHkz=j2{9+pKcpbji-U>*$%1%g~E-6_R;v~Ve6T=3mY zn9s)h;_MqJN*{`Fz|5rohKH)k~W2>H0t7Lygd3z=2}j| z-9Bu)NNEHQJd$85?H18mYO6oKRaErxW!9SM%3bV9IJgZ}=55?mQmpp#J?0v`$enh$ zkj6;OjW4*ztkG*W(hIaEdv`g_9&ZMwPj;qqbF7ah86_(o9 zPQ!B!Hj`OSVR>hj-5Y@QfTi&{qUwCykBxHJ$9Ln?(eRk3tJ6gAu^Ds4os($})ZNGw z%4zwk1w!C^#&YYlHCNK$KT|vLc)?jR5b#4WYzhp7gJQ}QI>CDoE_&#}?@pmMRnJXc z3sGtc{=udA=KX&G+#-HU2}6M6D^h>LXZ^Z6LU=Xc;|vq-)fBTn_GXBEH&I^T_xJde zR5o&76TX{a3a%0DZl;XtySF*%szewgj@xfXMkEYpEW3UK8itLYJ8;$7lSjHi`~85 zLF|56AptQqa2pn1dd%XopSe4aoqyiVl->4CoC8%|gd=3DJK<%mEAf5|3={6h5ZBxc z?N1%56N~U%{JPpK(i?o4)2#(k0M_K9sJYlJvTvbQ#i}MYk}(l>>R@@hIyI;+F1`ix z`b#nG7ApGRZ~o|!&ohEIPdK6vOjg6LB7}Lc!4=rc_t4^qWxnbXj2R&#F$&Dow_anH5B49s5a145mhD0Z^Z_pGAZ6Y=5GWx zsUpQpuD~oJn&gmP5njJBN{jFr1rw~&Qy-L&w8n2;cFD zpFz%hce`_)V>K#O38n{XC}rL5Uw8EH$7FBs77lcQ%c8+t|gD4An zvzY2O1I0QcdH6I*<`JstVX9yC$;>G5_hs-?>EyG;j`wQkeSmuJ$M1oW5~N!t$-xY3 zwdj{hXoPbW^_lYkv&ezj7_C(ikQ&Xjkj*q?5Q&)@7+I>8T(tlz-knCtpm*Ig!Xy#c zj>vA!4XSNX?wSH!Z)9VwiR$Taw!y(Uo$?bdW%4k-7%s7FIyFc3*6DJu;%k&*$Bv@6 zr1CD06cjickS#jgMr|=1DmRgz85)*BKmRhNk5NKlRevbr9p=h763HQ#cpAXJ%pDD2 zIg_yAxQ6YUroeJ`m4@^!=C8Q|G7pmt)MitjlMa7|V_aCo+?c?hr7}mHe>*(U5D2#; zMB<>h<#w1$YE=AvxdMhoY>OopA}?}>EZGe|T|rw$0pGXg{Zl+$BV)Vc7%37-A;H=4 zUWz;Kpxk41z89vuTo)0cs364o+n!UB!Bw|qUVF)dM@?K+n~5k9O&nxgcz~0vpr0xe z<}zZ%0&ffcV6ZLp>Q9}-nIk68pw^ujEbb5D356duq42;%g&!8hGN1Vy?`lFJ=tr!$ zMe^r=XV9sj=t(oFPzK)u8>~7IHHdZyKtTcRYiCkUF9w4=$PsLU#fS@mBNr&zRyCl5v zA%2`i1)YJNAHhZV!QKh~z?KO{G#M9DJqDo?TB?SMs0#B#9+rkyjg4|~$6eH^Et_B_ z-#UT~E29PX1wT+B5pzknU4dKTtt{-nvic_4-AU`W?JnRXDKB!+OJ!r!VJgdV^rKATNZFGk7_Z|4+?GJ_a6Tv5Y2`snFB78MS2 z@hLNe)$s`#J_(nc>V-NkJAj+Tv0}FXrhMI-WMTM{IYBb51IMn2o47y|t~!|Auu`Q& zGa@{fqSj6M=_wd%U;^;$kp4l0Eqcf9K{9&%;2b#V{CCs!;+5I-rtCUE$*$wq>AGEV zns{Pv!`iLIqIq<#`+gtXBYr{o0X;?c5E=vRL_0wkT`^El>!vBA(H}%DC7bS(Lxdp> ziJ1bP*A3#wecqSF$oZ7pDR?r6ej~;?oQ$0$c>A$S4Lb>=1zg}8hkt-IVW@~>U>xY- zq|uQ8ZVeR1XWn%2E+F(`t}4@bGNMX2B0GrJf_s|w#fA}86dCx-Vh4BbfSKxsAMzALezUr#AXwV)|WK5Z(ReLHSitFN;_rjn6 zv}K7m<|6k7(=?2O-|%Kg8zoV%Ml_D`wmYx^D$mL}_hRRy86Q0cG2ny8xn1UEHfu~R z&=XhFf!uVTFGIAwA3|ZDxc`1?)#f?kN#u{PaRA;zg}vHXjzrn3A?Ao-fypGSI=QLP z`T@%9%50=NN22kB?&4ZV_!dz2pFc?7t-*zKTA-AX)7J)I11br?x;AK13O*4Y75Lfn6!9@yqg#-Ud;C zwmwK1T^a(4b-Vaq^!jMXb>h`W==5Vjg)uy_aaw{CW0(6K1M119K2dJ9sB7;Nh6?<| zL-p^VXB;(Bb%eXR%aikj?-A-KkH)(k;NrMPXHD+rGkkP z0foi3|JYkqacE!v=l>eoz=!R@ia`S|ansF4iri>OeeLZN3<{A5Ph0-w-Tr zd5ltXH?Z@FokDg5p3Af^jz|Js3QW_2n_%dL-N87}tWzUMeFgl9s_8T`r2BMg-QVWt0v8$mTun z70YlSrCNNt485xmt)GOuuR>h%B(}OM#6Xl3;is_C{Kb>hA|c_Oj$6T$vKR6uE{J0^ zj2mk7H9bTZeEB9LYrBMz(#_N(N!-)nTYZeZqW`nikFk zNbD}7XuKViNahk=S;B46%FPS8E9m$9-lD08^e9ryo!djmdAXH zdTNnYjDVkGoRVUvPn$#U(apDI`5of47pR9iz{=4s&11pm55GWX)yD!M6b=^KMCyw& zXPOlS}zC>jqIb=-P z0B&p)lQ%$9efcFizFurg(45D7kD~+vu`Pw&J({jVU*f&1*_l6C_~RfV6^97q06wfFnX4! zQ1p70inCZF#{Pne7W1iVL0IzM^r}3Lvg}prft_)pErvqe9 zij<&kF`xPmA)If`T4<&_#0P7g2C-QcZ?MH{2!yE?557hx;p-8KylZ(JCtDA>YjDP;7q7fQM=(4uze#5Ui|n^(Abv)_g{7!MJoy%apew|O zZ()t85Xo=T2{Mij(v-rG+G5DtSQWO4+PA5TJdu|RfvXPDXX7bHie47N%2SAHEo8M% z-ljLYu~;^0A_WlOkSnTeT1|u?iNRGYPcW|_bHW_4=L&{-LNagqjp~)3yhA?|mb3TQ z12M#+ZJXP#sA9^Pix43OsN!zd# zw&JdhSZeFUQybw;laqtf<8$L9mHp>NjNB$svWX_*=fO>o%{V@@i6VG=e-jPQvUK&K zYn-Wf!$NoS*$NlV{k`%Ym3RA`4+7z1k}3co49d!UzN^VT^aE>O1_y-MpAm-V0D+Y9 z(lSx9jjWuHVqXPE^uB@*#&H>+h=H3CRrR)5wV6iXr(g>@^MUBGg~qx0hBook7Ak9R z@65uwlb?;sSDRtwKm%qn3@k8~3yonA!C%<9f(8E2_XvD?a4VhNY z-+TC^^?6*gT;i%DkN{V!xh?aJw)jHMxHmGyIa>+WRg25tqt0UWHfm09iM`t>9NzyZ z?9i3$+rihrU<&e41a@xlu;U8FRU*6{L3s1UeQsZwn7W<9=WTzSH;wv2mE}8>s`LT) ztsEU?4W1AF$V;$s*(NCK+=7j=%EyKu+bxNc%X(jRF%_N$bm9x)Fz<}$ygH~w+r*WR zdOM1X@vJ|)MBH0P1<_-{EeDAJw-j9UK^+vY%l9Lg;n)gu3(pw1{541)m;G_`M725o zt&PX1Srp|EfepdW8`xf1&Q>p+a#FpR^)j*>RWD*WQhna~0S=}hD!Ae?Do~-n;1_&m zL(Kl1T13EN@Ff_VeKRO zOif&KiGE{m$LY7r>G$273r-T%?^9-N!aV{IMCQGmDfjVx@v1R;s}L#%oG_BHv069{ zb=AoPK6AAUpw!U8LU6E%QU76XD9A{%ubxa6CzAG`zfZ0FZ*pz{a7^Dxty+J|Z<*XI zbB@gf@KN(Pvgb%Q4=HGC#K@h{J6rAgyXn_XJhBV>E4I@9#V#y!yVV@J3C%Pr#_y-hV@;!0!uWua$J!s*}+CMTBpGf!dyOCgBB?g>m`y;|oaB^)aAN#gXJTV(nop<+aGd@LMarEkz4&6P zBnUI5cRMGv8ppkbIPwX06YE6MrxZzcKKT_)62%)3uY203v@gPH82XOu)A?s8M`uXL zrt=jtG3Ybu0wwRx&*%yJ6D70c4x$!#yNJdL+SOq=6<7++Q?5O;q^1M$USvDWfdH~Yma_Z^{wO^#il&sw*-Ojexm zJ+ zhX(-E2cUe^7mgl;w}5@{y%bl1dpm{z1fDmH;5zsnpZ}T8DnOg@#_V&qglzWTz91g> z30v8(h+RL?83pXqr*JY~L_&xiLX0Hw@$e*UF#%ZrgEX8YW|kkMTzPofXYR#bm}vD2 zX76fo-Y>LXemxIc1&Mq6BJ!C#%fnF?0WtqKb%2Q%7yc{>^A1aGrSrfdb-HdwxjW*g z->CWUc~CB7tbZ6Ie$pp)158{Dka#Ig&6|IEH=NAK=e};<`U5FFrbMMR6Q=0>!1T zmq!OP5%9e{Itll-Y zMDXL~V#c3zNsD>l43h_iSp*MW=OHmgywe~q@CKJH7{ro@g z`+f?a%wA_-*5z5xdhY94;1Y3wEXRtSSx_up?kNeJgTT!Td@^rJmzQY*;(~{+(4VDQy*4J*|SM`oI=$hJC=6l%dzeUMXcP!Gav|F*4 z?PBkDfn#GwUa&Qdr9MO+dM6+&Pf&A z9|B#W&n;DIZ9*F5q>Q+bT3Z2*bZsf);0)l!+yv4B0hI$9>pc#-03zPW$xY1zfOX1> zoK=h>Sh4xxE?OiZaVv5RazcwdCrD8(s&d+|!`%bW0+~EE_|a@JFer#^jo{$}A3UPe z62zrpfWm+Y87DHDAVh}6q!Q?Iv-}Rk@yy2CzImW0`PK{BSxT(wgbk_1cPZ{*2R#tc z>Lu*;sigIn*$;bx1uCf`C)KV7d=`Va39rKpzO3 zwUDWj>wlG9ebPgp9FsC(*)K6FA}Yw%|L|XNm)vkNgAr`O@z1*Zgzj>DNAiw1jrxA>ftp%>puzL<5g z>U<~b=6S0QJUw5x>J*(j2EWKj&bxKuk^+36serM)!ZoMYyIv0)UiF(G01Hev_2elD{_zv z6?aiQ#TJ%+jq!_R7R?W9uaB>_+SGrdVl)<{P#YKogr7xN4Hr_vc-vgd;@KI8e#9zW z4`7?+ILj-3`L1MZ!IcTr_-er|J`(<|2$U9)L`X&pB~E6eRR~1H!*(w7lWEPaJT2Tr zLM_?Nvzl3OfUrf;+J0#6IUu?sN1i0>`GBs_qi5|d{z1EY1Kr;4h<1sJlt>s=dN!M~ z6n_;R*zQ!ZR6Ks%?<&08>vp(GGfwkL+XiAt_&v(bpucH$OL&m{su@Snv`Cw3%ALA& zm+5>T5Sg!E#qum&@?~~#s`&~67!*K%mX&t8Xa<>Jv3+?|X^*I=^gZ%?sFiV!Z?lf{ zXP(Qg^7Q)I9B0<>Y`;YX*;l1=xNZ+b56g47vqJ%K ze_eEQ*^FzB=1$)9*e*lxY!h|bFzzw6t&l7xyd&vqaf?n9u86P)MClcf?{^H8TY?fq zSX-D2(tO92&<6Z3A*1m9h8CwY5(it{axM?IxC)o=wy=yl5>l$nuI|xPf;Mx)V(>}r zY%NfPG1yWNUU`hRwbg~>Gc)Qyq-jlKnrw~>@uSS|_nCQHZ9Oa9B`5%f?^fU7`IF2D%ECS2 zf@(x}O%2XNWEfKkRe{T#@(jo>X82}&7Dj8Qkz@Le6ff@HfEp(PR59XIiaMdvU3n2_ z5vhtf9x0jk#jk#T$%){-L(QywDs9J3P-!NK-gUFw5eqsM$S8}Wb=)jmMJ;cI4R$0S zZgcbPyyWVa3P)DK1Zd_4JOe%s6nUVTfG_(Tq5@A;jG^}*Acn~;jOc651jCPI($(P} zN?y8tK7UH1xpI$33E_#>8>>4T&0pC&xQ)Nd(3BqpX6ANmufiU*9&ml<%J%9(j(pcA z`&A8K@3SQ@dd6at*a{2j<-*)ch&1WnMvCxm16DQ?L(%=lScU`g9>`S|uoC!XG)Z&C zge5K0U8&04(F105ezc$@s^B{p&+*BVj7j-p#dxxb5Go{Pdgflpd1;yA^Avr5VRI(m z2I#AYMe7qZLR8pr-A=>l0ZSO)aMj_wqvp-BWptsYBjg-zISKpjyZZxm-FMcj0*W@q3=xk7e(pGaL zVO5LN4u`TR?NBI-((Vg@lw>m=%A&OULs^veKq!mS9t>qs+JR7yDD7YdaVR0f*r|6IhRckOD_QNP#9Gq`(vqwuiwA2%`-^NZE}5J6H`5#BXf6 z>F+4zJ?Y1k_lEKqWl{+kAjEROiTNvAm8RcrjRBjzfrsv)yf2jZQXUWGeU$fyvfzHO z8h!}y0|5vE{9q_=r#uwOqm+kLW#4U`V(`cne~U?)}QBCeQck6(SE$5FLdPP^dp`l&WYuQ#)d)lKS}_v{PVUigg!{F_*m8g%e*K{1!wqo zwD$^(!F=R@pKHHiKFoln^S0}H@gd16hFL=4sZeWb%(7KK1!mnJFv(B_fnjU-t<`Fn z#WV^BCg2sMsKEI946#fSrYyt?G|ceIXc+hFM9<@u(X@a^HfP|C7J~4|=8WGqXFHIb zvce++{$5v`vpp1}sA{*-3)4wM2}mamH8Pzv)I>jNHbXw55188Q_zdgm%y=UfQ$CQF z(pHznE3n}pjYAQ|Qw1%SkXUwQp)Hj{v|xot!JZXxM&L7l1RQeD>~ zL;kWNi`CoT45TSn1)^q|qPqj)z>=!@*Mjj9VWq0`O(|t1nn+HvvZP~m%#R`EDF<^J zLzt;B2Ajm%5NuX{qakSgzxfz!qi-suA#YkTFoS`_iN)4=Y0Y#O)q)4eyg5l9Mwe=e zGon!y>BCk-eYhinJ45orO&OG*vXpiC85`7_ztM0H87=Kg8UqNB*TYU(MxI*h)SzKi zpthPH&4^Z;?=V=^fMXz4Al^c;MTTNEIgk$#4y*Lvq(j~nt>UFRo|)=&7wQu51}`$g z4gQft9&fP^jsvn+Dte0R6)E|-#*?3`)89`v`5Sx9v!L`vd2VoF`&1Q*g;1t#VcmAa z|Bm?0ZNDvy!czac*Q#`-Kg-gE&?8e5Ydy+!cx`4)lUD-U{>fsG`OrhbQ#Fkro6;W~bHO?A$;0#9(cbdPtP1iN9S4mu z)}3QkUD7(=U06Rvm)B(8<02DMq%AVZ@6C5hFwXq>e0N^Diyzpd_xgB5I>@<}_DCA=f^p%SVr@gjCG?(47!?u1=*`04mH)OxvQg-)P zR}l2o6)x(^`ii@?_RjYzu41nAd`#FdcK&}#x{q-8XGfDqj&MurN8xx_{o)9B9gj9H zcJH!XH)gAuW1KFArObi+ba2|IoD>L_YzejPAqA_bPndG)O$&SMFF4&1#G;^e~p(oyb|mw09N z(XK!B*?G5aoaI|VRugDu0uU|1cA@$Ap$6xVOhWoEs#CtUcb2ttg8va9ZhJ)Hk|scMn+Kx;Ucc z-sEp-_smb^WFl*i3HX-1B@2zQ5kR?YOB$Wh!sg=XDw)#o%QZz@S;EO%`kWH(eWA}? zIh}TR&DI!Kt+C{|CGG-(0&ZC1j#zYPuXyV%zHa$VspIq$8wS!i3?SGmFfP+z4%5hW z$GF>U^SJLK8FhUZXDxN>s_8OiC0Sen`zG)xVlV>SIGG{xbOaQ=fFv-rcZ2trXkK97 z$%Ga3E}VNcFtDLW9Jiy{e))V4*G;< zVAyQ2B>vgD)DiDyRxKS&M?8W^nkV=cAIoV3-ap>&j=FeG)S-k}=+*vthpc8;+aMW5 zJpxg{Fk(6UYuvMH{A)7C#jHV)PJb>ZT}*ten>pS4xpb>nf0mVclBhc7Fd@cTyJon7_=GJO8giS}glcaPG&NW$r=o6jggJ zVBvDMkwyyglWpd$sK}=cYEGbMe8k6kb+!nNVFu)u|it zm=jg|R@NsK-wk^c>b1^N$r3pLse>IZwRc4;tZ*@G;J*Hp@{rRM=Q4 zVbd(dL+Gir2YD-9oqXpXvx}-FEJaO~UhkGGMf@~7Nfx3)+3Y8jl?b-dtvj-iP?L)2 zwz(U85sf!D5Wd+<856#}vX3%yww1>zWBa%AFy&E|^VG8|89d2dQD40z)YYgtZHft- zj=8BrOJzE5V~`%q`|BoMF+^hlDM{WRYKpp9h^2UdlkIJwr3YMXTH%yz)1p!Ynq1T^ zI$n~IpZy`!J&%PxJ$duVZXMx?qbIwblK~0G6UhlhcYECybVqa@b=}=g*P-L3cn^z} zh5*cLs76cap#7>mNPcg*J8q$7u|<*RY4yYO@1XBrZYUXp$yV=z29{?iqM{Vv&imG1-zCYx zGt%~IA8KIkfZmS?xpwR1rT$!9`Vj~uE^Gdg zl8=xm_X(n>l#k(2Z~6$)K37TpeFdJl`;wWbxU;L>aUPp*zA*|YZ~LPwxCQJ?lcwv- zbNy&=WR~Lla~sUhI3vn|iQVOVjzcY@xjITfaFPJ&L8Xr3+m!iV(}SZ9F3Ic{RWzSB z`4V1dul8j3;g+Jl~$H9AlQq8PS{#m6@tm2B|q1yD5$&x1Q?ey<)l)o9U+5 z5HhyhS>;@BS0!_7>6PL^ta7FJIV6v!Xi3yd87wXRy-R*@s;kTd-B6tzFz5Q5(_)T? zlIS!yf7%W(&1lfEE3qECu-w(_POYgcavE%N+616IRs%Vco3R z6oJ(hEZfx7z*;&yYbiy2W;mb=$bgUl3=E|R3^II5*EQtBPz2Nvio8N(T1y$gQmfe^ z3_Hr*@TM_v%b$J0{+N&z51J}5C?{T-^qk?ASHszB7y=?$1A2XUtu)jj+mBCSeK`+T z&Glz4hh(vcisdE|B$X<*MJX?Go<}HVczVp4QT)O)S79Jt2aKj~h?kz0K?C58d}PNw za4FsPz>H&VTQqY)*YtSvH^zJ-Ku$o6hrW>vyuw}9>J#`4aac|A{a3gnr+@g*;rDqW z98U9HBt!9nGu_~Yosz4Q+Yo>Oq$hFM<#-mf!qeMoJ`I*5&R8s7$&}8MqL@^FRn@p%#gfi^sYQA34HK@POB)6Uoifim_pwkk3Cm~=KOo*w{mdY?oAzh0@ z4NGK%vR{|rGPr9J#jLtSv7dn{@^PH2h#9Jv(d1fWp_etXrAKnrj=)bvo<$zwE;1E( zGQsyoCQ32O;C{O&!}oIM>5}*xkpyTnC zf%LPv{IM`;K<-1%tXrju1}}agfx?y}tB*-RiWo|sjopP+XaF-sv=IEDT}4cxbbqnG z`#g8$edUGcD9S7ajEYE|<^uN}uqlP($qd#dnO)oEJqAI8Mv*I15R0!=meeO=q^Vkg zmZaorxJi6yK&aH`p%5)uA!mW17*2$=S%{5*WBroc;Uy&o7{<^CYxBLO<6>nt1|pYO zX=JRN@aRnmDDslTC}k|2UW5=x#4`bGCMu_{Q2(0GHC~u z{6Lg!_69BZg|6y|%|f`J&i~!3lg`yz#|3WD zT++C1l%y8TzL>e~iLm}%UuoJB;idZcSIW-hlH&3-ltLNj|dLy|b-*!-f7;Zgj43r_Y?air-q}-gMl+I1ss; zc|ug17Z25b&10m{7WC6--s<^08nH*okJq^VDAh_4<#o)OsYT-6Fs{Yg){vaB)}7E3 z0?+*>1s?G#WPa24Xz;P*gKOQqz;hT1F&2sJQfFUm(bo{_wAoh!S| z4<xcvJkD^oMpdJdpm#kg=++4W8&h$quz*G;`%c0~~TwNPe;owdtRsxxE?A z?LCgKpXP_PsOFzcf2jG#(;sU7(e#I!-<|$Y^E=WX8Hq9;RHi0KC-8al0N3bT@$ zBD-MoMQ(xYv6>cAU%MXLEk55{)wy^AMgcQPN5mDYdh*tb+}he9cJrnCU=Bz=bcw4Z z-@nLRntd)g^ZE-=_SsFzvh|p)Ht*cH-j%Xb_T{wfUCCE3A@=dPNs;?swSFwCpuhg5_SPR7z$a|khpn1UBF1FU|(i7KhgFrHfg z3*h$stayoiTP4_u^;fWYAxAd7()BHoVS)+}3$hZ?Oh99I6ufh&Nuj8)ZFBasAL`Yw zbc>F}lFl>X7#HCfVS{xpLs48Nx$Bi~-qLX|S4ecCl3iwsFab}i#*b7a=LI5l$CGDX z=@u+v7_D9>N3fL?)r3os%GAJ0?gt00WW0V`o@;S+n-; zrA)KlO+NN2x1e(fV@}ybF$ulNP`hH$5l<%t0pe{D0?GGcrbrAl8~7{>RV~ZGg(B4I zm26}>OcP9sM?-Zy=aV~9d=|9M5V#Qi?*q$0=ieVscD~xZziaS6U?gm$@#$4WRo1-5EoLRZ<2CNm8Kg0H@feem zjlVEJ8t~a1y71&{paWk`roGmk*!{P^9)nTHv_fNRL{;EUguV2r+EYrck7I1aXif9uXndn$Lp_f=gt|Si#X6+ydSgM zKKuM4-3$3a#-w1?)`0dZrg2o zpJPW*^^?0dxZ{%N-rix!p$rJbHU@>X|La`CmUCHe60xQ=2HzV*#N{W~;& zm-R?3H#UDxy=7)+Pjcn&x^p}3`FC2DQcY*(CJ+9uJEwS$zMc;L+IUX7nhHOoTg{Uz zJURKdt6fKDTn&!@DVv?2cTgt~8j>x^kbu|V|vb<@AAUxP}u0sX_y=+xx@%2hx?PD^Wa8zZt-7KMN0~bldqw> zQ`M@e{qt*FX9M8tRi_W@^&@8(^q1R5^(pAl6uj|mOu>N(?SA)dFVgPXx4X_drf3FI zs5g1YeDv)=<`=3^=i1nu{_yQocsLy8{noDW%!WzR`u2B#r@vG+0C)nPPXC~mQELOB zdy?|CK<{?lFQtus;#wNrs#}eS#MxH@Q0H|(?>;>=+eUz1doyjWJ$vo~s`Um0clGjA#VeKLL>qAbrafn;ShYItT5euv()BZ()!i6Q*ZH`$7N z=uM=p$v2lsxuCyB7?j(_lbOOff*W^Pv4XR6JBk4mt%w0yWB1Pm=*KU z4C#K|(F{b4_tqN51L#x`L{oCJu%W2+*8QNRWeWB649`rn&QP0 zGt9e0J~|okBn(b53zBqI42UqSC4kQ4VSc=nC;{vMsiu zW&}WDU)WByRHeQg$)^^x!;bCEc&K>d6|NX+Nhkn1rM-Uja(9J){Yv(W1Wj!g8&dfexdsOsi`Dgu(HJJd@S2LlTtd4P&6+S1IMkm@wf zWY+u8bMHz{d!IX>k-YzXM1gU@QZhZrjTNt|dfI9OrSr09@h{Aele1JFbW@bzGB)9*OyL?V928Hg#&+|$A{LNB>{&dhS zs|?nvXx6Y)g${J%#9$riRwYi#xXXci3B$&og=W7S}uf z$7qRSo<=i(W2?5Cs-n`56Zb*)O3hWPqRcQ(o|wG(gKimfb^8b1C7s{9g?bkIhs@Q_ zKIql#MtJTeUxt z=Nyx{J1@J{&2>#?_1<~y5L<~i?4b+ZP|P;*cwg-oB4CvFhT;|s#Vzsv+M`@qNxH}e zZ2|k1Fu_PcJ^lsKkP;DzMRY@?;MUt*<;-9`4urIchf?*QCV^q;F(B~4Zda%lEQ*MH zzc4$fA?StB0`V^$n>;f!Kf4Oi-bxxDAY+VRgl*%?-3^`>3=>bPZTZGWhS+|p{rdJ} z&{f)3{r&djV74+%xj334E+sBJB4KmH>k${K=;cDS%eXWzuewvX!lnq$ z=H>gtIH`Tw!@?cduC`d-7!Q`$juD6O5F4RPi*B1soHB4BZB0ULO zYSGKZimJo<-p*A0#A;$Vojx$jMly_T%WOHkHY7WjY&L3!^1e_Wpu9Jf4`zuS$VRVk zGD6d&ut4n+Hj|gmzo;-O>>#{FZ&ln!@k(DDr+Bq5?x(2fV-7CxclL0H$zdePH|`+F z?58wnFoQUq&z>UeVOZP%twa)8lSI}Abj8v>pq*(lJ!xl}%uYr;*-B7a<7?4h5I||= zp(6^kMX>d~1~GMVf*Gy=y#~v`ktX;dD0qk{z~7t@c3)5k5TQAPh#K7kiPT2qxDfvv z>k)&Bi8>adJXp7I+ko8}m?3k#X=@14R>XUZ&`L|NlwZy-1zPsXZvZHfTOBNd>wuF8 z*A%}Xeo*T7kIKkwJbNMe^_^r;7$5?w-M7-%(R-DW8S2($T7%RLIi7p)48!)A)qOOD5`dPbT@{2_rCE3X{WJ;4HNMVQqw+fe!|gbOi7?rt)c8Nl{N2qO#CSh@m!? z9y$WI*hUcCVOd%ElfM{t3y*qPP|qem9LAVl2Yapo?6#C9A<^N%&PuN@ycFz0{Xsl% ziX0e_(+*-OP{sqfn%O;SS|K}IwzS_N_S!fF6(aaFem-OTuI^;1<6U#I`%bs;NG8WX z**G}?y_g)2UQc@TIzUi?N3WNf92@6B7ET?#UTku-fc)sf*{<;~w2YccOY0qPieHni z7-X;bxh=H=G5smA^#${iBLXS=h)b5kUzlgJ*i+4$x5HCg2O%?6nHRx5bNutFP*2;w z6!J4^Y*r^UPr(f_4irQDISN7sV(5yxDr#6J7DG%}8LX#Hf{zpbs#9SxFvyX;3Oj>! z)hTfWAN!tU>@G)sfKVIk4`y{`?R~1Qvp*_^!fG{$33$re&W=A---d%nsM4`QHg!|~ z=sNTnUKH7&Kt=#%MX)=C3h2sEXWMP)O9~+o%f;kfd~^$eRz9p7O&}CP=DVN^gU#@e z7w%!A_iaT$7)3xJUOE--nSBdDuoj+A`yiXY4=Z72HmB_p3TEB0cV7sd%vLoEMKlQ` zFuf4ZX3sS-NQ;sxR9#%OV;jE;=_8vnDzZ7t*qr$YE_q6rcpv(mD}7Y!a409y?EV&x zv{Ps_%2_KyO{*;bkq-0$l7)KCH3#3e%=uX_4zzOWwX)1{lXI|bhr|x(p?;6D^mM&n zN%wtyYz&C_;tM?Q&wMdkVo#*6tv%F6@U!+>wh}BOA)}=lvyW`PyjDmWgb?we_8gDu z3J_5VS|!G8=PITSVX=nT4)R%%*DUQdvwMPG2Vt-v**HJ7UWg3>jWXCE@)|@`#d|-Z z0$1#7*7&d*fvVlW1*+vo=B0e=1aa0H)uZr5#@*}2WTHVu*U1`4*BXaa$vCV^#$i>G z#o<~WTTRQ|HHg~T6;&H@(0*D&ra6t4*N83kkT7w^x-nI@IbeB%j{u@C12jqm5TRAb zIQ-s{c5*oFBsZBb)E45|v*l`iE_h$FBZ(7~^jjgDeWDEG!I_DPGJF#SO`Wx&ecA#7 zKj7B-0jyg|8|3GkaWdaD4mPodee)}F)n3YBwICkR^{CkohJlp)T9>Iu<7v>YgYa&! zzTVH8Kubk{RdY802*r^!hakG)4fqq^&r+6e&!7uKs@`F4V1t~1((B&qk^2VWHhodR zQ>(xsl+-+>sOT#$ovd$e;K&UNo@d%*#H*xO#rWS_p^}KV>D5Veicv15MnKxbrAm!+ zxYF}(E_~O^g)dShEZHY)xAOBZgu>>lkQlDACz?e};2gB6OM5{5Afdr|hzF`Q?F?0C zeEXTG8lX+Xlb{{R0O>d1zev-m(a?~35}~BasD=CuMim^l83bbx6JMR~Gci43Ljt!r z=`M&jF?k#-w1Bck0(dm zjk)F>$s6v*;`6iQ@w?r5*?&)Fd>qrt&g8U@Lx4vfO2$6!<{w2MA>ccM5t@&W)`$y{ zj>6scO1m!IrOT7-J??zWU#suI+*(PlxyQX%HT>`%b}|kp&0F0yefz&j#Eddk0nzwC z`a`iA2h$(8IO2i7Nw#ctZ<;PuBqvO`8s%1E&Misl6O8eh$gdcc%W5>n}{0`SLWwYRVjN*9Qv?TH>?lg#*^s{dalgEg?E>3anUgn=koE{*C{;p ztm`UXZ$VvPh;l+;8e#1L8X46t`3rYKzdPIiFU!T%92zo~k;;I6E@(K6o)*Qd`xg^k zyyGw2k*9nYsMX%)SU;HBsTW1&q=a29eW&^lN6K5{W+~(eN3cbu4$W4D0{2moJ z6`FP^eARAzyTNzo$Ts&US-15Y$w~LR3pxh=9%p|!KJe{FfJ<`Az3vU!@9q4Td+|Zf z)~t#bH382dq){7o>3hk#`!I6;EP4NZ?$nw+hrS>p?tJV%M{?xxA0*E`;4XI0{vdh9 zC*6wKyZ-9SnGLY-N+BK?cr=r)w5sYn5F8-8TuxuR7emR~n za<>VsFlCBK1nlN=3N*slx48x|J8k)ti}Cdf8m(rlZpA!i8)cH8e#*V`b?o&afB{so zMQC=NJI-+Ba0XJ|;^|8NE>H6F*upZUFRN(2B46Chns>gaJrcO^uGgRUmd;GRIOe2C`}&qr}(os_Klw7W!RHsO$(dn)<( zr`_@+NV}Ocqh?0O-{kr;*Fdn%Mx(~AuIR=8{IvU!j=%ATU+T`EJj8rGl|1v1vjfLS z5lt*mhSZxqJKQPre{Sb2v2@vi17|P&9ITW?h1`|AV~4xsiXV>AwP_^T>|}SUq-Coh z{)KLnWz({ODGpKebYA-zcU3WT!H5YLh1Uv|3lK+|J)x%Xhb+`h{l$<4ps<=)FlkY&-e+y6``_M}1l zP89|5`0?cG&$-9kE!kvj6%K*(|I%Hx5YLF&Yo`$p=}MPrRnDn63yVifO1}D+E?UT@ zG#Snc@sFSVz}E{hAY}dKV(1Vqhy3T=yRvWF`TL)D-P!D$k`M283p%bH!k~vJB|_E{V-Gu7cUkb}Xw2P!|E<4dmlWZwVP!^Z9y*v#b2 zG1qF_GkLf*yfmVhUO(neRXT6TB#~Cw3*{eeHvg!cCJL{4aLk?XCXzt>*9V%8&8L2O zss7qPC-v74a|dP(BzK;TY7C!!#QkMgDy$i)V40qi-1sHeck;RR+K|wJ*V!_nu~OO; z?hMrK+_0(xehUGj#((;f(_!2Tzs$t{EIIqjP6yku$T~XPIkh5PhTlpq*+b&W6O!W| zb&He7zD&GU!`lN}#D1P3ZYi$tU-?3+CB@S~RdH&$65;&YPnWBdevy z+}gPes8~C%?Z})SBN=5%f16zYm^-~wfddKE-s*1I1Rkwp|87(yX&ob;{FIOO*MLSS0$Ryfc=ht z;mVBUne%hqCpLf*=A33KoF~f9u~fi$Ht)`|(p(ANTElld?q1b^pP{AXg~#2JRoJzG z@XN%{Ou$c?F^(6;vMSm5ggbxQw{By6&+v}80GpT|dBPpD+63Oiu`Y$?S@QzVl9M|e?i0Atcarf!^Zcq9T%q)y zLyq=&^hY^&UUgc!s~gjWWDlet;TfWbm)w0xfdalX3|mL`X|J5?61tf&|A8NpNc9Al4+KVw8s3mWYJ84d$^b-OtChMeEg=n>Wd=f%(;)gYSog1E zDNt&uWa0`g%eYm1H~!Czwru!Hx^x<)fuuYgsURcC0J60jtJqjoM}cD&W0AD5DWLR( z!AT2hv<2nfQ_B9#juuQ^={p=$Q-5yEEBA7oS$-(J1+B?meaGND1}ym z9d@v*1;)(RyIaaFZ1c$-e;hBIo@t_-u`ipW=_|2`vgKddk=nUnRw5H^zL9|t?8fPC>lOUvwsZBu^{h41BfVHN;fU~2OC~v)zJDcd9__*B6 zG1&__ivKCeT}J05LSt{;40 zUxB1?CK5(5kTiVk{Kxh!ZfE@p-->+Ow-{vW-(o}K93;$uQYx^J>}XYxVG9tfUI$|5 zV#X2wOn=mgfrmhx&U z*@HERzbzZQF-Vi4vmD02$OtOAOILguT0xO|Vb^Lr=iR4ec3PRfR@~{C&+sFxUrt1( z;jnhq8!bYf`h^*nu74*x-~k9dSR*7!7d9%$$Fsu5fEd6=;A#XN`j0?Y)y(Vxi<(js zmhUt%uhwZ@)mdHDd0o{0M;0{Ku{DsA1SFKREm$GN|#mziMT6R28+>);K; z0#+bGyt7qAOt5Ox!UkBa0a&dVX{yQ^0pQpu0O}GCA~O%fGY;smEW)o;)QS_fvd1xf z9{EY?)N2l~&pux9S6SScW;<-CCcs z9jyV~aUn2g>M_?0?SP5atdogS#VuQgQX z=d@3&4^+3+sIEq9SXshtt#@5Lj4Zt&3HsW!3gf-?5rYB!nQsPyytfcnMUmTL*g<1u zoIPlj;p-T+O2K%$dW^>v$XOg2js+3Uc*V`H%>K;ImfEruVQ5&ETF6BF!1cQ7m|f*3 zLl8^Uafo7xhUjeD)8cAYDoYk+~GeC3(Mls`UJn36w^*|(lQK3XWt7PE_6 zfN-o(>8!G7`z2z_qs3&lI+@bKYgiyzm&+i{DBfB% z!NPAPW-V^T3eCWAYJ;kFd-OhT%b-n@Yu5vHfBPxPe{I~J-4?A$?cAznkKR``JeV3= zy173fxQd#pQv-hH$vV}axlv2bB<==)9=d)+TxOuht?6AwrgHRg4)c9|+1OC_6Q&>q=qnHy`s@9BGCMH&e6lY7bwv_xb zD%*-b$cE&UTK}R+JPXy0$T9J1`4kYTKtB;Fq;fC+Q{2%?^5qdprtIf$-O%fhakn?? zeVmtGYsjc5+(ihZ8sCR0BrTZmsPYi!MO9z^*R*ePgME%-7tesKOR_jb78Sruc~;Lx z&}U3(p=&H7G-Xtm7Sw^ZAl}y{*1QA)kqOV2yG%PYX-H^OjZIlPnPHzPd78>WmkFKH zYbOJMmC?-}D3vvYvu*;I`3J!J=;lqriggz9d0^2^EAyLdZeRQp)EtwOs?u{T5xMQ$ zXT1x^sffne+y)&~HG3N|$fPPS>L54?-YJtyS8u8gqK}!K*9eax4XlE7VPl_Ryq`D_ zGYr_YYKjk|^Z@z-w5ym(JrIYKBgTO^G_-oC7MPMfw7|9NJ;h_O;d_j$fr#+=i_L^} z+JIo0Gwqm1v7!_;r|!3i7_vT*{2aq2ifT(`Kicty-f_RLrMf{%nllcG*sloVTwDGfn0%nAk7ly^msRUj@U#FZWJ6md{oHOS-^IsRE){@%{h{&;9lb z8s1bU(fGG?rkY;^DBnSYL%P*7Qxk&CY}_jGI>EC|QXu1f+yXDhn<_<^n6G_bTD!9v z^2xHFlHTIm$;ChANV|N*mM*j(Gs5lVYkj9_`DT+uq5jNXBiIt;3!+jP6XMmAyi`~x zbvm_jN*c%n?O_J5OT~@%ggW`cc44NRUv=+ks%qfUXZtgc1r?QXYE6VLiT@Q3HH`&X z#S8FtHQiQ#8IU;9s%}7{ZOP?;L#`~($gpgcZX^f_(I#t_2haS(h^N^jNjFBBkY8j4 zFcHJc_3O81=cIByd5R~=^~JheZ{JB*Q?$KZeH~PPAEQSjkHAMeM<*CaAX?ZFs8wq*5_rkV(bR3zM>CysSysX@7>B z-|T^s$_0}Km&ygW!>lqeL6x-`l8&V)L561`l4gI*kd*BUlpkpVQOTd0ORoBdTzB%R zAGrB_(90g#ngUwvYQWUbfvLhOeY&eDx%%hqjZI$%@(pi}`bLlh`ZEtUpc}~ur$#qB z^$ZSW!)dU@dVCN*d7h)`ZAR9)(cDScLv+L0jmWb3``9&LkWOS*<2pb+^k^jMmo=uN zVQik`FDsfuC#kaZ2=WlL#iVM&FH3CAdW+1^?T<@TF7S30oyjh4Oyp(p9fIt}j$Z^y0_#k#q)#>W z&|G!$Vo%$fv>wa^9dBkl#I1OjGF452rIr}ymbNC)*qcPhQs$}ez_llMGNDs zam~+G{p@r5nv)Oz*e$MZ_CLo^LiBW#|G6vt+>7wK)(fnBGs;~PN|9kDbVfZvI7LV` z;S?d&gj1z4)pOLW{kp=kpVgIJ_;*a5G1)Oeo`8U+y@Aa!MkFn zdRbo>#g66*`P2f9+hwRC@m4+wNnewoXUuJq+lNRUYfgf3hW6#=iAPwcsQ^2o_2~uJ zyAKgyM+ssL?h)LAhsdwqufyEGg#7B?LjtZ^D$?ER{nokq7Cb)LBjhViT3|<5-nT#{!dD@YHor=yO(vEO0;{m zKD|Wy&HQAOY=cBAxit;vN#lKLlIqKnXtCV>zg?o0UTXVs1RXEY?lD$t5^WyIPZF)| z?}fBImaoTb=#lipV51!~2#2^0A|a`E7q`|x`^WN?xwYDNrL`+M!qu$5pTjwfoZS%3 z*h>v4(&giDT3^b)%aU*W(j8xIGDB?Mhj7^RVb-9zK{95KA#)s8r~WR)ZZYjx;Lye-!^)f}TN5S$qd z0%x)BO9p{g2gAbUK4>hp2Sn$@nP}O3HtMUkIpN1v{WzB&3wbi49}B{dVf|RekBBF? z>qk%cu~|P*5~|T`9u4YOCy(^Q+-?LMN6q{&GY94(`(d_?^Z0QLPrQL6{4ndr`TSVI z6EksOO|u_n-?)GueLRtk15MojFn3?|GW>T!l=%wK7pI6W-Np+-wfPl`{q)lVwW*mw ze6&uO5Ho``Oh{@5u{e!GZ65MFTBNH$Tg3Qfu!UvFS z84C}~G8TZP@?vfU{}l9RmP!ml!}{GsLW(V9C^V!J`o1jgf|I~dmL)_aXDuzHUwjr< z#Nx-^)&^IzG4aU8ZfJn(ZGfwy_1ns4 zFu*7}vfM)&PaEKolLilq+qvta^52$^Sm6Gu4EFhb5&sL5nEYJ?K;8`jP<5^Ze~0-P~_r&2pcrsZudfi2kcWX$vmGc zV{#ztSgw48HIx&fxSd6-loFf8O!o8o5i*kDbdQT=I3_XW)}q{1m^gB&&V2La zWiKC_{A6|WqU6BLd@;%0o1aIg5RjE4qP*|=5QFcbxOvD<<+ zf|L^fqkyNr63vqrzs6afb}_>#gS@^ktwq3?*=8QzZ|CZwo!D1se6M}#f$^k9g0#pj zK(aT-X*%nAGZHxk-_?gpXasf{3e}AJpOI5qD?K`7!EG zYktI<#A~V+EXr2%UC^HIf*kY`K)rBQiYrJqdWe`e8-Odgmx!h|!;pf7Va2-|s@`Rt zmOO9;alyINfH_-gd+3QIseIihKVQQh2@;w73Hpssezpa*LdW54=0AkKoBt38z>egB z?%doe`R_M&<}=P^@m4p*UwZ-}BS-RC^N38`X<{#Y@9Vr!&*5d{5u;FoNwW?+djm?V872;Ym2s&x4g$cDXLVT1Oq2#RE&I8|p zd_8owNpEO5c$lSLOmSoabgSh{Q~-7tm|Oha(YoRQ zT%;=&&RIgDn810KX*?RHS6HCVj`}GkvnxLy1eKD}@$Af?Lii|fR0hsfl^_rFh(eXe zGtB<>24uN6;NfvWU&U6+-V&ml8<4Kv>|v13 z$j~IDL-UaiFk!Z{&SjYFQhjdO*uWO4Qf>C7l7i!Y3QG;M4P7)s?a?ON)RZxz(tsp( zT2&+ZipQqd={HIdML$F94^YmK89pB^;^(Xirl1+-PL8VSGAT7IlU7f*C!@7T_Ou1V ze}*zat4Yz5ybv|?yhw*WPmQB3680t{DdL_5mQ2P`z(^ek|6#c<6N!glp?b}#c_6`- zTGR=c3L5z>Hu^3=F8wa_sG6UM+U6t0MSlotr)WLgfIxQ!L>v|(%E+j7i_@rCl%4IJ z&0h0Gc}^opDNc+at=eWC)~epI%{nS8%CXtp-2~=1a97?^^Tb+em|WCrS@2A5?X@g- z+ZFbt=uAa#?)LTh@XcC%1~4i*uF)M{l|Nj3%lzNR^=E9iQ_!Yb%NO~1G;eKm5#qVk z7WQ<_RxfF_5cYII>}^k%HDvR})TVGZlOfLNqcsp{53E@Os@4d%G>8s3dU=+rTw z`%)OVr&(hc!ohqSwH(`5$W%2~E;4bPdh zat{UMW@h~P)g~W#+0CORqc`+KZZ~LPAJL`{eZW6$QMI)&J8FXv%qBlVxsW6K38|Cw zXD1))$rUVhe?h4n3iO}+18poONQ*|qw?obP&K$>vB%bG*rnA?~WHniq_jsTFSl|Nv zF{yz5v{>8VHb*+sc9*rSi@Bbw?3kkQuExe^2@&)Zst2s-yq9VtNwpHG7^`F4n6QYQ z@)n3$4@7MbC=9y1nt{)jVB}HAl){?$tv*grFRFk&HGB=`pd}gyyD4(Nk?`G2n=|QC zG3qE+D9`ia|3E|K1FBrYw>N|7ggiA=y|FHR=lRm^2LW7}faV70_zPrgQs)o4@)5i? zlhI8Uz)2Qq7$o#Uy2eVx-esp&wTA+iq*EXHjc7=uqXh8W*~!mVH!m;|JUcVlK0S9N zvDnDULF(mzry5f3x2jB}ZZ_>fA~j+?wYEhwg_%L*mbh(Zt?{%&8O75fw5K(Aaa*^Z zag(L(s>#0l>{BmpKkf8+yq8-5V4tgr+k4acNKDR%7D29O3O}?D-Q1})k^7sZ$gY&U zt<+1z=?f_Jk9PXJU9ynSCv2JD*f zUH_5}=Hf91lgjpE4Z~4up(J8ImAF&P-)-go`O+ z`Ph^b3?+(?^@0=Zyc9Q8H+D87pYxw&Wf$Kk!J3rxhY`_TJfaucUP46I@pYqm(L{8N zmDw}|*SD>feZ$qza&u$L;_l7$mKvn=<_Q&Rb+_8sUtCIWo+zciOTfc3D=EFIeRPv0 zAR~KTSgHv*RtMlV6{If8*lpI^1S#D#CZu%b&o?Pu-|Y%GAk@`-?=n1S^^5g$;GRk8 zfBGvj!h6(3M%US|UPkA6gN#nLvKl@;7|?b!#j89BB%?bZ6r!RbD$c*5B4qTLe#vrx zPpzKq_Ps>(D(1chWIU{l{$j|81fba23Db>?&VLfq8z$F_=?&ArszXV9J)9e-I~CJC z>L8}`pCt7Ll*F8^Skp!Xmoc##}Owg8YJ~TN$N;>CY>1W{pON7k&9kZrvW4VHA%hMCgHG>IvIxf_7F+k z>J#&n(08b$E|xY?QfJj#C~GRIo7kC3>diq?m(B)pjur(;ebJPXdVu?6Nj)gLRq=Z> zu~MhP5;VM zZDKqNU1Gdb-w+%C3t4eoG+!wIfSY0^N%!Yd0BC|31@^xU6{LO>@`qU$sgQrC#4*VJ za99^iYO|njq7>r0gd_&Sn0B97m#S@$Cgn409ir#ZPNFhBhMEU%m|&pWsADFA=mc4R!ehvZfjVs3wmt@dpZUORWsX{4 zp)@TsP4W-l7jlPa0I32%xZK7H#!M8C4&hfg+#WDCr;;_@nkP}HMWZYOt04S$JP^6M z@Ne3?7yhd+?h+beI#S_(NYfA`<&U_!OGx~}{1j80-lb+8Rd+6|^J7n)CkT^sW#ll# z56>z`H2@FMQ@b_=`SYT6+sdzCxW`0CmAi?S69z;_X^I=XC&xtVa4twW^Sydem)Bsm zVSs}T10>aL&FA$p2Dr37z_k+x*f_rMsIs&^zABj)7~onP;Q7(oZRIl=;F4%5rwBFs z0WO_1z$MXI1}Gt!9B0ktSL+H=T^7~?N_ySrjJCPj_lLD&f!_M$^6<%}?M`WOgo_Q| zP?vpUgu<}S79mgL{h2Mz(yEt9T3F4lb{5&3hBCMC>|2<*@r~10MGIF&3qpkX0=sv{ zD&h;G9^KRWw~U8SjM=M5`eXSMx!HLbb3jTA*m<(C(r(0{EOOSVnkB)miso4*7770n zl@v)6v$0aNS}Ll=ht9uZ6+skHcj&V}9s0~w#9Od6&_~Mq!27dS5&03#;2xj)T#Vj9 zRgaUeg~?-7BFz!K7eOwhVe(CuriqORin$`En-G(%P^&{E2&OK}G($Fj0(LaxW0*7y zdt1t^rkKM_ELtnYO!Rq8EAV5Yev&m!Acsn^W@Vc;f{SX(Y{H$jAQzYFnw5DyVZ!Vt zJfrpkGaEMGveA2)&tS8Z3uc90F6{4!xDX#Ohw!fg$>2hokzFlpJ^wZTO}mMz*Q7hn z>98*kTzQkW>co$>Z0M~zf}<#pQKkqxOC!mmE}vHpz$u9i6>W;vZo*<_>s+Tq+sHxd zyhg79@7LJDMbJ2n!}>wCW$xhK2`Zak`m^9o1)D%JfhS6A3NFK{!r)2dT7 zUuUShmM3FM5YGONe{HJ*^u-1WB_2vSqI7g0gtvX z?Y>zq8!W4-B~#nsFr5X#$Yx<;g&MrLNt%AcXA|RqM=Ga2iv@xI5KSaZ5o7Y|(otg# zXf)>0M}#{gVTVyX!X|?pbM@eOwwt+<5?{+glS%W%$QlqZWLHCVpUVm(ur3&0+3MjF zRuHe(lFp=+OxIn;(D41J$49eBJqSKly-6yg2#yy=NI%4h2nmI1VF{-bZ}aZ005wxU zp+3!+0&K<9@Q^TSPf`JLp<&{M&4x+7!hG$&3?!!kP0494OlrhzsjERp3z*F(4ww}o z8)T&k&N}w0*&-?sqSUa8lqBR3B=-oCR%)xk+|oeV802A)v|W6b+NMA(Ffc_ds8$_Q z4a8Gps)-x%4ie!6=q-zyI=aB%ykd)-6u2pydMO;X_JzbAfy+)hKmCZer-Tf=6~f&M z((1b1<1;fUSgAvSYAiD`7Iw#GJ93@SFwb`veFB)>Ql`Z>{MzxG6nF8ns`vdqM8%Ko z@aacv9)PrEHPl|yW|3d2n4~kZSi>MmS&M~j~`g?|`LQ3LY1}Xs? zO2RTzvo^m*@KVr0^?4&sdkv&(&FKTW3k9yDUWzSg%NBGXT=5fAR*;M}hw&=yf$T1F zY+1Y_x%YN6JY^`c1b;R#!*$$Q;(4zv1^oF?F1a^69izX^TmaHyb2I|h`jBrUAmHnW@Kr03 zz=R-T)q4`RRn2>XBTv$nx&jo7Qa)tI?dPBj4&Zs`5*_~x?UyoFVXf$u1ic#o&WI9Kj; zXTv7-e>M5$s|s_IhsU!8A63>EawVLz(c{zc`3cQo zQX4X+6>pOYsi%r?hXKtgN2KAJtv-4JpbSg9X+mKEmg-mZN+%bwgz_O4r_QoG zRW$epdhC}~A8q-?=YuPlipZn@kR{WfwICuilWzIvQkx)buUnP53`52%ffcS~?a!!5X8osen!kSykCIEQd`I~8| zfyZopZd9ymQqPKZSVCmfP~>=_N{TSBF(b^`@e~RxpwAr0R-ehok7tOu-J_FPF0M?7!YQhK>C+F5R)vXhO6@*So!PhO^RNK zj`77_ip{>b?B-1?I7!)f!YN!9>Lj=6QQvYWrJb-6F_CBj6M=$@iNHNzBBUnqT!e)A zC3>vR8>wMSKoN$}1pAUJpVcn0q#;N3ArmhkF*Asdq8VP8g}<`Z!azP}6=0dM3Mxb> zPFEzT5X6tbphXJVvOsSyzcwtP{ec>SQatO=T-`_!ZL0b+Zw=8HjZ|=wJvI&qeICbvk`X%^f=9$9w|xvLLq)d@mvfXK)Bw?}KL z+bqty4ui9WZE07`6KnEhizGAp6_#T?-87`SPn!BsKNOL8t4})n<++vj!%WKlfZ9wa7 z<$?rK>}JXvf-Ksz%J`4BpnBTS#+(+ap2oCcafLV_k@z>fL3P?H?G@{*XCtm7zxjB0{Exwj>wcA1Q7LcQl2-_5%Bv9bvBtD9VV*t){$YONhwN#S$rt;t z2t?pNB>1}ALvcM9M4okA(55fof*^D*7u1roxuBMa_rOZTdw{oi4^B|=o}j>B8j%8n z6}iD+%;7O5qoKebi}BjjV!S3=TeBFi22QdPqnE(RYewSm26p7O^4h~2jMr|$W-NoT zar3=3cnjF;Ydj<$1I0Ae`Xx1MvF$evs>mMu)W@2w(<;zeIINfpDs5gdX-RgTo?Cdn zbP#I|oDa5QKeh3p#$pzqS0OBJv(2jzrzmvvsifzO+=8>r4wagP8G$zohdp(yNk{a! z%~;;60Wv$=Ksnb-mE3SfZdo|=H6WO>aAdv8eJuMVwWhFQkk|EW+wK~T^n2J@GwYV zlMkr8P#=&Ycm+Dho`|mtQsW0#z>s@$IDNZ#QNO{8kf=%`dy4uz*Ul_hwB8(d#k|NU?~stW5zXhOvYI=7lkkVOp!a*V~**T z)>Mi))1u}>utxM#zC)U)qfh=39nH~E%MtF^(L@ADEw63iypPbBft8NVh_0A~05UUW z;Cl*CZikv6DtBq$wr}v`X~IUuCt99GEkNy)(iKVyGMcEw=5fvNH_p!WR1aq!^}q`D zHUvN^c!qZH$JdAbqB|bO#Q6|+YU9MMKJ+e20F8E z(u%bT6SP*5Na&j0Q{SMJtg$uQY9{@LJbz)J7*rbuO1ok5tZkb>tD|TJ93^;uQiFmm zvr}BcrzfF|CLnP-n$#bdu6!d=jHa{E9~iL2MnKgz0@wjqBLPZYUjrcs`D6Ej*)0LN_e5$q&!LTWW8jg6Day(uD>d46pt^@eKf9RaDpo*z7A|Ii-~a z>1Tp#TdB4s+5iQKHcYQX8)jE(HIs{Iqx0X*`<)>_f~;oht^Am5MbHf|y7`>aEk0bJ z!6FL@!eKt=X2HuO(cZyL+vuc^=qMk=`;J7|w z_k!{-f+(%Ac5zz;9Bro$2GavT32t{nIjT7>^T({%k6M-enGch7{$pVbLs%|GtV|&C zW*%%Y@vT*kX1ycg^wB(47hlm-{RwUK<%XEc0s5fv4N|_r7Y8VE5TlKn1M77TBPcLL ze6V*@M> z1%>rdplI?Pdr?sEa;XxX%IZJO)>D?!@pdGt1ufFy4d5sS_Vh^9Q?%5Mw|7tG-IJ`e zLRPlr6a!FuouF|&?Q>xkQ&?O>5zJ<`$WWWd{S`cnE4lUJ%y#C>+$3})iov^h_0uS?^IX7eM*YK=oSzJj`6eyG28Q% z)?-}1xbD-ndK&prRd^L?Pjp?e+&!x6a$Ib>z7is=>&XyqT~C5=>qe|ay zIHr{zllKX=*D!$1Qw){gVxrUdCv&Du9dbalpe-G-hC-ggI<7OhuI1l_loxSUIsWea{AAfJxK~^y+m|a<)~|GbSXsRd)NFm-d`bB&%{TvJWoN-L4c>S|vCcvsSqaS)>kGRQ9GeB4AREC!8A zORwu@SM5kPRX?I8c06V)+1TQK8KL5Ko3y6!CdN4bDp{^D(R4w#L>zIS1F4!$b|n-J zzHbK`xJZ%e=*t!1c%8bL)h|MYLe>R1*-1cluS zl;yfBTdwH3BTGy$*HMgtYHfSAye4$Q`X^G(V>%Jsu>80`bb@yo4}>(!FlVybeB@k- zQnRf)*(tmuvPwc(;^xp0#TO-&SX+!tL9Ia7dO}iX>q)oR9c;Zx{PupHMkEE^u500e zC~GmitQ39|+7~CcK)3#H+Rg^fs;b=oXP>=h<_t3f2N_^^Kj%2&@G2+@zGQ3!1;Io` zLqo;lDuHz|skF>9x4ec%hWWCv%*MCG*C;Kqw5BAZBEtluGNY>%r4?SiH@bhT|M&N- zz0b@j+ROd_KYWBx9Ze#hc3oh8uFzIs$X?+cxbC2))$6+ zv4T*aOMd?J&7|hc<#H90#PR~{S3x2lK^Ka`Lv=4@{uGA33M0S zsKf1{07}rHxE^U@D1b2wD_2SN6u(Ys(5IokfN#_MZ&bsCZVdvUvIo-r-n{P z(BHN+3juCPvkTGn((GawOPXEEy+CPpF5F7lA;w-9hjM_VUWee`0bGrdLPnxNlY?+I z3*;bN0Zk6V72JTY1(x2WQSuR#g(NKAauT@qG7|KB1`L^M6vnYzOD!FcE`QqenfvB} zj!EpucSds{?v`WO_2 zWx)nzj`tssL?Yc7KIl%aJ1u#*RAa8+Czh3w}|Iy z;dzQt6eBydl>!YjD=3BM@Xc^|o2ZT?G)Sfy-rneEo*0kfW954m#)C&w$f*kUuSJWf zm6{ZAd^%G{)?a;MJbDH_{I5Hzsw1EYpbY8AkK}WGtE zrBPDFRS-EH`K6TsN|qN-lH>^g0`g;`_SY_JU4lnQvt8-0WJ>YDyr`rN5kjKt{zyh* zZGm-dL7bHkBa`Y>-hLRug_+03GoAoh7_)@I7-KLOFr?{coE*=ucHJ*ksMB~ug4dPn z(#Y$J=s~KWe$a`~A=p4+Oqi@HZsu4GNh_Y!MZL$t_qlBph)wik$q>=6iaKcC$e}KQ ziEfChbo0s=1p=JAPG1P>QhJR+bz@qzzNhF~WqEV0QY_qcN<#w%H$Pq0Q>0;OQ2Ygy zlAz8b*Uk_e3yG^~Ij(9}Ux207(*GY&*bZfNh~UurDomJ=;uZPgr~QW(#rvPDhvKK% z8;Wg3XI{N0V~$MIMn8W3`cLhQoZ<#{0Iw$re@y z`9IND0>2a{2+8_P3{Uv9>l81Vz(?;$^2d!RE(tGhjEGSsvLnZ1qd)W1cuYT;%}it) z&0cS^(z#GFvCq@!L)RR4|B;;Gd}8-J4Ni4oi1JM%ayOx93!8xy1@ zfbKdr;)t}M$XSAsp}|S`X>`rb zf8msP%6TXhsuxS)3-#on#U3bL=h)`#5lf(OU$I1`{#Hp7)O()vEXhogo^APu=B@g7 z%v&xKotlIoln8BlLwSN2S%*oK$0W*2$Vz_H#E32D(jZN$edP%5hq-J-n;6N9jhh%5 z&{vG~w=oAX(vBG6CHn#>6N4BrSu@diELW|XKwyH5u@dEC!XmGY#7n4I$6?NkfY4NE zOWMQJNPf&GYlN~LmW2UJhgK<}I?}51vv5c);+fT4KoUgJT&vPXjfIwD>_vnSAWA_A zm%ir3uvhU4oWF|fIG-${V>wBX9Lqw%(pte1a=fG77{OwaAT;Pho&dKEhg(>5@L=$9HkgI z3Z6&t{jX+B1k$&tVPh{j^*a%ULegPfC+&fqc^c%*sB>cKqIyK!%Cl4Oslw$@1 zBIB4H`PG#{RI&SSq8P5>N1jDcnpkWkA6KMiS5^jvgRg&^rLs#T_QvZ164_|BDuCbx z!YEbQ#9*nCW2k1nzJ^(Xgn+Jn-OOsYH!+B1`SRPcT5C&ctu5-)S}&GrTBcM!P$gIZ zWIDogJJ8moNo{WWnK-e@@dM6^+y43a=*24Ya6swrm>Us6r^etjCa!SHH{hR>&8O7G zLKI-2h1X-CF4e<*bbQ00YC)`%4uq7oR|=ZF4*i*8exlS?P3syTD3o|wq%|QoE{`G1 zOXK2F`FJI5+`w9}=tM%VR}|mQ!(~Ai?Z{t*e$Ts|QKh-m#AVSkgSEr1LhM?*=DHwu zRIie?QSm%NV941K&H`3@d4AFY%8@Ne&9?sA@flJiP|&nckZmlS(sI+UfPQ}8q29+#^+sS+7@0(D>$n_<+xgeeK9TeXgg1kxPPEiN2e z3&a($$z|CVW&)R`*0`pM+6v*ee8M3SXmKRIJCZi$pQI$uxBw>(F4cf|1m`+PY$uGl z4}**DEe%LraG)mGB^#bpR4byYDYdTLiqq8;Tl-M>faLLK9=f|81w3(zeJq%u3&~;< zlXKNVFF{ubg3fR?pxbX{1=RHxbcLGg%mI#B&pz|et#{nF^9wJdJ+nFzZ#I7>-UHatfQAd*Mm7hs%7N|Y>Fc0H$*;tlf?*p=lw?ZQE)))q} zq>S!t$Y|n?I*YIzWWB(-1$86`YLNuDq6T;cMN5i!bjb)p}hw@pmY^7A(L@Or$sQ&#VKP zAg|Y3Z<+Cr^u`%L0tiyg-5cAuHEB~g4o|k<7AK*xBiEId+*m8Q2e&xTaX*oYq&)oH zFNVhLJq{Ka`m}>R1;J#4vfwJ zk$gue77Z><-y^#`eUI#_kR@<{U2<#LHz@hS@& zuJ&QJK`iH1TIMW&70xfmisI7|#n8R5 zC`CtRu!g40D(G7c3&&K~@EVF{$%fu>s5-8FXBR~0cs`}7}d$qS0?mClL zXyVCK;U6J;oCB*gP`bZnm zJ@i~b)lR1n=~rR9vpWxzG@z03qDI9VvM#8q!BD4=a>dJpo7QSC-eY527gfW%G@*CX z23cFNZ!jg3ZRn3-6lNWU3EB4)n2Zl|0y$`oL=`qik>bZNt+B>{rUOGy^j|8&ZP-`l z3O14{$RZde1Cb;X=87$a6IRN*WZuweJ1MJ{Fg zoFsK%VlRb%(ir7r3x>E}l5ZVO0uXjs9a3@Y(zzB)I7D4fQm&Kmm(wc z6-gNe0?r?;D87RP^8zeZH`MFMmnwYx{mj(<#%jabsBkJHPu7Gw2ma7yix;wmLuN5o zNivy@s09dw(&fr6t(;7N#AQel1xjE?Q+5$+OtK0Gz{z*`&aV8J>fLLQ+3mC{c|DEP z!iQ?D%-BaOvT|uPAS0G-~drkgyUn zNKPnK*+$~0Y*@uo1JlqSFs7_1{%aUo>f5Bp88xt`RCJkK-@(ldV9f+9ZkR(~=e#tM z-^L5Thvt`sNmx#WMoecuZBB5FfDF5dVN;ylIKH>rRtKIyCE}dmJsh=EcW>!<9iS9V zFXJ?v`MO)CzjVGAv$XIEzd{}8lP2_xhU5xjY?p&!9^1% zqt1^1=S5fx`3a3u{GaeX3^{WJ*Q|5C+$?KucODJ{o-QN|i(~=vie#<=#kv12S32pA zN)t0pV|;5SS5lr9tLk7`=s+H6b%5(OVOOhH2lDne)p}Tp7^CSWEVT8AJ3?D)%)wmD zR%FL)k}W1$W>SuKTX7?Z9JU7&2!WuI?A3FHKBoiBcsbsS79fh$p z`>qx7&??ch&D2_NKg&usIaF7ZL#$JfL#wr9!6i>}et25W$RIQurbG~HmD=1U1u)}h zWX@T<&n5$cX)mTpj(|Cn0A$-F0ObDbu#ktat(9`Qz!PCC%lO6IQ{pn` z%c_!xGV;;8T<}ol8nACI@ z>l3fpMAMyNW*ws_?MW?O)W6-z5)y=dh+<}06g;#7%T`Nf*I2$y>Zs+4(oro}km71N zn!*-NBL!!K9KTKpIetaPnsJQTi$2$ad5J#Pl5nqic?g1FSN+P0gD1FT4OW@tjsDa- zID2uq-}W_Enp$#-!G*Qi$NroiH(+ZKplSIo^1IUfdh$D+pLAh7`)x#D+V2}FTOP7I z31eOuvb)GG4%yvgmy(5#;p$NH+bEfvg49s_7*++lw~7KbNXp0itrx~)tB8GcTUUZX zY*5PkU8EWa41iJSY&S`BxlscJVe1)aJ)dFlg!60Pp05B3vAE)`1LG^UO6NM6RLMYqGQ1?8wiq0Me!? z6le22E`OAi&W$SO=hiAI`{vCg45Ywq-jrIin;A15DqKxG38j@~IVd{n$lOK1^BA=s z5TNy8SCs~B9dHKx3ftjivxp03Fr3OsaX4>0aopF!?!gLH~vd<-+~&4$T>bE;iqoUQ0- z=E^3%(*W+7Db7}id%OzYc%Bi~hLI#MJl(B8{vQ0dofmK*mda**tY<{4l;zTDOq%8D z_Y&P~NqUj-LNc4>g6w4 zQ<{$d&K}gs@3RNOev7j{M<-(BuY;o^JWa>gFdZc&%TXRkR+aN8w-J0;XP%LMcWP1e^I8?$(+zX zm#wNZ4)d8>)VZfS2X=2DDc&aSs5$I(RGX8SDhPxU^HN9}vRu2g2b?Lra54v{i%< zd*L34u7Pom?aC;bn!NI~|KJDXVKLh|-hYtOxdRyAu=iE+$(Re^nFEq9e*Vs%#uswL zmSJBog6aF+joq;w)EMw0CPJu`Q+A*BUT=9B#DWIe28h13~fU5f@@92hAaT!`Bo;?oz0 ztbA(=!9poK?K$DGOe3ul%`034cMF#$jnSD>cB&z`(Gu(yuOWKOnk)7+SIAfUHdp|A zX|W>bmoienLenKtck?J_JRr)q;1-vtB}HKy(^vvPEbJnZ4Zr0YFIl?$9@GZLpja*b z3TDEs7~2~8$Lqry@f}|YV>A@$Sd!hQW8r$>ZXmnqBlzM*16VN85M65ipy+)^Mhled zh`7*Wu9`bv0recc1A#6814&?@q4I)CCIUAl0GON7rb3*cDmFmc`Mh)^F+!UGF$$Xm{^BdrOlS~i zRB}f~v&oYL@S@YiNM>j}3kCf_(IPMxy(I-UN`Yk}J4}^lCe1+FAkZ6+tVRYqGubnv zf<0%ji`KhrI})D#z*F71WCA6hMZtOaXFR<8oM>E_iu75h$P4CO8jWpAEDTxsap$sF zGgs;dxp)y)%1Y~*aZ1n=w*rmOVzbhnHW%H>juiS(JD|rF!EAaKL?aChC9<3kEH{GX z0>xIa+DFg3K~)|$M_dXKp{eIkY9c$4mP;<%At7ZtBugaUD;n4~VBrLavRlZa3@eNN zDW{=`S8JesJX-BWe}@v8W)hc~3p(y*NS~9*fF_@*BT$AZQJn0BzVHB+%w~{>##Y=C z+%^_C0650kUTZjHnyO}QV~<|EiAl@!Vo=^rfdb?Ds0v>rLy&J&s%TlXZwZE^N*^vC z?J(ifk)sBcL`Y;dz%-Jv+CC_jO4>dsmPW}*Q!E{z?So>8B`J|`9&RK_MLw{i&Nl-^ zsVuxLnzulfgchBdGF3@%<7aUK`D!!o(oXy46^%il(R7v;=lTppzqtGTRnZH)hyIvkF}-LjJ$hVsT3E5J6RWUF(2 zE@o4Zv^y?Wlx~j8CBO8tc=Qpw>qNTiVqPPK0;tc9M4b$>H7bS8K@Zl-PIfnTrZu)X zzv(gpe^@^IZ5>PaFaU~vHiiM@*RWObfXd{6;4eH?cjKd703oMRHAb2nhjE|eiVv7G zz}yk+D*~>5kvn2g{+KZ;VA|mU9`fvagf_{uBVzfgRPkNu!!Gjc(!3lU8`FFj<(-;K z09sFeZ(1&c1ILm1H`0ZU*HE^bGR|hzArVP8)mczSczpxjn%)kYsHeHb ztEpYoBHA66DT>2S&euvMmr_vetfOE$-kW1({o1sNKL>4t`EvIM_; zPV;GiH%lboc$=CFW1<0hg_%lrzOJnqHm^^dIc4*rrI5)Xh0HL9?K|)$ERP<{MjMYqClcZu_30l3; z(gQJ`1_2b8xg1z%Qf}6(x5aEy@qBhyjAN0^jWGd+q;T00O2L!CO5w6_6a~+eN0uC0 zU*vb2Hj8h&FJuCW!;9FxoW|6u`20BEBLn z-r37QW=3sGP)%=*DpD=gi3OYF{V%R$3h_ppOLR2^W`` zww=bFsFYLKlay|#FB`+@szQTR11qb?6lE<^{|2usL~pM<1}5z zq+>m)!g{jEbM2Yp+s5-?yQlb9rHJ-<@9%qUR#cu3I}lOQlxZiLGvvzH(gEl*?WNW+ zC^d0uQfZ9j+vzMyZyXt92*hsrVv?lW(6q60<3QIBRO7l`o)~9)4%DOZUGlOdAPRse(NQx#; zYDY|aOS+U@Cc(SYr}c4FB0O7XcsTpQhI)u zh)U27V6|Go=zU+DVr1nI)H`c9M7Nfvserp(YF@-Hv8Ci-dJBQDdn}%N_lMz)nQ;Mg|X6F5BB6TkYQX^gSneF`={-7*R#pZ z`&;VE?Ysf)q%X2Hr{Sv&_U4QbxAERky~j6Xwbh+VcHAQadnvK3 z*h%5}w8CU;tJmSj<%}Meo6fTta?+Z_azgwUdL_T5qVHi;|44h_Oc&C-j_`z#-9}dG z7^N^xsbo^`^DtAuvSN6w)IgPPBx{{-uNMz6(+W^F>&ea>2(a~fQi#7;U7$P|0#7C> zP3^XR<+Ja#va|>6z*7T&`rILgU9ofI*~WMATT^tvqY@v{HiZb}Hp+j_pcW z+HItU;HJ5N@Un%#h^@?_F&B4bKm zGP2f)H_Ru0MI6j+{fb09Ajy@6<3%<#gTF|U;%|)(u_$wjskR9ra?s4qO@f%Ue7R0c zaAW%PLY*{MqrxgbK369uC_+RlswaY`PL`^S4`7!$0uz)m08f<30*e$nfoz$*kf65f zE;Yk|#QD-B0xVs`#E%gUpi+zOvHF_}$DX`nXlY@Px z^a85uHX#z-ACyXIMVN7-+jLFQ0_(ijdb^0#OMC(^!%gOLWh7=!A3P2mz2EG;%G%!k!XLs2^$@dc*-9G)J)3hB*z1tT&Lp1j()G|H8tCz@*7 zRkOT`4qM2ai--lbm#T7ez93z84YMt&QYEPkSU^i~Vy}|X= zM4qt@23B)LF=WeDK^b0G0A^^8Nx^r_yM#cZv-jt-oOnBo`#xu(A89t!DD@YE&{=rx z7d5gJ<-8y%UJqkd6O_^-arD-VLc{|1XkwK$Q2)&vxLLWECS{X|gs>Iu)~#HO8%;{O zn6wv{^k`Ds>Vt{AvtA~0YEAC0DOy;K#(1zI#s7oZu{Zo|`i~SG=|8sFl9S+)hJ&1u zf`j@X1t%y#3`r-yq~Jh#`&4kKF9iqnse{*Equ?Orq~I9NyjsEG&hTCu4j2aI?o+|p zM6*k1g(=xsCk01QO>*KuIxk2@@~%`qz5HDIyi3p5n!8gbmwZ3sxv~UO*`BY;MA${K zevs*qDg(%gnv#H{qGnji8E48sM}C*BRKQKp#qbt*6n)-XB-v`Q07P&#a)T=K93W=$5QOjN2V0%tkhye!YpR-&S&m>+E+P8aa`Z`dl`hZp`_+EMH<`{s{r!AT`k(hcDJ5XRI zc3xKxbK|P}(!+T5AJD^0H-X6#72fY;7#Txelb_X32c%INxKZ_brW=^JEzrh_Y-!a- z2~m#mOzuVsLlpz<<16NkT?$aD4fSC?QMyU{HP+&mv}ALwWP4h&EtHgbBZSRXY-=Wa zQKz{KmJQX~t4l)bi?ce*!}BsdGq~)H)#;n7vU;6qmzQJ(b_o=4t_e-Qu>+l(AaIH| zGczQ;J?M5)bl)Cy01K0%;0SIC4#DOm;T{7r++@Zb4dG0xkR53L(b=mq#l5DFK0}l- zP2H1@I2>tHCH9OGUYT+s%elr`9bX$P!ji)-D=_t&!T8&i9UwwCs0GGU8!7(!#88)6=Fz4&lBjHq-UP;($+ci#2X9Mj3UlMJ2TV{^aQ=| zl^pfh!J-GYWzz6?9sikUN03h7Vi9JFk~N`QZ0S{Wi7#a-2~HGFoq)WMtqp|}W^XAi zEZ!3HD3c|7u>M!sp&T27qV+Wf1Gl7 z1|g}&p#j=_&19S>0(N2>f|ReKyh^&ADZ)6wB*(!#thjo;v$gX}tb{M%R>k^$Mu-x3~`H3N?s5s^``QhE& zM8^|A#nodF24~f)G&MIP0Xx&XJRI#^Tni}X8LfP2uamw|shsU|2~!K_wh;5|--|Z5 zU9=C~7!@g!5QYW|jijVs5=PAZn^96_8fu5Gn9L$ax=gBcMnN)N5@gL~x;uFvXMv$U zodbq3YkW{2sGZz`W*$xeW2Q~yXUMUGa`<{XNp{Xk)LO+{BW_G4e(eZw&k5jmqvqu2 zOj{smI)Hj>?r1yVjFbSs>{O>rN=Q%PdnQuIn@F)!!H5)lhBza;jYR8SHB*g+9GAEI zLM*pjrjg~A$}+MX_aVq>MLk_R5^^jsC2$R~b6AS$cVwo7=ZV?#QQ>)pJ&UjR9Mn37 zr`mZ`mJVe-FgxnXy=Oh*;6ys8i)F$31&Z_*9&(HPRcFP+-um~zp)+076CmMO7q1i2 znl?VM)_8mEVuX=uyv=|9l(=4^g38SSl4-Td6Kj=uO~yC%!dbCk#h9tz_cU0xKNuyS zCtjlO4TYKx3C>r|O0G0Rm~B%ibB!9pZF`OsiPxSp7b{+we^$`Ss>J`)Vqq3iBVb4* zg>Vo!$3b9|g{U~vGmwg?IKAbgV)C%lkxt$Dm6ZlKPJ_HC<}IzXl})f!DpJChRz@jV zUYS@t$wy7~gRAJ0oUzW;PW#TTG>N8}gawq=twyUOFU3%S4HlGUjS~}59t78}D>cEl z#NdkZd*!83D=b-LZ^Xv1tcY$JE9-mwTOpfii zr(<%G7rI9xS9~nW&&33qGPgyg3ez>P0Va*TWubdR!!X!S z%rmZVW4ul{@gPMy9N^XQ(9()Z9g+pQl5+sy!IM(Rp^tWugL%n&39sbbu6UvjX#*OE zuV;%?k(1(!& znF|`GNpwyYdkN7sQQ2`AY9e0C>OO6O7XS)(iw1aTag16OIuVj9f2D0$kOV*g4zEOB z%0q|$>V0uPF2Mzs!Bx{+LL_w49QF-B;e`r&HpE`c;r0x%Wd{MTpq7!&%D2dQC$!Nc) z*r~m;i@?j5Azs6m&ZxLlGxv(VK0x}iz9?Ws#GTJZC1|;URGNxIGb$lzb^*#$UBEA~QE9;S4+A-nCA^w;w)-7iFn zw{DWsohealm&V95QDw*tMXO1Y*tb1$N*^XD+*~UJa8iq?!d6&ST^epY^7itc2i&nNJ0MtDS-zd%rNOK$T-l zZKctr>H&;i-&g>e<(1JX1xd#*mj%cr7$p33k%(L73D9W~27n2zrFO9`8Q|6`yZI67 zfekCX{6G}mW_0#C(>RX->2qo36@U%OV^%k(G(Rl~p`&~$wmsBP<9vF1PN@{0gXobl zBV&*2Ac%fc+7wAZ{(Em`)jlR3tYi@?} zp{{>+YP6Omnhd~3Wdy8NEiip8Oc

RyELiq+5S}4m;i@ouDbThR@}OrqZEeJZPwR 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

6EP0AoBLFvuI0 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 delta 172893 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%0DU4|yg5%VB=?WeznMMZu(%zRX`1aQicM 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�hSz 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 Ng5SOPJv%P&{{Y6;N#Fng diff --git a/contracts/cw-ics20-latest/src/contract.rs b/contracts/cw-ics20-latest/src/contract.rs index b5ebb1a..717df75 100644 --- a/contracts/cw-ics20-latest/src/contract.rs +++ b/contracts/cw-ics20-latest/src/contract.rs @@ -205,7 +205,7 @@ pub fn handle_increase_channel_balance_ibc_receive( remote_amount: Uint128, local_receiver: String, ) -> Result { - is_caller_contract(caller, contract_addr)?; + is_caller_contract(caller, contract_addr.clone())?; // will have to increase balance here because if this tx fails then it will be reverted, and the balance on the remote chain will also be reverted increase_channel_balance( deps.storage, @@ -214,6 +214,27 @@ pub fn handle_increase_channel_balance_ibc_receive( remote_amount.clone(), )?; + let mut cosmos_msgs: Vec = vec![]; + let pair_mapping = ics20_denoms() + .load(deps.storage, &ibc_denom) + .map_err(|_| ContractError::NotOnMappingList {})?; + + let mint_amount = convert_remote_to_local( + remote_amount, + pair_mapping.remote_decimals, + pair_mapping.asset_info_decimals, + )?; + let mint_msg = build_mint_cw20_mapping_msg( + pair_mapping.is_mint_burn, + pair_mapping.asset_info, + mint_amount, + contract_addr.to_string(), + )?; + + if let Some(mint_msg) = mint_msg { + cosmos_msgs.push(mint_msg); + } + // we need to save the data to update the balances in reply let reply_args = ReplyArgs { channel: dst_channel_id.clone(), @@ -222,13 +243,15 @@ pub fn handle_increase_channel_balance_ibc_receive( local_receiver: local_receiver.clone(), }; REPLY_ARGS.save(deps.storage, &reply_args)?; - Ok(Response::default().add_attributes(vec![ - ("action", "increase_channel_balance_ibc_receive"), - ("channel_id", dst_channel_id.as_str()), - ("ibc_denom", ibc_denom.as_str()), - ("amount", remote_amount.to_string().as_str()), - ("local_receiver", local_receiver.as_str()), - ])) + Ok(Response::default() + .add_attributes(vec![ + ("action", "increase_channel_balance_ibc_receive"), + ("channel_id", dst_channel_id.as_str()), + ("ibc_denom", ibc_denom.as_str()), + ("amount", remote_amount.to_string().as_str()), + ("local_receiver", local_receiver.as_str()), + ]) + .add_messages(cosmos_msgs)) } pub fn handle_reduce_channel_balance_ibc_receive( diff --git a/contracts/cw-ics20-latest/src/ibc.rs b/contracts/cw-ics20-latest/src/ibc.rs index 2426738..b72efd0 100644 --- a/contracts/cw-ics20-latest/src/ibc.rs +++ b/contracts/cw-ics20-latest/src/ibc.rs @@ -464,17 +464,6 @@ fn handle_ibc_packet_receive_native_remote_chain( funds: vec![], })); - let mint_msg = build_mint_cw20_mapping_msg( - pair_mapping.is_mint_burn, - pair_mapping.asset_info, - to_send.amount(), - env.contract.address.to_string(), - )?; - - if let Some(mint_msg) = mint_msg { - cosmos_msgs.push(mint_msg); - } - let mut fee_data = process_deduct_fee( storage, querier, diff --git a/contracts/cw-ics20-latest/src/testing/ibc_tests.rs b/contracts/cw-ics20-latest/src/testing/ibc_tests.rs index c9e74f7..4065ca7 100644 --- a/contracts/cw-ics20-latest/src/testing/ibc_tests.rs +++ b/contracts/cw-ics20-latest/src/testing/ibc_tests.rs @@ -2413,6 +2413,33 @@ fn test_increase_channel_balance_ibc_receive() { let local_receiver = "receiver"; let mut deps = setup(&[local_channel_id], &[]); + let local_asset_info = AssetInfo::NativeToken { + denom: "orai".to_string(), + }; + let ibc_denom_keys = format!( + "wasm.{}/{}/{}", + mock_env().contract.address.to_string(), + local_channel_id, + ibc_denom + ); + + // register mapping + let update = UpdatePairMsg { + local_channel_id: local_channel_id.to_string(), + denom: ibc_denom.to_string(), + local_asset_info: local_asset_info.clone(), + remote_decimals: 6, + local_asset_info_decimals: 6, + is_mint_burn: None, + }; + execute( + deps.as_mut(), + mock_env(), + mock_info("gov", &vec![]), + ExecuteMsg::UpdateMappingPair(update), + ) + .unwrap(); + assert_eq!( execute( deps.as_mut(), @@ -2420,7 +2447,7 @@ fn test_increase_channel_balance_ibc_receive() { mock_info("attacker", &vec![]), ExecuteMsg::IncreaseChannelBalanceIbcReceive { dest_channel_id: local_channel_id.to_string(), - ibc_denom: ibc_denom.to_string(), + ibc_denom: ibc_denom_keys.to_string(), amount: amount.clone(), local_receiver: local_receiver.to_string(), }, @@ -2435,21 +2462,21 @@ fn test_increase_channel_balance_ibc_receive() { mock_info(mock_env().contract.address.as_str(), &vec![]), ExecuteMsg::IncreaseChannelBalanceIbcReceive { dest_channel_id: local_channel_id.to_string(), - ibc_denom: ibc_denom.to_string(), + ibc_denom: ibc_denom_keys.to_string(), amount: amount.clone(), local_receiver: local_receiver.to_string(), }, ) .unwrap(); let channel_state = CHANNEL_REVERSE_STATE - .load(deps.as_ref().storage, (local_channel_id, ibc_denom)) + .load(deps.as_ref().storage, (local_channel_id, &ibc_denom_keys)) .unwrap(); assert_eq!(channel_state.outstanding, amount.clone()); assert_eq!(channel_state.total_sent, amount.clone()); let reply_args = REPLY_ARGS.load(deps.as_ref().storage).unwrap(); assert_eq!(reply_args.amount, amount.clone()); assert_eq!(reply_args.channel, local_channel_id); - assert_eq!(reply_args.denom, ibc_denom.to_string()); + assert_eq!(reply_args.denom, ibc_denom_keys.to_string()); assert_eq!(reply_args.local_receiver, local_receiver.to_string()); } @@ -2846,141 +2873,72 @@ fn test_build_burn_cw20_mapping_msg() { } #[test] -fn send_from_remote_to_local_receive_with_mint_mechanism() { - let mut contract_instance = MockContract::new( - WASM_BYTES, - Addr::unchecked(CONTRACT), - MockInstanceOptions { - balances: &[(SENDER, &coins(100_000_000_000, "orai"))], - gas_limit: 40_000_000_000_000_000, - ..MockInstanceOptions::default() - }, - ); - let cw20_addr = "orai1lus0f0rhx8s03gdllx2n6vhkmf0536dv57wfge"; - let relayer = Addr::unchecked("orai12zyu8w93h0q2lcnt50g3fn0w3yqnhy4fvawaqz"); - let send_channel = "channel-9"; - let custom_addr = "orai12zyu8w93h0q2lcnt50g3fn0w3yqnhy4fvawaqz"; - let denom = "uatom0x"; - let asset_info = AssetInfo::Token { - contract_addr: Addr::unchecked(cw20_addr), - }; - let contract_port = format!("wasm.{}", CONTRACT); - let gas_limit = 1234567; - let send_amount = Uint128::from(876543210u128 * 1_000_000_000_000); - let channels = &["channel-1", "channel-7", send_channel]; - - let allow = &[(cw20_addr, gas_limit)]; - - let allowlist = allow - .iter() - .map(|(contract, gas)| AllowMsg { - contract: contract.to_string(), - gas_limit: Some(*gas), - }) - .collect(); +fn test_increase_channel_balance_ibc_receive_with_mint_burn() { + let local_channel_id = "channel-0"; + let amount = Uint128::from(1_000_000_000_000_000_000u128); + let ibc_denom = "foobar"; + let local_receiver = "receiver"; + let mut deps = setup(&[local_channel_id], &[]); + let cw20_addr = "cw20"; - // instantiate an empty contract - let instantiate_msg = InitMsg { - default_gas_limit: None, - default_timeout: DEFAULT_TIMEOUT, - gov_contract: SENDER.to_string(), - allowlist, - swap_router_contract: "router".to_string(), - converter_contract: "converter".to_string(), + let local_asset_info = AssetInfo::Token { + contract_addr: Addr::unchecked(cw20_addr), }; - contract_instance - .instantiate(instantiate_msg, SENDER, &[]) - .unwrap(); - - for channel_id in channels { - let channel = mock_channel(channel_id); - let open_msg = IbcChannelOpenMsg::new_init(channel.clone()); - contract_instance.ibc_channel_open(open_msg).unwrap(); - let connect_msg = IbcChannelConnectMsg::new_ack(channel, ICS20_VERSION); - contract_instance.ibc_channel_connect(connect_msg).unwrap(); - } - - contract_instance - .with_storage(|storage| { - TOKEN_FEE - .save( - storage, - denom, - &Ratio { - nominator: 1, - denominator: 10, - }, - ) - .unwrap(); - Ok(()) - }) - .unwrap(); + let ibc_denom_keys = format!( + "wasm.{}/{}/{}", + mock_env().contract.address.to_string(), + local_channel_id, + ibc_denom + ); - let pair = UpdatePairMsg { - local_channel_id: send_channel.to_string(), - denom: denom.to_string(), - local_asset_info: asset_info.clone(), - remote_decimals: 18u8, - local_asset_info_decimals: 6u8, + // register mapping + let update = UpdatePairMsg { + local_channel_id: local_channel_id.to_string(), + denom: ibc_denom.to_string(), + local_asset_info: local_asset_info.clone(), + remote_decimals: 18, + local_asset_info_decimals: 6, is_mint_burn: Some(true), }; + execute( + deps.as_mut(), + mock_env(), + mock_info("gov", &vec![]), + ExecuteMsg::UpdateMappingPair(update), + ) + .unwrap(); - contract_instance - .execute(ExecuteMsg::UpdateMappingPair(pair), SENDER, &[]) - .unwrap(); - - let data = Ics20Packet { - // this is returning a foreign native token, thus denom is , eg: uatom - denom: denom.to_string(), - amount: send_amount, - sender: SENDER.to_string(), - receiver: custom_addr.to_string(), - memo: None, - }; - let recv_packet = IbcPacket::new( - to_binary(&data).unwrap(), - IbcEndpoint { - port_id: REMOTE_PORT.to_string(), - channel_id: "channel-1234".to_string(), - }, - IbcEndpoint { - port_id: contract_port.clone(), - channel_id: send_channel.to_string(), - }, - 3, - Timestamp::from_seconds(1665321069).into(), + assert_eq!( + execute( + deps.as_mut(), + mock_env(), + mock_info("attacker", &vec![]), + ExecuteMsg::IncreaseChannelBalanceIbcReceive { + dest_channel_id: local_channel_id.to_string(), + ibc_denom: ibc_denom_keys.to_string(), + amount: amount.clone(), + local_receiver: local_receiver.to_string(), + }, + ) + .unwrap_err(), + ContractError::Std(StdError::generic_err("Caller is not the contract itself!")) ); - // we can receive this denom, channel balance should increase - let ibc_msg = IbcPacketReceiveMsg::new(recv_packet.clone(), relayer); - - let (res, _gas_used) = contract_instance.ibc_packet_receive(ibc_msg).unwrap(); - - assert_eq!(res.messages.len(), 4); // 4 messages because we also have deduct fee msg, increase channel balance msg and mint + let res = execute( + deps.as_mut(), + mock_env(), + mock_info(mock_env().contract.address.as_str(), &vec![]), + ExecuteMsg::IncreaseChannelBalanceIbcReceive { + dest_channel_id: local_channel_id.to_string(), + ibc_denom: ibc_denom_keys.to_string(), + amount: amount.clone(), + local_receiver: local_receiver.to_string(), + }, + ) + .unwrap(); match res.messages[0].msg.clone() { - CosmosMsg::Wasm(WasmMsg::Execute { - contract_addr, - msg, - funds: _, - }) => { - assert_eq!(contract_addr, CONTRACT); // self-call msg - assert_eq!( - msg, - to_binary(&ExecuteMsg::IncreaseChannelBalanceIbcReceive { - dest_channel_id: send_channel.to_string(), - ibc_denom: get_key_ics20_ibc_denom(contract_port.as_str(), send_channel, denom), - amount: send_amount, - local_receiver: custom_addr.to_string(), - }) - .unwrap() - ); - } - _ => panic!("Unexpected return message: {:?}", res.messages[0]), - } - - match res.messages[1].msg.clone() { CosmosMsg::Wasm(WasmMsg::Execute { contract_addr, msg, @@ -2990,8 +2948,8 @@ fn send_from_remote_to_local_receive_with_mint_mechanism() { assert_eq!( msg, to_binary(&Cw20ExecuteMsg::Mint { - recipient: CONTRACT.to_string(), - amount: convert_remote_to_local(send_amount, 18, 6).unwrap() + recipient: mock_env().contract.address.to_string(), + amount: convert_remote_to_local(amount, 18, 6).unwrap() }) .unwrap() ) @@ -2999,7 +2957,98 @@ fn send_from_remote_to_local_receive_with_mint_mechanism() { _ => panic!("Unexpected return message: {:?}", res.messages[0]), } - match res.messages[2].msg.clone() { + let channel_state = CHANNEL_REVERSE_STATE + .load(deps.as_ref().storage, (local_channel_id, &ibc_denom_keys)) + .unwrap(); + assert_eq!(channel_state.outstanding, amount.clone()); + assert_eq!(channel_state.total_sent, amount.clone()); + let reply_args = REPLY_ARGS.load(deps.as_ref().storage).unwrap(); + assert_eq!(reply_args.amount, amount.clone()); + assert_eq!(reply_args.channel, local_channel_id); + assert_eq!(reply_args.denom, ibc_denom_keys.to_string()); + assert_eq!(reply_args.local_receiver, local_receiver.to_string()); +} + +#[test] +fn test_reduce_channel_balance_ibc_receive_with_mint_burn() { + let local_channel_id = "channel-0"; + let amount = Uint128::from(1_000_000_000_000_000_000u128); + let ibc_denom = "foobar"; + let local_receiver = "receiver"; + let mut deps = setup(&[local_channel_id], &[]); + let cw20_addr = "cw20"; + + let local_asset_info = AssetInfo::Token { + contract_addr: Addr::unchecked(cw20_addr), + }; + + let ibc_denom_keys = format!( + "wasm.{}/{}/{}", + mock_env().contract.address.to_string(), + local_channel_id, + ibc_denom + ); + + // register mapping + let update = UpdatePairMsg { + local_channel_id: local_channel_id.to_string(), + denom: ibc_denom.to_string(), + local_asset_info: local_asset_info.clone(), + remote_decimals: 18, + local_asset_info_decimals: 6, + is_mint_burn: Some(true), + }; + execute( + deps.as_mut(), + mock_env(), + mock_info("gov", &vec![]), + ExecuteMsg::UpdateMappingPair(update), + ) + .unwrap(); + + execute( + deps.as_mut(), + mock_env(), + mock_info(mock_env().contract.address.as_str(), &vec![]), + ExecuteMsg::IncreaseChannelBalanceIbcReceive { + dest_channel_id: local_channel_id.to_string(), + ibc_denom: ibc_denom_keys.to_string(), + amount: amount.clone(), + local_receiver: local_receiver.to_string(), + }, + ) + .unwrap(); + + assert_eq!( + execute( + deps.as_mut(), + mock_env(), + mock_info("attacker", &vec![]), + ExecuteMsg::ReduceChannelBalanceIbcReceive { + src_channel_id: local_channel_id.to_string(), + ibc_denom: ibc_denom_keys.to_string(), + amount: amount.clone(), + local_receiver: local_receiver.to_string(), + }, + ) + .unwrap_err(), + ContractError::Std(StdError::generic_err("Caller is not the contract itself!")) + ); + + let res = execute( + deps.as_mut(), + mock_env(), + mock_info(mock_env().contract.address.as_str(), &vec![]), + ExecuteMsg::ReduceChannelBalanceIbcReceive { + src_channel_id: local_channel_id.to_string(), + ibc_denom: ibc_denom_keys.to_string(), + amount: amount.clone(), + local_receiver: local_receiver.to_string(), + }, + ) + .unwrap(); + + match res.messages[0].msg.clone() { CosmosMsg::Wasm(WasmMsg::Execute { contract_addr, msg, @@ -3008,16 +3057,23 @@ fn send_from_remote_to_local_receive_with_mint_mechanism() { assert_eq!(contract_addr, cw20_addr); assert_eq!( msg, - to_binary(&Cw20ExecuteMsg::Transfer { - recipient: SENDER.to_string(), - amount: Uint128::from(87654321u64) // send amount / token fee + to_binary(&Cw20ExecuteMsg::Burn { + amount: convert_remote_to_local(amount, 18, 6).unwrap() }) .unwrap() - ); + ) } _ => panic!("Unexpected return message: {:?}", res.messages[0]), } - let ack: Ics20Ack = from_binary(&res.acknowledgement).unwrap(); - assert!(matches!(ack, Ics20Ack::Result(_))); + let channel_state = CHANNEL_REVERSE_STATE + .load(deps.as_ref().storage, (local_channel_id, &ibc_denom_keys)) + .unwrap(); + assert_eq!(channel_state.outstanding, Uint128::zero()); + assert_eq!(channel_state.total_sent, Uint128::from(amount)); + let reply_args = REPLY_ARGS.load(deps.as_ref().storage).unwrap(); + assert_eq!(reply_args.amount, amount.clone()); + assert_eq!(reply_args.channel, local_channel_id); + assert_eq!(reply_args.denom, ibc_denom_keys); + assert_eq!(reply_args.local_receiver, local_receiver.to_string()); }

;`5CMRF-K{wH*RX(j$boJVrJ-$$^PmjI~&c5Wi8kS z=VF>MEctaZYT4jTY11VFL{w-Bffb5Cy(G~-E`uBX z6;LC7Yis3pEV0hGR7t3&NIq3pD06CSR_k0Ruc;H1T!<$c$pV~-NEQlr@-KCtvTSgl zs>681+^6C;s)j`4J;fLELp8HQH65ykoyE?nLjtbD41E;M1@vX~=QueMon$^-Cl*h- z6+A%6vd}Ef{TI?YV(np!swFaclmxogDZ-(`! z9KlQeX=)ch$Fovik(bkO$l*6RF63kj*TLrB^7XDv4BN>>YEuLU;Bt_QDjkI^#6y+j z)C!9pbAMexxonT+0fwBUgOS-~4=_S9;OwNmVZlS*g7+&!1}OIF{z_DK@hv*pAXDl8 z+AFxf_A0x-LW(4h^%8RLASML3`yi5=>7`71dP&k6M*@x?ML8I}jU;t{?WJuxn4j6S zO_W0c`jaH?uf&;)2?bbB@@u9|8`>IhB&j^stL*-2IbNF0g!c-5T~HVDMqNx4gu2)> z)TJs`kf16Vs+4_TEuar8Iy$#dvJd#5>;lO?R)}LPrfVuwWQCApfhhrP0Hq{F(MV2P#Ew8M zIc%w_S1$GR;#|>)UTd2Y*Sf!0wFRvO3&Yl0BC6)ySvNq2H!Ec)VnNuL z;+Y~+wrF!HjV{5^i_+N;V`*S8#+9<0y0Mce)k|V34qVhaScG<%2-sk88ab^sW&Pnq z2TR#{tP*Kf(JR6U4%3fKg)?E$J98^@((HipaylG^MscY6jAVGJuizPxFutEP9T+be zJFmAdLBq&r61Nwl)wddE(mp>;w~b&5i?z`03+*jl(UgU*@45yk7-CIyE-H-HM>Yop z!en$NBby1OWo7qiMsI6$!7Z<@&W2-EED)Q@67Fm%Gt(YTm&Fu)0&2BibTlIwJ$&1M zIYA@zj;B@GR<0K$vnDIMr~ZAa!QTi3X2e?-JyvK>hwHZZ`6z90{vT$e>|@Hp)`7VA za_o&FP@M-%iXjKr%Au;bSskH*tvEuJu_H&Q>Kf;#L^4trYs0Ros2C@M;y|e!2Sbxt zAzC`0vN-xsX&}qafq>&jlE7i+Y~AS%oRbAS7;B+ ze;Ey98Y+k)Dxda%?fc&?WAn7}0Edxo9Rd|rY#n5~+2K3w9ov)ta__7p-f4HAmgls4 z=$3Ka@Yy|fPqpnHtS4;uSl@eW9?%pTGaw=$0glzBA_%)jz0@Rx7+EBj+DpUswTGsc z_t5Nrv4;>IWrI+;g{Zdk^3Y0BeR(G-m;hi!d;hzgBv>SLRwn3L*a0Z)N*PJ!mw>EI zjTl)R3r3{JF^V|Ah7+vww%yByF|l<2wqHoz%6{o?60}bjXz%i%9=J5<1ukKquw5=J z!J=Y}TxwRb5XWPZa|7L2P#UABGfE>w`KNK}##0BH37!;PgQsz&P6C-olI^Rc22yB% z#zKP=@lO^2cmESOuFQrD1;}DbVOukLeupj+AblRys#28KW_p9VZ={~LWlLj~ zKAD)}V5>Hm12(&PV7$^zS*DiszGQb{!^3_Yo$ty*#n>|I39No=2`U3VVVUPBL`Vqm zAb~1~)5q}w=9;&bM)TT0y>=`kZzv6vI5nEbAaoFRZZyVgv*ePQ3Eoy=*R~W#fNu$% zZlV9^%tDT{!Va@oG188*7AL5mmzGNE-i7L&7D3ltv=qk(t&L#)MTz-&wLDJ3sO;nQ z+3+=^D`9+V^GJxjS;gaSon=lZLCMaomt0n41p{rbjF?5$_N>ZL0?sNnhvy;oJO|lG zvLjQ}0L*gx^ao%$rQr~}Y5lZ*EM`*2YuNex!&eXJU4vl?lTvcda;99k8K^Hii?e=2;qdOSs}QRFw>seX60t zxK<7|Q&CG8=}3(fzY~pgNMJONCqBu%`GbJw<4h8}@Z+p#xN?&08~~|afFzTyI=0^c z?(&sNKsAJ3nWf8%q8-rr9ZDhl&nrcXwO#4RL(DL^I5siA2W>s6@=hoMDlJzWpIGig zm^bNJrZ!4JbL*7K_)jUfwxDFgys$X>P9)(j<&Q0nA}<$hS3L1>m?Whv>)~Q0E>qZXTBg8=^wW%(O3jdDPvmUIXtFjtA+Q@I8EV&d zqLV|+#s;k-USWb}b>HS&Z<}6N(*a!xyA@%J=@7X#V{gTkw?G0Y;HHKE#+`ayGXfJT zkE2#wX`|I^V9iq&R_r2_5hhl=5xOR$MYDxUIpBxq z@5ZA^7u9NK%Kys-L_C0qNO};(om1n}*oTMFhhjL#MCC%L z_wR{UH8GQ!ngL`@dLNa^D0XChcpd#kRrl+?;_C>NXm3d7|KzH!&dg|e`6KOw_W_~m z?)Uq}f4HeDGd@IN?-#$oL#Uql2Y!qLM8&X1>rs$WG){UsK({gvh`;R1of}~H@}*zL zYnUgk5d0z&rf3Up#wSq1Y=<*MnT>(IDYN@X4Kfab!1f$P!uBOj(u}Kkb2D!arih(R z*q<5KNQ1*FDE1Rbfbd1-`rt>konc2oO#s?t6eyO(m#q`+isCKl7dSRvvL#vxQ)b&3 zT&6q4*zy^JBwOKvQJ>Yg?k8N8^hz7(wJdFgE%dxrDV;LClIoIT$xufh>B6wg)2wx3 z!>MT$uW!@HGk~P2VP*hG`Svsq&wvDM*a@+ zHeXo#leJ~j?xbazm-3h0P`FB?qj;gw7t`}waB!o6V>^w$ASWC|k4VDJC|VJE7mB8Z zS43R2<&{OLIHrW*X0C~NNV`@%V$<^C|HJKzbefSLu zUCU^pJ7UOfDN>whkv2B!YpL9FzV;eC80aJ9rRkgE_sKx3*PKlRP65+18MNbo2BA`fDqtaY}g^fY&-0 zM!^nSS@vlV@dGx|N>Iu|1qokg=HN4l(`+`F?Z*8DiZ*g31p~D=-r(oH?3Hj;$keL-Rr$xxD}3 zNArzuqFI7X)By6=Yle`)Ux;Ky_rRDGB{2jkR~y7xgRe% ziFRnhZPOb6Vi!8HP&K-wZ*?c;FkQ)weX^3V+x+-JW-{xNa@lUKP4Y{~uTJv2MQof9 zU8swn!0KFLh~!6}%l?#AP07`kswlbIQuQn>)?hi0YM%PUlq@5ScNwG?u#Ybd#b^$keh;$*?#<@upA8JB(v<6<1~(7j7$-}Z6;9eCsBn=@- zfAV|MvnR*qhILk7p<`obCe?+%<%^?pIwoQ_f1hZ1F;NV`O_pWg(wfe1-A~D>g=zlD z-{%i#yi;1WCSF~Q$KHXy{~z){tmit#oY*94+3J7yhx{R>%_@OW%M>0bH$F2H8;+bJ zHc{1dSjesZ@IU5ns@6{w)qebqA zFTA&ClL?me54@N^dBOt^(5v2DD$Y&Y!-LKxr=^R3tsnY?AFPBb7y9Whh;B+^+kV*ali$ODP*~dU((xsDdvtDqIPIFD*mU6^)|>2>Zow%D!w{- z+pl{qKg9p#rTp}oq>JtT@IU3})g+C#`|W?q_xEf6ly9#|8n&X2nxwsUUwk>=QIj;& z?iakAKcFV5z1`pVa{j>V6aMj+^ZQQ{yORg#dK+-{As6_gDsll=V*~J^QWjN5LyJ@e zzHMjzY$q*%fAHmei@#-OzGck6uZ7PC+ULL9ng7mEi>Z)H?q}U7qvVZ%BI3BRYwvmR zmHeNxr!3ZO-ZjMC;T{A|Q|VCROhm56x+_zXpz-ESot=0QB1%Q$FS5O2tHZ<0QtPI8hsx3adJAX)alArsx ze49UGcm9BEWzh)#;_m#Y9!2wdJdN(GLhDD&s zt^Uui<>zEK`y*b@56o`!Z+|^MwNdDz*g7LKqjpB7@O!`d_56|jH|O!3ZNngk!R2($ zpl|>Bdj519GitHgS;Sfis<9Aybigd80>LYLaVRwfNwNPd<^sKPC=+;G_eQ=y5cIV- z@`pBV(E(jCObFQUr8n}&_vv1dZFx2Ous`na`LX?rMcGvbwH+J_p>e3|n!o2y>A%+p zTzIQB9613}n5-Yk85K*I(Gs$DIoWh1%^&IK{3CyK@04`qVwx|E_Fwr&e(acpFxiaS zWP+p$MwlpCVyrBgH-u0B@{jxxoe71p>H~#YxhI9m#h-P1QW$?tJ~z0tMkHn@=ezl~ zj7UsAOg~g5&yBo+zU1TWbev67AUXy~Q(;;IV_osycoNu~$-KmId+PaUKt zk13N@^9y&nj_l?yynu}Ih_BAN;lS3|th=Xns{zmW%#v!~KHLo$dS!L|dWI81E;zTC zuDuF@zF>pjtMIrVmUB%Io{pTmED)X@@}&b>9?ZGZ`C(ArjR-$1!{)yliuCdXH{X9T z@2ZPSHW^jep@{EVjh(!KU3$Di<=Mg&{*}H?7prN9yST3axi+r&2nB5TND@-{qq`^4 zqb(lXG?2~J;oJne@m}Yqg>Gz4`u7dzj^Kxvoonscza_`GCjV@^Yw^cNuKGO{?HS0Z zll2wt(K(y-eRZ%rs>%)qT8z?XCx)ER$V`zPN|$_-1uZ1?L1xH~Bdy_x6+MP9I zt1%NB&|6(3C?21=w<`X7MzhMA`V+>w1N{Ca*Ualjl-yW%Q?`DfZ#c+3!FGM_Aa}N3 z-pkc7W2<_(_Wcb8)&>}`YVW85<$*>iqSI@uS|hslN-uX_nB0|=tK>bk?p@UJqgpq< zd)6bMB46j;{;n5)$imkadH@8D1@Uf`0}wr?&dzNm>8Z3nuGK)Q$auxpm zI>6&H|5TluL`Q1s-P=P)mLxqqzuq0g58tk@gbVfXH}&q&&Wh^G(17ltTzv`+*?sh< z3=P#iKVaGtXn-|J&#sxooyp2`Q%DkTHrEnwt6r3j(YUExtbG*~F7w}RaF_L1^z$0s zS&Zb7MmHFg&-%_`X%Fb_j*3{?0d@YFIyc;}?(M30>DJ!v-8ISJ+I|0myEa+%dRouL z+lfwrlZP+#aqVHch$vwDe{LV!|L^XT?*C2vp#A@1AKU-4`|fN1kIZYeqWC9Qv#|M| z3oZ=se6rv@F@Sx9OM3T5Uw zQ;GzZ(G-Nhkia!jNjy9eKMZq4t#wTB&}R3+05iLBBUQT3qMQlIX6;vH+dGKDAov_TNP@A-EQa^v>Ev2-Eco^3O}Snm_O2W48BrfOKBufxeGvfd{vYbcs4&srJA{or(LXiBjqM&swV(z=+qf&~P|Hv^ zcpsB+%ut)6#Y5d_=HmLHZVc1+&`_JcpAU6I_wh;XFxs2sM-Fp`GW4^Dxh*|_>4Ktr zZ$e|%YE=V``MUcTG$wn~J?EF)ylhHg1`Rjh8aX@#u9XZT1+G=jfNMELY><`Cfa~(% zDR2=j$$;zc!^^<6WDnrF^8Wz1_LyNVvXqX%T0C<9{~X$OhB~ev@o#{wy?RH|+VT-8 z$Zbzbem}xMZuH3iUqKFVSuo1L<`Al(gAU}4~;hp z_lxl90~Y!Btfu(q#seTE$u~wwI{o?s+~^(% z0BUlAfA4|ih1roSFU;?AJs0KxzwtohG@m)pjfE?zJ;*&3mSr)G%{$n&w;SHxhH5h1 z|4-*k4Yrvg_Ww4{whCMG950|_8lTym^Gi-}L;a%%yZyuRZL)*tt^V%^yThn+>LG4; z_+b?^MVhgH%yUz-SNMxgbOUOykXc2DDXyve}aLY9vfmYUtR<=bOsuvY*^7A^}Y~DlgNV(*SG29WxzXP?KqDVYtJfyKDnFpYuYF6&;EPgbr9BeLyMZG)+? z!DQ>J{0SXyicZoX>!B9EeQL@CA_vy{xAsg4!`9vSL(Y)+a_1Ig3Df{;DOfrn#0}ji8~y&ukc2Z znf50_LYWPV;Hb-A>d46#V%Jm(%yC_zrz9m7MFhAGN$T^5v%*{aj}Lc4A#Hy++#OCw zM<3zd7Dli+8NsKHupRiLBPw^GMzH$`ckCGJ8+>vIXasGR07Epb&`d2-N!mBRcsd3< z`q^nP!L3{$_%Ba)$JUfzdu2MLc9$pc^2lz&V`5-b(fN6?>u8x+%r^9aQK+f!hn&Ea zl?Uxt#~|BDenadIWK=K4ZVcMtIw#CyEn{a@^|@LXSxql4+h|gJaK@3|18&B;KgbbKWs#?G4)yF9N9Kqv)q8N zsm~r@D}_zHfuXch<1_2BLBVi$cApA{wFzu>9%blvLPaf5@wwTiGde zPCf>6t1@G$HW3!)byxq?F>b_=vM8~17AAMO&A^!w3P(z|BQg2DFL^g8qO)^xw&DY(gTj`=ea2W(NE{O zQuyI5pyS@zDVZmQ$MkNmLQlMW#C(8rt3Pf&^klO)ynF+B&4R1M%g@etNB2sVTkU>z zha2E$p5Xd~V-(clqV)?-0A#oN51ruVhH{+$gpeOQ!FpYD;#=?a)jjCPfypw|l$W7b z#WGm0H=h)Go$rBw(PehHL;Z;-1CfvTD^GSm%l_1#{5I3-T=_OPy79}O0)~d7*Fz;H0!`($s0pjIHE?U5aO`G@9Jb@=6f&Q|-IPKAMT`96i-jST>ZUw0}|c%I4oj(4~T zKKl+gq~_YI>0G|>3qRr==zV_cKlKiGQQgx>GMMb5H1FrDPIE^BV#l85N>iTu0x$o- zv`E+kjn+%6WhmFstG=%tWvt4fV?y1DFNx3`29H=Ta8Po)|LSS(tWs*rrVnRgDMvEB zR2>(Ci5W)~e&p#cnAqeL>wL97etNaP_;fciKP)%h-*mb=VxSbm*o#QrOwu2W#xoQ3 z3U3Wan~1w)0u!!`%=+J{87LQInur#PCW$LT_v6ph-4Prm-qi#|o;j}Og$lB?C{UHCv z74CrE&oV1IB9Xk`L^BQN{x5u)VDpn zfabjVM)x^>y75K?$}`&r)6B#| zA~BSUZ@V_J!z=P|GY@9NM@8|C>4Q8LK9@e!@bIZ?{jWcPjCzqDe6>4sg6C6N?9ED7F?$g|&XpGB+Z- z_MQ(cbGK*f7)nkiO>G75M}5k@bF!+cp_*<7?{EsjSW>kf(7VCbBebiPYxB?j4?##C z{FFO3`+~3iv^#P@c~P^4bWt0!{+v&{v9q=$%LBI>)}6o6qWErYG@(dVr|?AjP6`|0 z9bK9i*RpO;_@8~+9ny-sH);Z846QfYWqf8$RQS08Q5Tz&>yG`HYur14&IQ-8%z1y3 z2MOi;$CPCK-QKm3T)EnfV!m!$4G7$NJuQq2wE_Z@zU0RH?O%2?&eF`#$`TEoR7WMD zpS@7iGx0OlBigJlXlHivlk_5TuS-XL%XuIiu2l`t->JG@C!xsLi-kv6&f=|GetUH`4i+@ZO@{mlRAGS^(C%ZUK?#>-vX5ZaVQAQW(gPK(t{hi#ySy#LYVZqo2F zcz5NHx@fJ6Z>p#e>p|?0u&{Z-5Bo2e&^CYgf4Q3u)vqA{RTXUI<`962_c_?buWK*l zq6@tf!_7W`sxtaZTKn3#em=uV3P3)fw^*1hII=<`gUE)?{zwJ-C5*gy#{@yFy3hNoTS(kp3jN+3s zKW6;$Wgl}-)v94`WyF6oY^*as?p}Vg9ktYrecPMtsPF3#3fWSDj`eq2w(#V?+*iEw zw7u{=Z~9*^eQP^x%2n*Jq3I60^?KW3Pbt~w4%@PvUhTiv4x8)``--bJ1VlI1373)H zQQl^IZ=p@eJBnlDFZ&AWKXBexIQe>jipc+qk@WDqo546sKgWEGVLpWSx-rhdy<+szh1J>m zKE8H?J19HAfB3_0|LijV#Sas9np;USg`$SAJ1?ao7%3kZh9z9W7w1aV^}YP`53&en z`U^hjiYIHt>8QJi63@8HrsL&n_oP9{#Gm?1LZk-pa8>$%+jsnTj=PO~fnDNV*Z5z4 z&>b4Ae?(HVg-d+#L-2J!^~Zh4Ej~2yUJWBV(9q{bvojEavB&3Suo66YY%x-b{XZXa zvug-SrZwyD2YtrxlWOy# zc6P0xAAf^8yoNX{YNNOR+$C;Yr5uEliHr2EP^RgxMvzQBEvM<$FSQ-EFvt3;0!~+!tHe;r*TIu@w zSvR=h13=;itnh5J8X80Y8vVO3bk}6x=KtqHn9aBOLoQ0%0cY=xy3IH`umu>V;UXg< zy2gL{BG=w9T-{Co`TH(%V=XSBtYE0C2JddIjeqEUuA`e(TvEv@9{T}zZg#l;#s}E- z_xN5HyEAxt&&6(1eX^( zQ7Pjex`1?Z6X2wvao zAeegp`uXns30e-J$Y57hi~S5iSv3`GAF=N7&Mz^5QoN0%@HM|;v5R{MAScs%pm=`C z#fbnS{^GBT-L%2B(uizC^NoidKM0nr&!7a(y8Q9)bM5(7IGH8yd#li8{Dib+zVZD) zSF6AH{qDa>##{g$-Q~}?0Lr<`KX?I(%U%AL7r3@QhVs_)iAE!0?h6;XmT9459E|?2 z0jH`5;6z5ws-rqinK?eZ^E!8awvRvjT6bFS2X3!`p6}f*=s9V0peX4&8GH&Z17=2y z$%Mr$R{P^W;%4RnWqjuDpyT)kEC{frKu6sEa8O?~vxSL1E0l zuo8iL)p}Rc?+zSTmI8TtOP(s1vy0DJ@sbj>9J02Wyw zm10G-GOQ91UIi!h{?PZji37uO=x>-voa*Ir?LYWlaQ#{S?)SQ*v+wqQd#{_^_^nUU zUWrOElSMmm_(JzFgMZMaux8j@87Y?9Y?b}Cg>D=sgy3&}7I_gaMV$b?>xyrFl@CK7a(HLeu#Q8CCac!fcQxHge_UEeR9OeDDZnP}hVjs|uRYZHP)ZXr z@of)1l=#t!ukTS~KCRL1QKPG@F@E*=Ew@+U*{7vPgR(kH2U%o@2whBeQ{2_Pvxm;; zuWMCvCl12DBPar`hNO2&JPO5kK;y4f!k>a1icKPMJr|IkukF{b4j z>co#WiOVP*CVOT2f!4*eQTn@z4%QducW;fP&!$HaFbGN|WOn)=U*k$+aRbyACDuh4 zS`=sM*mi+#XS?Y(8UWw>K{ufwkHi=zfPvzCU1;&gJm^OHk9@{8aA=;+iWpk$fj9CA zA1%VGI4x4+wD^ZVgFIL;tl>v@xtU-EBgXe=z-{FLm$5=2Gpjfh&v4AUjZW11k!QIf z+4p?@qPLIqtIw*c^~X26UPR$SU8MO32b_2orbF}nb7w(x?)Ebmzyz-JmoIQrb3eJw z-@Cw_-dZNP%*fopbDe6M$*Agl6s-3k{~^=?zwjKEa>cvdDcQ*X@!jr% z(ZVw@L1HsVf+R0yPSHUC!V(U~2nIFalaIg0&7Nv#DG3HjrzAuPQ7Pa+Sn4DgC?(q& zkvRc8od{7&uW_@o`}r5YfYm_OciiIkH^tvRTKAXS;uf(+&)#Cv?HjkaBXiqs^YI$@ z-s~y<>uXqwUH*q_+zH)JlfUW?l2YS+UqyEMn7{g~ZhBuEn-mRg?0NQNecL@h|EfEA z-;>vN&x~7LZ7y59=eV!a!A1I*J* zpebY1tH%q$uc6qNTLaSF$DvXWl@<0QRxGOAg>11&Ex3;cE8as%qO zvAc^yxjirsTl1XWuJQ$H8b?5hU|G)>o7hX>$jS}(Vp^mn_nZG439r%5xyzl?`|l`l z5_%cMS3TnIyUV@3VM;*IVbT2&>s+g!{tb6&@2k6sYZQO>5&y$)xRXl132Z}9s2fKL z5SU`!g=+jk>)c#e#4Fdi38#FODq@TAM-abCZj@S*Rb2_qx*0ENy;dN6s#GWqiPlz6 zTwww7Ca7}I!or2t_~>rqLf?6JcM}MJ_<2<}!Q}1TL|wTFgR8*k?%hN$|J>bf(Abm* z?FoaySqA<0;1t9}EJuFRjb}BD`>gUm{if^R(5*M-G}ymiFyQI83fN_83 ze+NC`f4f13o`%e7Ab=oQyqd$Y)sgqO&lPXbl5Iu~%BtfX`ZKLyepr z?s@OO^kFosH~OU;+)?LJ344rJ*Crb5HDwL1!C4rLW;DWv}Tn zLo%w)Pq^0&3;to8Sf>7AS6~Ylp)jw#0_BYjm}rUigli)^DOBm6?xx05XT`%E8}7@Yv!PDw*VO z`Yw#|;r_AjvisV7pZnZ=+B)Yx4vzZy)%Ss=H~NkD!I$3Xe|w*sD6gqr{uke6?@hVi z9R&@$@_x>>p76WxcN6qu&ab_nZ+H2T54d-adHB-+#Haw^g+vi1zgo>nLP1a$a5lcn z|MvrKcAu|gS)#JuBjKM8%?=d9bWHZ={__u_?EH#<;6e8dnlS$7*VoZRtD5McMLfv= zqsvv#5DA3CdqcE^ba$XFUA5AJqW~canXZ0a4;U7$3dp@I_M3h@%JRz>ZtZf`hBoJ=6mks zvIC8M2Z%iE@A{q_b8vSXG&T6mn^A-127LdA-E>oh;5b6W0*g39)~;mUjw>PO%kgVc zNk7TKtiFR?{@BCrq^6BmQ8+e~1s9l|H+JD<>0f%7NDy+UQH9%*DSa}TQv6=Tq~Ow- zdSY@QjmXq9vcO+HpUsW!th&N3_g+_3cE-%bI{@m$7gM3A6JJbO^a3k83=8ed;fs0A zMpxmB$wo&seRQMyQP9T9!c2$$H-F!C1V@KpOBSpg9u0@jUA#o4n{urMUj66y-K}9? zZJ=Bw-~0iVhFkqVevmpk&ZrF|wv7mm$3^afH2q(0M`QndUOBh$^ z{$c*8A8{(P#lQPUAik~ssvo%n!W1d)OCd1>UxCVoDrI%X6cL4@9~1KQkKA3MswI@G zb00-Q+2OzbsA&y<_9*A0Tl|p6+|&^h>)X;k_e+es zHb<>arq7~;vO7})S3Kqp3{486`(fX4|6|Y_OraigCnm$JAuiJ<)DZM^3CCmJW3Q%X8dMT{{T(il4eE z%tGZ)^pK;fh!A4Tg1Wmp>DDtpO=n@Hl|1f;{LE%y?$6vQVFZM*Ee>S_cm2#};l-c1 zL&6Udn1?cN6P|GUF|=7vxaHvo+`KU#+3KHr!oC>xWJ*_L2frUpfcK=yHn z35m(uN)u#(edc4-q#m!x%BUeuU+6hWMw1}bzIlt8`k%7JwGT+Xo>WZzd14(H_BXoKTNHTd&)>z=TmNGx8uZ*pK|Z0Nos2M zNS81!zXl_&f+x4Q8rVwt}uAr!#ea&&xUD_}d$w`_CoWacj2W?n_#+s0eT%C`Hu zpSuOn%Xz;<7+v~vHXK^opSzDz>6Bl%$-|DQFVR;sb%*cAq1CiiIsDIMtTfIq{{>*R z)xY)&f52-uG;%Dgp^m{)0jLT;C-DuIqg)eE{EcS|xi?}X+ z%d_sZ>=C|wyUD@xwp-WVvmKq!R{#0!px-0>v)e(IV9@RE;8JRAS3j^0-OPkr#X+cx zaoLz|{&OsPf)?BTs^@HdfASnk%_Dr>uU&IdQ{rY7`=SvU6l_@rF{|Ps>m9lH^nfe>|zHIh4{tqv^<4<|@ zJ79x8g=4x;9rq7*GPExLvzx!02s=Y~_+t9d#KRZThXN0uNgvRx#8-XS&-*QNKh9tD zTh}=#i7PIEi&~i*bXt+_vZ*he=j&c@s~VFRC~E4H%lLa=aAR_X7ya*EU>RQUGk)ie zulkMld5!<$%kDt`gWtK~jdPH1Q3=v)+^=wq|LgDEkjDG<1bvHTV|=V{-QkYUe$jtm zhr7~!F^hH3MSpTr{QqR##UUnb9 zvs8tn=oR!3GqqGLMqdVnmZT+#;;-t}LFx;KY}_VToLC%RxZR)kB6QgMWh9MVdZj>3 zYnjla{Q4K&?(EO+x$`AgTZW&_dZh>aw3gu~4=h}Hf1*z=^6)oaHpyA=^Gf<4`1yVM zAozLiz6$th@+)5k0R(V8=i^it53U5)3FYRpeENNUw-!e5@L>9&w(m(F)b=;h2eo}` z`k=PI?2r2`>u#Xi1V$}45M@+<58hWLSTWf;@dx&G+E@~mh_>Chnvy| z9nyb3eW>B#)1UO;ekB~z=XKu9f`M;eafitGHE)r>vf_F2<1-4)m$zWn@U<7V%1ZX6 z|8dueTEZCfsY-VKk73M?KfBT42eCrEpqB6Zvpag>Cj{+{7>{G=4n51p8y}@0Sd(+U zVEd(rCNzFj<=DvMnZ;GGA2{5&JTXo&8bORYxftt z>ZXlOnrbhKyGO8@tQZuQUrK&Gh7H1U5(%Gtl{4!n{G?qtS_r!lo3ceBv_EGTra$ew zu*Ob`2V3#|yWD9tX^;J|znB0%?Jw?xmZZ&z#hMTp!FB@Eu_f=fzuoQUr++ z?o;P$?v!S^3UJm02toAeOk8gMPp{G74nO2|xS@7`+UtAB)ctDvcn}Uw^~K@H{^a_~REDzW7em4{2vE^JD*xgpSM8-`)J0 z9IgsoNb8G<~0}T<%<`_TJMMD~&)e~zeBn~aR>m_&0WK`k3sVnHE z>dA#;Obg-~G~UFz$)mJ|We`^;yCGijkGSXty8o^y8V>t#brcObMUw#`-UvY!79+dK z++yrBMn_swfh4++`>bxAOrfg~Lr1zhF=Rnkk?7o)@s@urita0`Ba8_G%n6U>e_S68 zp8`*m#6H=bXtG`{YqDNMlVvAXJ4}-`w61D2RYwP~-ruf{ zhL2gdCO?uTol0~vjxSJZ5_ioNWmlPmUFomR&oCbMx-uc#kF@m0N| z^CoG+P12BNv0OuupiMdyZ&cXGMzdjS(yVLMhSf&bG1j|lqeV$KDw#gi?^a&2Ay8OV^f~|45LJdi*>0d^ z{Z2!m2uWF`&ucn=)(}na4uL}TLI1PlCPr5oWXq2A_fYNBJ$+!VcV}K9P`YX=6gx{0 zP!q+@HDnXT&Pv=t808YKcU8J9Yhh42p^5&w#%O#R0tLw(z7GvgWAtdy@Q9R4!?UJ$ zG=-Iaws%x&0QWK()L32Eob}h8RW-=J{C3yNPbx%Gc+6L_)n8DE#s$SHn&4_AGs05WcFO-G`k(3w@%gL1I>X3Ar8qu}^g9B|i$(~u>E6s-te7Vm zw&#icqWAOTL;a$eBvt*Rd41t41#!74ndhN#4Cx8~p8k;zZNJn%8p~Th>K~msCioD^ zc}2j-8Aa;7!enXQOxqT3loj)d1EP5~Nf+Dw-v>v-{f`Gky&6{%Q$T%5f(iY4Ky(Q6 z)4X3au3Mv^2|Z!IsEr>!v|se`@WZxbv96mF4f4f-M3Y3fJaErx{rbS@*dgV4Gkt?$ z*P3{{=y`wi4TYxYfJr@Gk-ni<`Grb-1Ht1o=Mv=Cj*BK#r?b4aDLT4)0f?8DF2IA{ zVWOAJJjvYVsA)jbv;|g6U)#j;k(EXtRv4^^QG0MuG=Ms`42n)>#>Nbe z2K6ql6>3$j)yadSi4&-!S#@k=lY~0%!_E};TZjwq6&DkHz@$^X;O`zxwH!MSjwbY2 z=2L0plpzdhrC&BAI+&Ip7!ti3Yu2`*(NW`Q1P%v7O2}krWEGU8FTv<fg;xYdMi zT|YEBN3qesDM@U!=XFRHVxv8+>{`Fyu;{9xU(SoF0NSf1!{B5?Vpb`bv2fCR@33f; zhQ}0f(rOLM?nnzuDjG_cMulr0Np;Pm=c>TdXZ-KJNocg<(O7+5s^^YkbZrH47GieoR`!1Qay!ewYFai&-l-kqPN!s6+a$Suau&*`aNeb9e^Ob_Pl>r zD;s~H|59r-7^&~Otow?)_GR$?T$e>Bklp)LAC;eNS}wK1La z4*RMD{b%=&j;ZLh6iqrn`2GITa7a)CJq!*l#H`>ZH%3_;5miRu0?+D$JjUC{m7+n@ zgm*c3V0boI(rbdIf1d-^JnBY3{(`XljuH55?DAtrMy1~CWwy3k@IY6gNvDsDPD{@i ztSr!&)!~fcv5`?LM@~COM*YvXHHMhzTp{0mu3)=y590IGK`HIo{_klIqV}G&$6qii zsytROqVtVWdlH?sM@H=(_POnb$8FoLt;UXO0N9^EC>b=8VOz6XS`!Sb4}>0H9vvN7 z4F1gFo1+`Jy)*u2_9F3z5_A+p;KVU|kf~3OF*0@MnCRnWG9_Vl>R2OFer$?QS3oMV zkf~?J{y)U02SHGOHLenqf@gAZX!}8b=y=1Vr;U$BfJUwyUx`U8UfkmE8gH2Nx$%Zc z`%S3Cq#v4KnDj3b43oA`?8c<|DVaBfNyC&r;cGjhR{!0J(a=c&Gu;7(5K;+z8}Au% z1rf3`*8FzBJV8~p?a@gfzBAiX?0OBqxq!x&wMSz?KLV2{!Ki~mm1qosZ^N}ZdCA8) zL_mt3HthObd(;Hbzt$cd+>KppCPPF|n*>rdKC{1HGYJ6S>VG(CPvZH{Nk%-|4u~%9 zCZ1a7TMmfM$Zoy! z2A(}W8rUb9TJ_`WAeuJ2BDi#yz~W{jw2@XfIziVoATyLRH zdbT+c+kEY`XqH9xr0_!Khh(wQP%^p;i6q>GL}r;jB3&BrJ-MEyb*N~<3o{wQ&C{ae zE!sA({a>h9^qrchIi<`r#U|`B+0(Y839A(>D(_xZiT2u`={e*Y`q=Y=S=tVIp1$abohegkl!$AAi&#=0Lwihxf#Ha`W|$4 z<;YxpXV$`8RvzB(E#vvSXGHsDr}<4YqV{fKZne?Xsw1Q8dkS;V)hV!>zd1501>C12 zy{f`bePL#F7zAhDOq1Z=H?x8?{(ro^3%pfD-T%MW-h0j7=LVbm9rixl4tEe0ydev3 zD2kWVu++5dslZZutbBUPb4)T+)T4(SR8UY{Qkc`yv|;;X3h0GGvE2n_cn$db;+U0);P#+Jv2Oa_x-VtT{bQ3WWRY> zI0l@1^I-`J-Gp>YJLT(#?T$iq-j5_R4)=&cnU&7SNGSA_!z)p!qr-i<&)Hue?ojA^ zhdUJ7`-sW|ojflF9O#Zag2n%uz5j^tQFtdmn#vY2-`+npTu)0cJCaRegZ=4|VM`k} zoO)E)pre?>XdK0a3@<#&9mUv9hIcUjJSXw4VDtB*+tkf7e3Bhd*t}=pnhOcMkp$r|4r--pfIJH5YhEqi&AD0{bsVs)Gy9Z5AGougaz9$xIk`o4NhZgX$Tt3CVV zaA<-KV7xkXu=wQg6f;Oy1q{0Ov*E}iyDQ(kpwv~$O7nx#V7)KWEpa@TaHXf>mjIDB65B+*=xV8M)4O8h0@6M{+jJNY{qs4Ja7H0Qzj$ zulFFBiz)5cBq_1eqvUa3DV&ln4YI+Ea6ro!E;07DUuHWV6rxmK#dKkcr=q3{&nub8 zaW!GmMg`(wEabg300$%#PxVL(D3M1``^Gcb0i8NVUEF-59js$D;pQ3Ph(^~^U?Kv5 zT%5QvxPjm~N2CYO*|K!y*_6R-r<-U`jO>azS5}%Ac#diJA8TAQt3x^!z$D>b${#Ra z(OB}T9LAZ^L^mr^Y%Hm>lnm^YM!50@2yh+x#|jDC7b50M*uDtiO?01(XLvb&HV_Rx zj9|=ulS2|GoetS_CNO|Gt2ZRM2x7drqN$_nIp-ta!>oPjl(1Ak$UC)1h6gt??nxr4 za2eLvexG9zV|@R)@X%hh%Dp_pO@};JWJ*Z2B5w1EbFElQBYom=X0lJ{SOy*Xze@Bt6!_s=oEAxW{<>t7fp zOY!-p1Vf8!V+@l83V*I)_41r!7mwlPOhW#neYuOxZ>us~BN9wB^HbjFPV~ z^(oD4g_q+IgaIYY4q_%`7|gVw%;34WMZ__%X#r-7XW>w-oC zEXcKrV7Oa(x}FV^rI)IFMKK613MyBPuP;PBxeQvI__+p*UDh6n5K+bMb9D3d6+exY z9zdzlkCGP%d)XzaL-JYSZ>A);yY-9^hEKHJ9pl&@NVOsGR~8X`)(N%zIa%mJq9LIr z$-IP}k?+ZSRGv*i9)7FD+~PgQQ;I@vA6k&DYwY7h8M}{?X3?T77YPAYh36CI0y!6M zCcG#PbA?ZadlFrI6JhS)ap9fZwZk1eF1*d(!Q41n(ahK!hvyUC5Qm!yuZzQT2)7b$)bv?J zz+FN_VY)xBnWx@C>uLF}kzt=^g;cZLJ~q27E)?rLRoIfQ>tCJ+ZklM7GfMcja8^zr z(9SG5g!}lP;RJ$lo5S||Hm1)Y*o5GJ-}G^c#6)FZ20Iu1{bGg25?XYpLPbJ2_9Ijv zgnu3Em!cmtuVky2i=3~VoKv5Y)gFG=_f4P815>`Q@)?ghXYpXFpUUGFmu&_iJMye> zU?b5JdBMq53zB%+0_deS_8B_#6cK|_p~`lDsQ zTBA>qBYs^fH%%)l5a3)nvz;t*AqpR&CDdI2$8V#X+XeJB7#Cf{T#wDiu*|xkewfgl zy2gzKnZnP~X@{)UXBKa@2Z51UTg+KaisU{#iq~FHSel-aDh*N=Zio)_d?nCE5N*jI z*G~hIVU3v$nd2OA@TXN@$Aa?x9G2NAJfgWlS(^zr$KgdGcqa}oCA=sn`Yav&@A7k< z`l8&Fpd`(9;RDS^w+m?S(I_c);Nl)s3X5vC2iYbLE>(p;(jSkb*L{?cyGSaL((+q zIRt>|>B$4vot+sFzD^0mYY&lxRwn>nn4xSHjqDY1HG|@6sBRBCIGC%OJ~WAW=NNA> z8Gy?t#w=p`xS657skbkmr5;y2$8fw5C4wSHfJi8aBwo(K>^R~24D$fK;S71O(XtBk zc2+%$qDYtrT8PD97?%n%Jjh2iO0aDyBR{i%$(S#TJQOPd<;vPxR zkc@7bbPJH`=Ci)$X*Ka|GCGP7c?L%*9;brx;>K}^MRPD|P1nlS#Ojj1H4VNsCff0O ztGDKFC^q7*mN%!jS>$y1YVyLx@X_y+7mOdH=aQE^FOMfL49t`}xZkpwwbD#e1yY9( z<1WQb$NtPU9SE!G-O5dGr0tn<+j~{EeMluFha_#k_OBJKy)t=GYcEM&)Y^Y04ODC2 zNnX_2rMiu?+}g%HHdk}l%?j3uIt6{cKu<{J`Fe7-hsH%Da%HEr(Fi?hgK?XI-w6T+ zsIX8L`?O_s(n{{DjPCtwW852c;I8D8I&fR^q7K}cyr=`W(f-ZZe+BL$_ZO#%-mV)n zKW8yO<#9XQP;fH^ld&P)2*c8;GO541OppG#4`C6#>NdyW*@QRB!kwP8 zG?aXbMzAm;tt5)u$WvRI%GK4yDn{CC5>uyG^Nw<5qon$sSx@tqk#M7Ma5|E1BcG*= z0mBTz)M=YA-N6GgY5NOz?D&Z&)dZoG47qn({gcFx&uFZ8=CJ0yt9b$?C{ zjM}K_qG{rD@&w%)F-*Er{-W$m;Z~2CNe#uIFvVw@2#Y{qE%D@t#0`W3X=%9Lmlzlw zJeQi1Lzmp-<0vHcU*@rV+KRxbs@O|*8n>>pj2%ExBsH6;_ph$CvWf;d{nW+Vx zi&X!V)CumwKMw{+MrbpsAEeKVO#R@(Pbq}<>GZ&}*`FR<>&rU}N#{4xmFBpMBBR|F z!v~SkO>w-sD@qyL!kGHq>{{$v4*WE%q6+;GH;LOt2O!tf4Oo_CatJsX)a zER%2|(<(rsEt=&348o}9$zxXsEH zAc)6=7Q{D$nt-&5)j71-IK)G<@RCc-)c4eHdpKgrtz=r#(0oJr8{(AUL`jIwh{=pa zrsSH%YH(x*tHVuon(6ugb;IB>^^taWR$xm;7kEdp=){#D1@1T-!ihyS4!)sm80Ia*;APGU;EpUu*$SX(jyt+_kEsSinluwV&er(J(Q{q4B&V`EArx`R;i}Ssrv1Pt>q|>|XlYP!NNKRP zf}yv2v@+XkVGn_)ava;-klP)PBJEl~vN%Eo7w$+3byEY-F*P)zO(uI`ad2b%k{ox2 zvIn`6m}i5hq{8B$nwWNm_Fc!eKvfhlFHzEN_6p$XXdOx=w`+sY#G!NG#loHG`hiGy zyv`<_tq%%+W-_V(E&WEV4Q*b_cuv9D#u7c*#1`nOjjolKd3u3=5Th>IJ|W&Qz=2R& zTjGsj3pe&|CaeN=(serA4yhB~><}Vou^^XY(cIijJd!m|b+eoD=}?ZVC3EM)ji3RH zEWU9N-X!Yu`25~KbwSa6JJ(?s);08ks#z-ca*SPiJ~0FoTtslWZ&!LL;Z+Kw=*fXt z-BFU}+=Rx=qBxCqK6g6L$p$Az({L9YfOyVUCY~S=Y7ho4B;2|A;1x%AF?)1?b2M2B z*Km%UQB|}gCgljPBD|FGQGBDrNv4f{@99}7?2^n|Nn!jjYEM-9o=_>i!I?rEtOW#7 zA`a%X4D$kqQ_I&?d*}z^=ioO;z!qLym1F;PfS^Uo)xWIUd{t52gH}Ph;R=}@8umNMO-FbCBFQgJD&o<)q^wL0c! zYB?^Ea1ID2K1~b5IMfV|@99vy2ua9WgpAUKrMFp7OVf3Bc(NXW5n*dnG@oU3q9 z>A1Ga;{U$iNw*u@^*fFCd?}i6KV-a* z36%?`jxfCgAjh+wDD5Ho-H?S9q(Cz=Sv}{ZHPPaEi0-Ll`mkN4OGAj3ngzd(&9X2n zHa$mvhcO1nSY(Jua5n>R6br`pvjNiIEgo0Z92Sz+qN>wjQtMHtzg>Fv<|v{kr^fAi z4xfE#M>l8+Irn5TR zrXOAQo6U?=jQHWZVghL@@NX-L9bL~agysab**B_8+=HTW9(XjJ^BFiS7oWc}!o*tm z^~P~;-O>-@r9V&NdI2s|f_Nd&oT;y3X9Wq^Z(bO7?pLj&HYav5xl`gUV8SZ7n~-mf zU3_6!YMc)l;~KVrirns3CL^>-s__iOGWA$ggr1@z^ej^mdJz@DlNkfJ88L;0jzByM zG%48!914IospOeAMswY|VdWQI2z>r#$AykLr!;}(6L0LI0b?#|TF1Rbal9ChOXIMp zN9GIE)$I;)C`-?prl~B-gnoyGRn#M@M0itp8tMnlg!A3C8$1)FS=2TKNs%YBS7mq0 zQZz?A*wpVQj&OqJCMOtT2q*{@lFSe~&_+p!AaURkLDHDO2Ve_6l6yG#@B~Ftl;&!g zBB=ldWmCR79aAK}|7?e4xX{irTpU&1)Mh#!d4i--=XRl9G+5eGBoo^xlChsek%;W{ zElgGyVxlBha(l(1oX3`+9$N1fv}2U8 zz&%Zp6OMyV)*P>VrX$0^T1LA@&jmS;X8#>gQtSk^fsH7agR+;qLzZTtZv}-9R$-tQ zcVMMt}!ZmkTSzGAVnmE zAxBs@C<)={C`rC2lqHm=L$mM!z_%!e*!M3E$28J$RjK`O7h~PdFb5jTlw(vEQ&(`# z;u6}dfoI3fZSpOkK4(SEQ&!XfBH_2l`=6XdLO4J~q)LwNc7(#7Vd=K||0`g&)ttc8 zgS6Pu`NI`SoO1JA4GL%w$8a}rtr^HnSRLztZ%QCs`#&EFxM)YPjn~vAWYQu5s$L-R zY-V@%Xg^}jnRp_imzQmvT%>*F^~#pZGR$ec=KKvBA|EI+*5F1HsVp}yoZr(L`^VG^@(FkQOhXG&%vc_^DOW)&$+vG5dB}Ml{o!qSvTyuH0*VRW|Htw zSjrVqFIgb_9H$63UyF-_4R)(?TS$u*1u^{@pqIz{oWSco%nnMO?A<}OTcc`Vj<lrD4UFt|MDy^ukzB6O5yQ4VvZ|4r`fPv2pd() zuj3Txw?)m#OF22yrEMc&om`w0C>0m!wZx^f(i>Gg6DY^XJ@vC#wu#U4=y6_rGCzjv z0J6rgH3oJ)d%VD1L8)j6^KC=8PIDz5z}7&+SMEYY&8j$mSYutj9E%azx&`GXU{S_P z(gZhop-kq)Bw!Q#g(g&Pd^xP;nzmw0v=ETE-O?0IWRn-X$@t{lw1jGEbSEFa949M8 zx0aL9G0mp_g&QhH4veT4qbv#cJ-Uy?u4y@5?y1P>Cz?}PjAt$<-@ra`1-kWF`_>gG zc!svel~`cZ*psdd>l-<$oLWpt+i?aDlzC3%!3kn24`@XlG!9fyXTE*Yhx(vEJ2&tt z04-)kS{Zn9Vv}AQuaZ`t(h9Jao8tFD?!AIm**M%s~X@UFs3Lc8box(t-3vhz?RRn(B(Fwr5<0&|XxIqD408 z*$!dML+z7A>D@28o8Zek_=*^hE-zcm%Ek(?cpEDM^Wqfvvl51s<2kSD$~?`<5vhEE zu#>{}VDdQHjPN=!srbRt^<^FBUKv~XlLl%I?3?)>- zt>eC+{=Iu3Okxyh6pMzt?3D<35$@nWmkop-;OyVt!KaY?RC?3T^^2DS@jr_PVrXHn z(cGrRJ+?;L^%9q7#DPv!<*T5DQ5A-YwI4Kx1FM)8;AVhthh7~H_z&lb#hYF`{pZxD z*C*Dl=%Jh$llqVW9hLehb7h;j=#nkfpi5X+}TNI;ZCAi!2Z~LO@$FiTZVV935Pep zABq9VNxr{$Znn&4zA*jGo4;L{5b55o84hQ4llRA`f)hXeL@M7PrH8XQ*QRJ z!>{$P=veCOjBCSsC2sYv7hfChjrHQHYhfwfrE9)^pYo8xGG)uP;b#;3ZwEa;Ra?FN z_h&6kkhPgoF74D&(Y8+kIe_5k)i!n2*b-tM3>m(MdpaX=O9zTVj^-kNvuG|a!Ql-S z4LyeDi1T}b4b2}CrMfkweMM+67Zl-LF4oNt`<2QiEQw24)~*CR)^wa7c5j60=NzcS z4$*)R9Zlx?;YU;Fa+H{IZFcRMXftF+`{neTgVKW1XUyWgfxUr;6hn zif*c}a!Qn}_yg_h^D7P8H-h`d+hNy*8@vHt;-DkEKHPiY24P31-5ooFJ+UO-fDCUz zS;y7uKJZho4_A0AyUDX4VPCL)ZU_&=nry}m*c-V5sDcmA+pBH}PacVT8FwbtrGsp5 zEk9r`bo7=e7}pUb39guy4$BHdu%?;tRIt!mw0wt;8UxChp}(%1Da?LMI#Q4So9D!m!N+ zw<2C#7#>UZVK-KG($L8>Zp3B74*SfF;Us)*)AY{XovG?Ic;^~)Q#h6;outQPd&x~$ zpiQzXZVD&k_iKkDU$8?KVF*9gp0X(XLf^4;Dy@TK6=0)L6q9s%?8;{sVeE*h;LgS2 zKI4T+dXdI^o$gM^V>aO#FZyURv(Ox7o3dxz9O^plZ{3VjAm#rzxio{7?YB2W0X@ZC zIpIE2{}t&tO7ipZXcsu-3>69F$Dt zvre|b?Jn_{+rzQ=x^my?sM4yoih5kdSh8MxdpJ6D=)himd)U)HaXXf9*IdDb)&!XhjJr)cEN!rvq? zB8ZV*AcX-X^zHX<$w%3-cZ82NmU%eIAwVazGJTr(*3>;x<;Y@ni>j zw&YdOqX~hY!)MQLcyW|0MrqN>F>MWzkjFD*`DBrIy6Q1Sor$(GVwq@@7Z7BoTmr9q zGkot?wB2x=+uT-L1mVC%a8LXs95@6m;LMac;)_Ff?uygytVrufd)wpAa8z%X_J<_h zK)G8*a8m9TLBgJXXV{0G^SgJ3BTl-L*;uZANnGTjiX!7v5EH%P6qK(#*5F{i?O1~@ zb>Rmq-@g+V3T(Uw|1_NLtm&D;?m8Nt8$5|fXtQPmPk%i38|13MTXYb;y1hlmf;jd3 za{jY?_A~qj)G8LM2pVUL|df-c1fNYVjy{v-s{bD#bdH>Mzdzwf#pni9Uy}&VFxSOSa?A_s)*`VCLWB&V^mA|<=YzjcmhunkThiB}! z?g>XzqchbkNg2!SwfEc;E+ozIE5h!d4uNw>qoG%?aBiP&UlD$x@Q|F>)q`E>s3Tju z|Du9ybvq9If6$)$i?9LT1^wx|C*_MGTL)0uvR}0GU7!xcz6;JkHn}$h2E;3%cVH7n z^7D_7K$p<3Whp0?QH}QOd)t{XQznGsZ|-d~VFtXIFu!+ir3o`V@T6n&$4!{mv2nJi zq-OU|_ifCHlG=s|b9zv!@Se7PPXJ-KoQ_^$2xCf0-jitXjC!Yac}9f|bK2g!5;Odt z3XG^?MzXCQZ?~=t*Vnj9Mx3GX3--ZP-tySd70F#6gT&iGu|h=`9ih?lmtnJ~rqDnU zp>fYI9W}M>mkFUk`FwcZ4!sX2II#t9&YzhQYRER<7mgn8ziIQ?vtcgmH$k6OV7J_d z(*Rt1|0+C?X~?n6b%Scw*suL6e6yiloU?nS!BEN>Z}*y{9%q|Yhi602{C#zJ1QZN! z1MG?ShojuwlsE$q<}AYs{};sJdWtw4k;itN_lHj~-^V-zPpIi{hR8i(y>A-=RedAt!S+dv%h^P z98tpwQ%xh)HP=2IPTG5I!a5!TUjUkCIpM)$LEIqR8Oo4-%IxTxjnelj~yZ9trpA zEq-9^30jr3xtWeDxw(n&-n75?=_+a7y^;?0kw?P8jpYU*QYx1eB+YHBN4&e;J9E9d zs$(5PD5A5np{cg?C>E;ozO&nYLmoP-2nw{b)`ih${MBxPS-ve>xe@+mH+_|c!0wIk zx3+nR(gJ_M8m=QhS{HWj@yY|#=D}_FDD^kJ+L4cjLxyeS4a;}Rt?0T*x_%{{^Iy~U zqU}MK-u^a6SCKp22a#^tQWCpt|g`y1+?6CP_O(_y@eI? zs)K#?x8d+3K2p4MTAnSI;aP_E6%X;X_LCa1R1?n~#eF04Nf+#SkA)-i3zS(^-uhTL zrq?5nxHl(h4WiW-#c!;X!h77JNt6<3tyHXr^@__-#K`riIKAsYohrOzPhKAuN56}t zjbloRLm32rzVHz$H+cDXfpk>xfoud66|_s%hvUBluP>Zc%uMSOCj$*##T5$d`4?yL zInK?VS)IL;|HNM+?gdyfJccEnjar|75LQs?a7-ey(dy&{_F!Rl7EXJ%aIxM0@o+%Z z+wKfVvG$9P-1&a^S09y;l$iBy)1j)9`{7pqwym|EXUAdkcsP#3;c+tv+c)^w_tK3 z&E;^*VO){iQzsy<@HL@iQ_nf_$ht5+IR;~q_gVGXX|7zAgXmR%p##cpg2iaUj!Wpebszot_N4?4t(z(%DMlRUM47X!P>Qfv?dn+r_zej$OAa9H)kpYaddM z`!GD%XBZj$!QS{`IHqUX=>{;`tVrE|NC7e;VR`>E{8I2x%W-u_>`T*-xH|K0$w8r= z#aCsjchx*fYcV(njYt9n_;l2DX5m)+q1_iu>?Q$((-Rv){3L{ffp|GRn?w(VETkYmw8&}eR2YeeI@4e5U zOF<}Z644>y9$lFjz5jAqj2T29zHFC2z*t_IZkgU^yxn$PE^9lqny$eg?V=rFKj+^j zo>;77X5CXe!r_Gv{{$ea3N!;RhhMGBwgh)|Wft+Ruf4z3bgbGOf5{|Y@&*Syx+$SN zPuq&iU-D;)%i%;fco!$RZROo5F>u2A`!0KT~(E|o;n&n{+1rOqvEV!(NWpJSx24KjtQ z*A?Sq3G?WxsA1`|>ro?YAdC#OR?P0UglFuY@W2U~8A(bo+5)-|O`zVZBv#VP^54-Z ziS39486-7oe+X>r&ak_d_JKRYVfK)#gKl>F&ai72W`C4I-=9R1t+Gg-YiaI(kY?Ol zg^57moNb_9hVqO~xR!2tvwJ;xdH}F%W(<-CXg?>!Hv3*RJ@;sqW zZk|BiL+w`1lP6!c$D~aI+5^N-V>nV}smffxh>d z=-}Nu|CdkI{`!94NViX8L0iDdGFX5RpbD9TH7%2ROtxRjn7&*a*_1K8cwC<`gLpjP z-(Jj^aeLjygp1^g#uP(rGW1g@{8W(`rq{!?WUq9u61*6&^D=v2)*L>-#VKFTC#3~< zDVMkkxx&qMan^K8@5tCfXu1|xJ<|%3o15ROLpN~2wR+4*cdXP)VuHr_?!BJF|5n9|YShzc|K%o%Q94o#JPvlpnE zG45@~=ATa1*VNu-0FkXZQ?#RvsUFJ~q*GSj(Li$P<2IS1HhElvmJkh%N=dZfut>JH z<2846BmYai4LeT<`>pL@%nQI`HM0oy}Nqt6hvaf1gEvAhsRegw%2C zt)^x15q*ZE*L@s&1^Uc~dX8CA+-tt!EL@+w%9iTQu=Z8{U1@53l@sh8MN?~+(Ehre zif1uJ9G`z=|5#(X*wIBZe2{Ky_3dp!6t_#MP?~{dQ}|KRs+@hQ&W!4(N+%=1a@>=o zN&i%aj&Tp|O(ipUx0;?RnXdN0lIh>AUA`+`smP~$m<5^c3ls~Tp+;VwRG+agmCUgI z?h^Z?+S}sn2_yms32ttlR&Ry}dAp(B9K^_U7-;t55e+o^mKU|QOd)@!a2Wl9ay(<6 ziM9F_d&5AF{2#chgu1HWk}3SzzB$kwKrtf*nGwNd_OpY`zPw#Ih?*|5zZ_%+4)C`T zH>IV~B=p6e3>HlQR&75RWX>J$?l#~fU~D4YsMPFqMIx#5DQmm0wrQ~GcXC@vAfzM_ zYNE`=iUKli-}X?vNI&g0j$jh~{%`PI7~Q_PHBs*gqdPZO;JXHNq;stMmmIyO7P|$b zMN#i0Ruz@J+}Df)SpO2YhLyNAjN0MWG5wqUJOH%+rhmY*+U)Rby{ppxj8SCtUvtY3(#ZLEZ%BNma4T&t*>x?Dl@lgN*%ly&2g9xTYgk zjvI35Kyok*f|lb>=s~yF^e`oRPJa_ZyWLW6MqE3@d=_r@j3K6fhwENot`G3J3-j#c zo;Zfe7WlW!A#8A`@ zs*NVGI7-JVEXk((v2ABpCLMVExjB{KPsC|2+uEU~Up~P)cHB@llTCKoP_utNS-&lJ ze|5ZV9g6LEf?x`l+rJJ)k#3V6*S8>6W{`Gc%K#Imlie znqFy#r}q+`9<9Cmqbc3(6UKDQe<(az1056@Qx7!3)BWs4#_ZEB)g0z2hvt{;-;BfN zH90dTc*!1+1LIbfcDd5!Nw+AMVEw}>G?zDHdtR$=E&LR7eN+|`+fhI*QC|&XLdfOJ z-lDi}u+4eXt*a;ZCYGm%NTwu1-rP#Q?^Kzi^Y=kFP_NqqCfZE3sqg$7MPVk>Mso`x z?`ywaZMppq4}qjCR=#5<&Ei+Y)y^no4zXD^2fuw*aK_KxcqbRS8Xg4?N4hc z^hH#PNz?{bT;J%v`77HJR7+YFaFn9vvkNr)R#i}y49m8{ zzo=k&CsWrYYJ+e4()p@EbD&Ym9&M2B3#60IxlMGmJ-RcUyQ`w^&wXOQNLp>{x|k|T zcf07OI!MjwT_|9s3Se^h;lH5^jc@CGa*p#&B7L>(*wvNNt1BJk<+2u&i#gUhW4Vf*o&MF zU%ZR8MM{|Wu}J6lVE615TVz{yPA9ojTaKC@|gQv`*wpFU$YeqBJ*SJ4zOc~nTfgE zWEVbpmfbMSjII8o|Cr%p^>8T4+w5A``yv}wSVa9VA z{b3_aeXnF+h`RWFL7u4sE-SURX#{1yZWoW>@b|iH9bqP?5#*;wni1nsj71KqwZF!$ zN$gZ$K_)L~w1UOF&{^A^BxYxfG{Z)&B1JZN0{0~PkN}G<6D^o;ca8?bUvGPkF+;}9o3n;vL$vMMHTbvYdUjkY>@@IrguUPiYj{b(;UFeutP_hS2f!In-8y0kRk(5)=Jl{@)hyg8_M%uy0A zyGrgLG6|z-%QXx7*#8`FI#nhK9j~CAq~+iRr)LVcr|p?<2faIZ?k0oIK1%Li30=iV9GU~$lQ@D48AQ7UM>Dm^8y6puzxK0h&b%Hm+`L2 zJVnIuzMU%DhtyI#W*_r)N?o{*8G;sz|IpXB0uiHcRYTm0LFKG;Hls>iXMLhtpGoes zT-Tf$gl~FWtaGtNjFR|@h;eOqnQA(AbT4Y{;&ksQWutw~8i+Cb`n|!a@J!B}z-)ZY zeqm+M0|k+nKQKKG`o!U^nab#cfT=E3uZAiF_t#m}YM!JEm)hkMO!vB2EvzWVlzDsA z1kj=XLRF7UFo#V_mJoACNJyMye-ezuO~2R)lF}UgqX1PF7`*M%+oL9$rRgP4+l>zd z2Y_A1?q?d>$aJu<@EQsS0FCn%U4PA<(i%*vp6`$j@7CVGpPA5SMcY2WL>|dvflq%R zkF_t_j{9@6xXm80zZu-|F^;ApV^TQy<5pdJ&i-ap8U3?XU43C)hQ^~sWPh>08C%@^ zdp4#K(N3~DWal}^cp#3jQq9t$@Bmm{JM5$bOnuct?|TeH@U;WX`1G7t?TrVR9`x+q z1I)1CcDwliGnSjKI~{2D=~)H^Y{y|~+;;SgiV(Fwu%{o$p6L<|wC@~fjv^c#WQGRU z+OHjC&aAmnP)1x;q=nBNWJVtub8+O)XJ#~4)MoRmF&9VcfO{u(54?`5<=IYrVhrXY zIby+3vqw)dW8*#unf-8*@56nQOz*zev*)8O0mTPv3sDV^0*o%Uhr&|3ZIT%?Kyy1C zJJ(6y?x#9g5TpaG!qSzK4mMMQ;AVT#WOG{Gmf7I+-$=xhFT8F4Hrb3Xl%rIOVn;`? z8o1>$GEHOST_NRngbmkeN6;*2`XL*{1W1A>;ef5u%e+h6ZqaFqIjPLob<&Wqu+Dya zis|pJnCHNH9E+02(RBRQDQ2&Jw<2;V8s|&}2YU)JDDticZGF4lKE(_yC1VynoQfxl z)D6OD5dbHS*)Z`CGps)5#hN|vV%Z`|XYHj&nDMsxZ<(CE{}7JzuiG~dF^BTlf2x_x z$ZNs6qVHMBRt^{Lx`!2hWI%%m#tD;Q;Aw&ohUaGL4aYhf1C86h)qElZ$f`JGx;dX?zFjk& z(<-|z9I@$UG_-cd&zODk^CU;gaxy>qGte7z?75#YgYEKTP51oY^d(25o;cQw?)7#2>d8oyOU0lRf@8Gd2HD@`bpp8X6}$fl@R?t<_nlx)Od5ZeQi}c1*7!s7_q&!- z*Xqxhqw;I@rn4+H?{BA`2zh+}bN0Lw&B^(vl7xKP&wl@SQ)N4yWQKO$sQ7Ai2(Qti z8m_csK5M$!FPwxl%V+Loe}0lVA!)|l%FrH$!|YWj!@gU@OwTWMT!SRHYhY;x4cv1P-RwCt%*47oJ*y!uXT=Q4 zxl2)H7#w=ao{RYYDdyz`Dq0ogc_MKDA^v<`r{;Kumx!?da z>vLvo-B03=LWXl!F8!P-1k8e8e%=h|Md2`jv+m+XrV0Mfv!hZNnQyXheI6Of9Q*rI z%`kiLsb*@Hq-oo98p6L#cG0QqjFo9FNRl?52B}>6Wtjc*Y32+j{h_CuQpY#693Ga0 zitex=&OhCphWzU3)6L*?^NaSq)6D<_=^b!>>i-4v>cH!u9iq*+@L^XMH&Vaz(o+7< zMw~H7i21}B<{Rm)8|}4cxMR+}XPBdpg;X6#zp%`ex*gBeqUc=AdUnlvMXhs0Uj4sF zR!WlDQI^KH8;t$Scur>B&$F`KU&1t%@pgxItGA8hnSDpc ziRY(lx%1F>u493#S!nR8EZ&GPt&kP&#<;BqoMlG)j&5)&s?nK1pRq{D;{)dArVjVfi{qT3kSw;p@U!P@$w)M4&zAl<&K40|sF;VZL zIyZ*Z(V}>=+H=k|-NrCZOw8CRJg0V#B%M;B0H90(pUauPaJK2y%g@QBSxR}gs6yYG_8kUCl{-B18?M9izhRE@V*mxBF|==d!}J6axpU0t{RdQx9VotW4twSc zcFj3^7_~#}gmX>Lq9-RlK6FbfhmM20A3CpO6jfy6SlKpoNhU=iRf-Wwd0AJnXdXY8 zy=9zz^;{^T7i`z_%wfLCy46mj_vQ1vv+j+CKFf?r$}@(jnU$^tWgQ))K3rs24vGN-im<}?Hp%d$Q9Q9q(%;R_8HAl4> zuT5&>IKVu33)JBR+57VHx8#Luv7$dGFAco>E_o^P@=Wr=^>Wc;$qPD8(SylLo|j)G zFQQ`XlK(b+J0-Hmtc*d}=AbuNXM`uxhCIsnjA_3`EexKuA(eC;_ za{nE6=!Iwj{M?>?p*vn(av_lm?cEoepYz~t@Q9qOh`onyx$nVJQbOh&j#l-6sjj#%a8L=i0uLp!1XU64 z9CJ}CM}#c`){pIs+2+6DJv}?y9M<_p+JfU82{d>vl4jh9ADXigSVB4yv*;PZ55oGOhia1HKcD}^aw=v-z^K0dlOUw{0)35!=oXX0^Unz(^7j37#@#*`; zA0fK=v8|h9zC*KqIL928zA_UmudS$~ zFLlHHolBW2E%u&E%`C^=_D#OYky3aH)XdM>aX&OY?expc;jXg~S>?{2;$o71+VFBS zo|e1*E@R@m!<1{v(U+TkyY<(8=W_EO!A7shWPUEg=+3*+p*#{nJf< zu^X;1ePB;+y#mI5%tzGsnb89A5jVW1IcUdUX^ttg($ZRT;=DFr38&)`d*_vAfEb$LtsbLfWzwv^r%z)m_f00ZN^hrYt zu$_yrWiry8y58P>m6`f6b}gDA5fmy7>f8+B{hB=hPm^_=vBc!^DjO?jHZ#EKId9n8 zuQn$RekxnDG96?Z9se5$2ZcwR=3h`)=bnoBxh-B}POYE&I=sZ2H5!;xY=OCm)DmWR z1nCo{P!30f@5XD)*FHtMmBU)hE9vyQzuJ!1no_@Ye{D_8gtt^obqeGmT!O^9Z%4aQ z=S3tr=33M1v^^!sBuPG=d%$^7`g}51d?~T$(lx*8n68d5TSgNlGbp74oo(8{Etbz; zYvz8rd28Iq4Dm(0dKa_D&?2-7XVzCo`B}6wy8BOSFU|ZX*M&CzCoAZpAI#3rIxlMC zdBJ%kg)ub?MZW4NTba08iL2wp_I_&)Gfk>$iOtV9Cmz5BryMYFKNtnmSW7%`UR8^# zA3&D$%{@|zFe6hz^g!d$uBP0Pb+y*cH`BY^kVTRdE&n_7v?1Ea12*K&`R4mU2m9^o zOmUwrih5FGmz7WBHsfmE9i!jq&Qi@BrD5B0-2BI`Gslg@l~w?P#+!?$?Gc9R^3@81 zc4r=rHzyckM_zCCtHae0Neb>Hkg-=@Z;lC8*-h7*hDOc0)i`kz} zDPA(0IIzF7oJdTXop=FGETv84?&!Jzb9~J2AHkG-scwoa(t%b0X@X>|~-)N7qyp&;NZ!$#G< z7({FJfhcfFw1IG8eb!qPGBPBoCCTO_39`vKaT4Zr5dBRbI;hY9Jx0bx?^T6|R`$Kg z?41rCwZ|_uT@Kictp*J2$cVulN|ev|G%Z>0q8c<~Gw5%v<@y zZ72-{e_8qW+s%Jx51z+`rLYEjJJC(4BMVK(^fqxARD@(*9f^Z5h%MNQ9cM-#1z@9B zSKhwNw5FkAzxp$Cd%*T<``&H(^ilikVq1ke;bloM>cnbXVW-}0_A}m8VdanRW(#NV zGxwM=U(rZ&Zh~rq_;gg8BD}UYl1Hw(jkdqVP%L3tM2qNk)HixX5l+-U`)wjdkX~x$ z%k|RAkC(-?k}4`i%U$A?*WF`&l&)(RXGh%&_5N%7rF+ffPn7eCKzz-%-V6Aa+dtfE z4)Rkm(Y({vGjgSweAWh4UL8-WAbLr!o%Kq0G{=$&v{fIt{!qg0*>p#9%uS$=+y_5_ zm_OJ2L+NeG#x%R|*GS=RkS)iWjA&gU-J2D{~f) zwZB53^Ekx=}AUEkEl4oq|S_YaoM zk+R+#$&S3=eDTvN$tJ_sPDyqzhgA@5?LkSl3^SBuD?sK&_nSXRRJdM_MfV(@B)VU| z-HGn2o~JXeTswW88GhWA>PHyGE6;5lbKhf8Kk6m#MZdRb<7iRJnkZg&Zuu|pDJvFu z%63|31~e}C3A7z*5W*2FE`>;0FPB0RWKg|+6k_WtJdv%b_0hc8OwA{2 z)NJP@N1ApTH8sOij<2o~56jxO*Fj6~uyv1`5qk@gszW<5PYD=4QS$^mCqG6z?Aec+ zW1L(Y?S`IE96Y$u&HnaLGnjI>J!*RFpA@6d??s8K>_=o7#`B4W@>>>yE5#pX{W^jGUs>_&iSI z$1An;bmO=Oh}tow+`*aU|7f-6m2zD<(yV?A`-((f&vbAkA3dX5=uXDtHM^mdYo|*x zeLcs)7wzcHXa`_5ixIft50lL2r+dCdN11jP-C-K`KhZDKQPJDua+G0|(bJq)IihcGel*C)Ktw}`u)>CF= z=j+{@4s`Btr%i6m)27?-cwu3AD-m%IO}XYkN9^(~m=_d-QK|1C2mHpao1HNMSdDi?F1M{zjnbwD)lP-RDg2 z{Huymdlx)s4$E)Vo5Z3?Jp=84=gr_gK9ySQe6<$}nBBT2*VWnJB{SS!`n>6we=jL3 z$z5-sd)|!d+@#i5E4RDKp)XMA`hq#K^T$iI=e%Hkn14~_#9;kmevNXAY-lU>hK=xA z6Es$CQxCgoqdBtf8KsvE1*BYeyVr~6$o%szs$CJQUfgpL?~%Ul#dbv;`w~TLQdE1$ zJpU3><2|&Z% z-ef*xN{;-!=^smq%kyJSpb0WJV21qhWd`$(-(qfH_Fb~s z>?==x#`!mspbEq2150pzq!B}&iS;>>eX!X~mGsAOHzzFX7wq&un!Sf3{ULSHo%wX3 zIk`rqN=Sh4B$Jcq$3zk@=a645`=iXUA0Q&2_1*YB`e>P{-z5+sVZjMd# zNBg-~K$+LuAHIUjVTWDuiup{IgJVbgvscZbwM$`Ya&MKO+0B0Rsu_`p<>$U?zLK8( zuHEq}$ARnZh}YoIKWmS94e7)S_J^;TaUR&NsR)){Llx)+`_I=*KM8BvpgQy~=Cdd7 z2~^@>JE*pS3J1|J8FZ8Ypn->Tt`g3G)595bU3kns`xi6t69F?j#_us;rXq>>(iZrZ zPua`1m_H6qb{*~T(OAFpgdoN+dR;4UtS(Rr?YIR&*RE8ig_Y1$8l}hWs@KgiGqf8A zj_~nZ{;{6R9}`o73|%XTDb8xNpPSyD#w&rH;^EhbdzdQLxu6l(3j5I0{%StwHgmSz zHd?^0`zsyTVc-0#8FR@02Sk=V^Ka(+lM_hLlbGcqW*zjBSS}L$Zo4R9u)(i@|hBl5Nh>qPS)*&y3objsSI;Q=d zi6vlZjC4n!9d~EYwc0V~1DSl;YyNJ&*H+J-`T|MOt}jSC;=VAXaXr)DK(%kaz3L4! zyUYcKn?|E;=}q%_G;6>ArkU0oi+Us_U3D1&&)RzU0m2hpt!e-CrrEpEf3JlEmVTNO`z?d7Bt`)~d`hAXJyx}9}U*Bjo4}YAGBeo_H$tl}=(<_FOXbci_ zPA(V1XiL+Y-Yn^!1UEpFh&vm?n~k<2&(zKy<_OSZSYTy6qA%iB6_%hYol7yN8IqDDk50W^6yY?RuRr z_nMou%DsMKyZK@7q`kP0$!ZolrRQwal|sM1!;Jhl-;4H{9p->Gay8~qiucbN)=Hr% zBi=D5v?YmWAu?LvP)#CHwAa65ChjQ-b16=8?M_p&g?Cvbm)idC;xa*?;j)97rLf5D z&s=}PsypFbGqkOkv|m@$#2TrNr{cBmLU7KpE8jIE+fuf*3ASHbh2wo)0|o$4YU`LS zUt7T{@%6GAsrQ>Z&8WT!Bomy$CTFPBckov`&3SG0#VsQR_34UOEs`VOb1j?so*CSh zGH#j5Qc7RgviDF8ztnDg4;h#mCP(ZZSK=ULW+^D*kKF^L*ZX@=Oi!wHg#p)I_B-!8 zxKd!T2bX`i-co>yayM&B(zyD4Gxm$ZHu5CxUE6h#JDWV$xjDHZn%yi`IHk#2jBQQX z%l#IRAka4MVF#807K89Acq2b#DXY*jQ?H|{{&X2t4x-+0*6G`;l$ ztUy<1?RP#h#qqm-&Vjf`wB&9cV#&`#lo?%-yunX!5la-y0e~%xEwix89MQPt7ewX7 zR0GgKG-o-lj!EYj!7J|MwUfTW2o9o$^x9pozyq~64zrT zlbi~Eej?9GNuIU!Lv!w@Nq6Bt%|WNNji(#Hw()c%e7gZm*!~|MK-aZo0NZ%4DLX%t zlZNo4ncNsO!r#l}4&1l-Z&=UC-_Hd=ggO0H9#E@i@L1r4^XC)V!FMj5)%O`Zwzb$< z+1!~BnvZ95!}dwc4ALUzQ-#%8);Pzy8JY+RoG3q8s46f=pqicEc$V#mF!$nkVlw!w z0$E9{D^kG;G(A9^%%kF!GcGw9fH}J%V88ha1Vy%#tRam99f=HE=NHu?r zk|-0Ej&?_hFKOxd%MPo8kv!9s$$76HddT;*3 z+HI!{-{*le_FSEv%=emQRg{E9gP}(F}NZY;NdR+mGf5CiQMeK{0#8ZlBD-T*A1Ms~rc^M!DQx zjqzf_lyLG)d5K}dn)GBL$dUEgXvJT^T}&J}WcBD{)YgZcGAU*`=Xy4(VtNYKYI4Vb zGc-LgesY&l#0{NrS)v7G*PIduxE9<$(S`DaG~<8Ee6w%oa(%nrnXOAvDW%rdYga`^ z_ZM5A&y5f6v?u3tQ_{R%&#R0_pUiXQ`T+(Lxq3|c9LX;ZD-$hdUMFibr4v?#K@m%o zjndyVd!q?zWAn+JCLGR#c+xMQ}etT7QuJ?qRX|mzMJ7BRIlTD0wARTb* z=s?*QP$Il`PSJ{)Sr7sl(Q}f$+P7+QU8{w9QZ=sNe^%#uP;mE}+y<`W`Abc%VfqG; zl@s<+2+qn;w}DvNKQ)-zXnbF410iN2S5;BC@rXX^@1Q;?toc}mO?N1Ro!B9FkZT_NTAhA* zxaPfechJ?|&>?q5mt=pCgQnF|2tixooPJz{GN@y&ciBiyR$)qDr+3U9*E6<4Gtryv z@w&aYV{RCG*XEA7uA?x#$~aX^XF4adt?ZQ83VO4cUFcrbqeA9mZK;s!+UT;t;Z>Zs zkyaV(1}-8t1EbJ5g52J!x`=j{?DLe3Gn|j)_}{*q<-3=&dAD-xibAf_-mVei0k&&I z>+YGiRc2oKULkjOx@_eq-HHYFn_Y7Il%qtOEU+uOv_UTuJ=q?5EBkiM{XS@XMSYeg zIf@W7>ig(%MzKfID^$mO7W*o4>i4<5!X;*7m(oN%(X49Oua%SIH@g=Z_}oxVuG6!C z@1l!IT5VLB28^FC=$>0YZV9v_7rsfP=I3FPuo4Ct(QLlBnHVjC+Kzhph}%|vt4Hpu zL0#)r#0^a1{@OEle_&jWTkKDJ=Sq+_Pxj9BW{Ui^cWx+;&V6!6dx*~gp1l~qfk{ty z0s=+UClS(SRzyh=E3fI3dn!HNm#uY?MNH=2oc>Z>@+PsqC%3cy^DXw;{<#N+HqEA? zrMRI&c8e}1qHkM72dIOFwEeFExkuCO?T&ls@C1H6CzebL)@ zE81KpoHo|J(O@RjEJ5O@dPC}!j|p5*{iB|-dCqnl$X%WmZsZQwmmVP%*km@yF$TA!yiF(2A8l3Ab zo~jh-h1E-v&( z4Y`J3N6Qt90d~vJ7LQfkn-@%!0>+N}O2BYi+Be^JP&OD7an4i(UW@K(i zy%XxKWi7Qy_1wNN(QglXQ_@Q#bA36`lV`J?HX_&WUpA+uqB$+QH|LBox#8VE(wR=4 znW-U&u3F*W?4mKbA^Ds1hQnk#{U7P>6YtcUcaRK)0^6S@6LFE4cmKUj<+Ssd{d1-7 zLhc3sNcZWf7gLz)M6XF^Y>%?nj>^fVXpi0}fa=JWO*iz-?^JHgAFf$2p&Z7s#22bo zgYdAKnwxR%CAu-y90kBMjoLn~!OKJ^9l)J{douWlQ*Vnsb8K$ZK?#QkU025|gJ&HG zdx(VK_~bje8M35}b;xd7fDV%o@FB&-9*vmr_p6Gc-Viw}BINJIM{T&}Q zJqn&*VYiOU4L-gq>MI4%Tmfcm6+{w>d^`r}3R2i;?vt(!!<`VA5d|UmTtx1lf`s#_ zxzl)N2~rDI6xDGNz!&$*J>GZIT&nPTS04GUSA=+`#k`$1KDRT>Q+mCfJ|Xv`l~3-S zJ0feuh%Du8-~Do@&xld@u5zYK1RG0!eWLlqMFXSN`m}=b65dkG0ovZo=h4xUtK-iY z^!3JQBigF;OYGD8<@WEFr!dIB{E>ATtsd3_l%XhAx|d%$Z2w$U&@J9GR$ozWHtn@d z6LXi?#}CNmXe|xO+m{Z=_4(WaC93S~+$2}B^(;#wpq;bPdcEBxSY&CLdvm$tUTz!K_jNoL-hUwcgS>s?Krlewc0VZhjmEfvudpk7UUVF>J&9o4(_lDUMWR4fPtT?@ zH<9}m^L$CDE*LyK3|kN3OCRkHIA+8+#%`O zJeSILnv^>pz~U*pO5EvDsh~bPb6hG_-+9VM!3lsiZyP7&`q26tc{4$_qAK{b!SCZ;G3!IntYj)Oz9+Ig@@k<2j^}{ z`txiB;M36(y@~Qka;#=W`5})d%(C*3i-Y+}lHSd(wR&^2D;1@prI+z`i^^hKk5-l6 zm@3h_%g#(bW}-~AvHTIo7txmTTL}5Jv;1bbvTBYx>k7?r;m7>sZAz-t2^LepUk!h0 z{_^%he7+yRge)=dO4a-Y_#U3pK+1qrK`G5&`7_IXO0oSX`z8ex^EIs7Lb1~&IKCj{ zuE5L`Yme17#}v-k3#Q}_WU5^~CD+|PHYN96Q?-u}qn&n0Zfv965)?aNM6DGc=uhX? z43}>fIA}%*?nzc*0`^@=goEo=y{XgS+4n)TU3qT4(otWa>>?K}!h@>fd{+pA@epy##q;ibfb0-z*OZ3u2~(@L0W5FMWXhTQV9BM{}k*5G>F9%b8L)} zJlV+9tnCl0#Zq&=gN6TfN{AUIXyS6%i3!+QEFKTqx^bUakZVcCfC2;v$M(Rj%&40I{(bH+wbio z({sfh&yv^ak0DmrtnfB|u=V-p^xSCU7lYmF*xdfXt1G{LY_4O_EneX6MCm9JM8KEW ztB=cdX`D!i5z_J z-}Kx`xr2aAmy>hO5JEzdP7^{{6T%V+AY3+CWf=ik1Of>V z5)w$l=9aK1yP_-y6%`P1Ll$)i&Y+^AqB6?NL_tNx5gkTh1eY0fK;D0T_Yr1{mZW!iB+daa4M59?geneP}Sx-4g^y7`a;9a8Y%=h4V-Y{kIx>?Y1=3yr-=G_ADclA+u*bSY+#kOnYq z`54(+@H%<%2PttYzsf~PF%)L5I?36xyn}#Na#!sSjmz`0bVNG$F*lomFrRGi&xFq^7uk!MDg5{S#Nu-6NRNh;4*CdfR^zc^h zURI{;_A?cjhqhUL8d&oPyj)v*Y{~8mz9P%2e`SeC#93n8Cg<`T9in|9m*N z6k5k_d7^f&k5$K_Jkfe=px)4 zK&|ZB^@S8uM2pMCl`#NS#!x*vS@>~39xo7K)0W}KK6KawT4JdPpNdda;0vd(r;0?+ zD&)#z(_#KhG1IUxazEW(AX;LrO4AF}CwrkP&@7OUy)#5J6|G!$L{vy()=2F&5u3`h z;D<$&010n%+a!!-Jm}zoZqhx66_Ch$(GUnq&KFJ7?6#T*tPu)v;tnLSdT~O&=wQ>l z5+usJgKZJqgG~9*7|b-qUH9gTW}VNY;TZ<*#q|NVXKmba7o4&I?t&9Gz+G_cQL0}c zQXq^n3xv;e1Yy4&cL#!*gkl?JnnLGq#^Mf_)2UC|*1_U913Rp&6;E`2s#7D?9z1LW zgto+kP&qhCravld(2A5IfNHx6iuxeCfV(rrazRMLURn0PM3 z`yqG(?<}2?);)g3D4XDoD5=H5-}INdh9(w^#IW5iAebtPVTfKt_Z5ru6y>9Z6@luwF9^Uz3X`ZF?3VHnYk^UoA3uGei~9vV=QncMA96~qX?jI?!&E=#aK z&>~-fmetyvpd}7()!`cQwZzQBp{iRxe2_^WoVIy&Emi(k>6y|PS?w9+^j5mqjJ+A3 z8Fnj%tmW0_(e4b)16e52k0qiTZdu{UC@gIb*mfG~TkRfq>1Cf`r6Q-rIz+&JaD1bX z@3u#>{nHZ8}uQp&e7Bq%%UZD&#FY*!uRzK)qnaF5gCkoFuMIZt!47e!-lS-$DB`WWv z;(LqQ--WW0!Su{Ss;u{D`duO?&dO+|D>!U5Z7COBldU3G!Y~${Y&u|RO9@V2?`~{a zSVJZ|chjT_QEab`ET>aEXGUNF1R*-yss{_*@a)sK#lA!@%cB<&OiR+PJL@_W=GpSM&ttddw3Yi#0zu&$q~F z;;v$21UjcynDaV)4!&6qe~AAJ993(%S4tJwM-gC9h`tf@Bhh7_&J$VsLO$F$!o3T6 zX=|)=Vfu}$6X6BITH{i8xpkZ`R_Jc6f(RE!l|Wn#ZLJjTldzwnox_?92LCEIjMHtLpacB)=GUL|hUEm;G9?zPDaQ3ouxF0@<1 zBZqtKtA(Oh&YIur0qN$uY1Dwj2!SFdxI!+oZZHg1JP`R##3_r!waHc}h89qH!Hx8| z30@CPzO(J6MIt+izZ33+KEyX`GQ;A0-DZ_lxq6Gm5cKc(#W2krqdAL3j|Pf`@xGPV zUPiA--UvajFBZj(kGOg{Qsa6Vsg0PG=({H)@S&0cOT;zOs>yO%zC>&YqNZ@Brg$p9 z14MX~w%-A)s?pgzjR&U38kwrrYGmS&I_J$hUl?}@cZzjLx9d(D|G1VXfd9h|HEPth z8MMx!@b6w~kD7f}9``R*qvpen^3Q8s3-*J0wNxKvmA+gc3Hx?WZ5 zR6o424*Sg3(YbXZR^uEJ0hz6%nDt7kcUlhv)=_$Jy=W2~{yx33Ui5Bj&op3RR+Cq3 zZ^od(*+j4<-rEz-3)|}Qca{p-8$^0L%-=x!Jj(^?2;_;XILgJm+K`rkWS&b3OUjqsWt)h(k zMf(T@qMMxN1s3DDR>0rnIKm6;5lubBGO(2uVo~!!&#V?KkV2@3Mn$ zIq(^iV|eG=G?+4dkTNj&@?z#Gj^eEo^Sl+4X)`FMKJsJUyBi6(61C@66rBdeTwlp? zqOTa0sTNUrrI(A}$}#Jkd)Q%PCGfSM-w*RYtL8O$_r9eGI;fPB93}FKg;X+m2SxoS zNA+AWDwBFp%pWgx0l3qqdMrEbMot@5 zdkQN!ZD>*+EkPCBrHc*j*?sWhp5^hPWA<0LJ)}zsj#^_y5qyx#Hs$+jo#v|+n8+G})BMB&Q=<5KI`g6hrt5FUKC(|| zmBEtQX})cNIlR@4aB4E#`D`FI8>BWaV|*x=jp=u6hwY-qig5C6Lbc>Py>1g(JC+9~(^Tc+frD z#V3_@yb$LWhXAo_lMWyK;BA50cH>SJF6j8Y=Bqb2*5_?1u$~R|hhg^M#Nq`uT=BkZ zYzc~B(-eDSYFmWdQ0*Dm#(+x!_#9~jGDa{`&{vO%*J45|@g*I2Ts-L5O%t9Fso_fw zpiMjJjweKifK}2L3D&u&`t>Ko^X~AIFCfArbjMDSUJpCYE?siXHZSdRVM`!AwNv!L zJ%eX=iiHhe#@@|XN;NmZ;Wa-h+lAGHFKPQOF*25qp{s>4w(gqibfNWkivfI|UCAWg zlMB-$R`m;a1M|3UdAGPJ=`1qS+QLai&}8)BVT;;@Va{EXC&hhjz**>7AFZdi55Ng z+c~n)g;k3yX3YBwSUn2lV&@*nY~BIU#uErOpQ4=ygs(Mr0jPTzo#s=z*LdFomjX*Q z=eNc#9SMF!4(Td^(*w&PzU_v^K}Mmfc@*C2F&V(J{ejvhQdt9ZnTUa{73f>uCSqce z$}B_e3UaXuWb}IF)d${rdd-1PwpXeR0logRXwUhdcKrQ?xws{fPyQIap1OE$(-Vtd zTavFMoWJ(I;`XlUo~XX(^l$6U}-&}Yp?D~;kH+Kr)F=R}(49k;`cTV3J5%5AT*_zdqIy#Gik zYrHObr(!jHRv{HC9ERO$H#VE?f1f73A!3_5&F4^CeOek0CIu^btF_Cla`HYo!}~3N z!Q}ooMCt^L`yGg@{-MI=?TF=?J8w29j|Ux>03|@}bwM^uc$vq}5scW`(>$Q@f&*0u za-s?fP5oG7^e(3Mhj8NITe|L$XfgO|k{z?(A zi4I~nS70~nhOddij?J{@H8JGIb$`{__jIa11nWW|7ksV?f7onY0Q7V8@FLzX1e`)I zMuUA$3@K*XNCKW5rpr}r#U99xuft%sm?ph0M%LSeHgL^(-FjUOz52T7G_Hm#b14N= z<1jcw61mdS^RRG)f%351%@5q5B!4Xp0{(wPf%(6I0-eBj2n{+wgZ%gF>2T0*p+lVh zWCSy{fSj1t>yqKQL!vQIW)m*Ro;&60WXEfAAUh|>9r-DutV^`aw+^Ei^wZ-{cSe9@BTRe=IC_qd~H+uv?XH zOvW%QVl4s3>8oy?jpMIXRXFA8v~$Ov-gO|TRKwZR)f0(17q$16Z>0bEP0^(C9*a>$ zB}74I_#PF-aZVnhR++)gFit3P{WV}Qy$f8ZhMGhs{yrpTlC6SEP#7LX(YfaIw%Y@gnkIekgvd+pylc6=>)>T zQ@6eih2t$GZg|OMh86jYL5X(mJKm?1!=iQU4(3~&EB0wfKbi_oMiUN$Wis&t)nN0A z$HRif48Ov=j4z70i{-R3k}+i>{SZDSQTvB44WQ*Vm%>s1NU(*4?&*9jMQuZvMS*0X z9(&h-lc>YM%uV>7>`GR1@eJ@g6A=Sd@!^YzC2ygXOit z1WGKb!NSB~R*%EwfwGw*6;BuR@H--9G*5yc6nt1pTc(Uk#uaj}lR37{{6glA+RRgx z9Oc_vw1m|A&s>@saOy^Jv)WLM5NJ#e1pE1n8c)}-Bdm-m1Eh;W!?^=&DnWlB(&c2r zH$ou9;c@l!RU$oNu)OiPhoYH`P|(P1zatTJz$Akg&V=bn5s6wH4Z`>k!~yRr8mew` z*A&E?lD-A~255-){9_%AI}rDDvBse_qW-w20`Pb02$-uDufcMkvB{c|)m3%GKB(9d z`~D-M)tF_#2#+Nk{jjBzJ%ljhvqqNRzzhta&4`(aT08}PY%vw6UTS1BFLrw`(St`s z-%3opJHY+MAL23-SV7UU{K9qWRqzfB_%GX^C3qnY&U;lx{gW<+fFvP7;W zgl$%zs-+^@COJ=s&J(hV)h53P=K%#(_1_=hxDteTm@O)tR%xjYHDg|-g)o1AUc;mlHa&*`6>h) zDXDq29(+*Z+3ABvROzoqM{h)VMR0iSV?B23yesM(}Hy2&x%R-3|LES z>h&qU9i(}IgL12+836mRh2&Hk>>XC@1W=I^THa}FG2dL^~&4w8R7+p+67Gv>Ms=;Q>(wNj4 z?E&)lbGN6ubX&kC@FfeoEvyPbAHoblHQXKrxXo4fATHt7FDeqU;YvavhEQ>(B4bof zw??6uTWB-FU=%Y;w(x7k*Hb!+XIi*Xek|ZwX|YfX>4+mG@B#(%N;~rcK4bEo>pD9} zL~&o8w}Wv03vb_XO!#wD--9vMa0@P_Fs^=i?Cr)VG`CTY8nHb51i#nN%QfIlr}+Ii z{&5!Unl%=1mVuKNz-}Pg>EMv_46qMp@O>~)^&UdlheIxKhz%^`5ccT|J;+=VfB>vv zfPFa8s$gIv1MI^g>wn}KcbRqCL94DGPuv8y6;q5}*( zXN9mEh<1p9{ZCpf6a3Su`9?-T>atq^tt(ath( z(h6ZW5bZnzr>zin1JSCOV!pRRzOM|9w~T`>SV8Ot;;rG3CHTiEVK)$MBLl0f5OxF6 zHZ!o!3Sl=8?QsS+sgN=HB@l00ZBRhoT|r)HHfhPbx=h5+?1IHzgZD&>66Wx~kx?i< z;eigRxsldf_#-~QlF^21#z>n!67ii`w)3fXn?>;#sp<-Gn**o1ojpxU{?k_Fi=4$T2^wIxdo%XagOjgLkPC z@3wP}s*hu~u1*sw0c9tKp^c~CV5ZEG!HV&slVbYpx87aeb6{i4!m;eYR=@;oPx35u z=rt;w`Gl?1Jg*N+ur8$z%VaQP=H(IOZnlANNNd*5FtMFjpO%S&&d4m)i)kSy!Kkgd z>EoA~;=s-gGYtuNBQ0_WIxTY$F|bW`(Z?b!e+{fy=q(rxE?p9s$9T{1!7PtirTwAm z@td0F`yAL}UpGDs1FHfN`OQ4^fGXWwW_dgDMvJE78 zqdRA?sqfchhfD}y_vcx{MZ4chjJXwDbRWAZF|={dI`5AK^x@$Vl7N#=(xg_63X0_PGt@EEOXG) zpNeLcr~;RO1r&tvLM@x&aez3qzVTdN*3D2~T*QPrpb&VWqNtIR=YD2TNot{;3uE+n zhSu3{fb|dz6}@IwiPLR$nqsZPpaF^kweA5JECwHUULkHibd+ z=g;RD&Yn)p@c8pts4N&=TcZ*a9QCUDSK0P$1HVp!c_M1UC-t^{$~4CZ(lpIQ@f0%G zz&*lT$yl4pG5b;ZGo_&Ys$5Mr78%2)4-J)@?~O6K@{Bi3^;(oo=O_W246Lz$4cRdU zRB=57VE;mWJj`H^zh8aFXV`OfLK^QiQ|dhK671~kgF50Qr^`Hn zPh7mGDvrCq>FzJEYjHVk{Ze#AE}wiUQo8a*nUE{BORZ356jFFnrueaPu+z!K-^;)N zTjIikbTcp`>hgD-0}pLBxEmW1Ic+SIV^qcqM~zic(_=P4fGjOn45rnvjYNB z@HsPnKhM4Kti1vps3dySZC%ZcH!vRDD8N^o_~_A7BD;1qT6IG87pKI3oQ}WIXJ2E> z{pS>MTKq>tvDD-Ywn%?YEzjWODh{Nc5yPF&t)&BJ#3bjwwdDV&sBTq@lt|1B`7Zw5 z=n?&4JouQH!J3y-{V1;Q+ zEY|X-9oxJ}uY7|oiBHk#Z^Y$SQbQ3?yHH@B0{NI{MPl%sSX0l6bjP1)^;yv*yoN{R z^Rxr+jz7@rXJHUHauS%0HlJe$jKMs?FVAa8jiUp2$3`H`jhREIVE}nBi|65!;OYs} zy5V`j8DM=Z$}uBSZ8Q)5T@NLvc@}wSxeYl6M6e#fd$^)zz~~CX(W|S@o-8+F)vc3w ziKnIK#31L{kErIHXqRvSJeZ4x%@jO=-@yEForL#iO8r*E_FMz@bLDVeiamTB&1!A# zXA!MV7F!;NZIAIZ{Aba$NNFleM-orLike=Ix@ zi~Uc0$wb13uQj7IX!j`&vB>;D!v#sxkf3c-O5(I!gd>y|s77o)Eh zw&lEtYf}3OQV2C@eE&e+TY-wd(UJ3_Pj%dn*bV5%hod>D#g6IWj#|3c$&gzSz#Q!8#qM&!_ z<~nT+c9|L-&}qc<&)p0)myrs?&U{>J^G|%U0AEXKnxgtzUcJKGfR&qHd&F3t_#AU8gNhj)mb;Vz9uT&Mx#*-@ zW;(0BscsY|-*(Vf;c~Hfo0-?4Q&b^jC+Egf^pucooqsw-9}3ybx#JXF5^`dLYF>*~ zdgVsN>%7%8OUeZ2kyErv%8qVumYH-=%2xHvH^B|MAueA?+>w$aWD{nQn>35$PjA@# z)~)#M5b6;jn~qV@!M0Vk6}tuokZuhInaL|AII-vm=F>5X_W=VeGThAPV%4kV4Qxck zI1JAwdO1QSJ6v=kLdI7z!z+R|FJabWW!{N(924_$tWTqP{nWG>Ck&zQ7^abG0MYPf z(l#UeVQW9c0MLkqJ|GnU@+tC5tgiDiD+8$#sa(7g1#2hbv4$GK-~Ej+SFC&dh*4P{ z^08otsyv#BIEIdMc@*7|J`}{Onkbe}0XcC+mD?^!SCHugHfYQ$p_FnxU8_ z)CHw@%!AzFupw*pA57PWMGD@Qh_i@Aso_8re|G}Fb!tKr&i6j+c3|hChwlcIFy8aB za=4EUcw{W4MadqTTHiZGGomm(eg70~jgo0hr9Vc?QIs65NisKDmN?%&MNdW}@Pkuy zBwDtxBF$uyonB9l8g!Z~s5-!&h;EeG|wbZPO=+dug% z=0>#6=ymDkqnV?y$Q7o#fqt$hyE!-ggSyq1X_cEGlV(_~2v-gk;ilp>?-*6RP8y3I zGaVIX-Ehg_2bOfdT6iRfSG{sHv+6PPq%rIA45CzoL%TLN*D)|xAz91#b{$krTjf#q(8OP|Nc zA-E=`eFGWK7Xb4Ome5jgs_naHj=lWQLoXa&U&+VYIHYHh3i!)sPkwmju{W3g%isXI zt%1BVnZt4Ov(J4i;(dV}V8p~{pZ>_kDM;=>`3LVAQmrL{WJ^9^On zz#Yn>roRr1Ip5a~txiGxRf@Bzlw_7bQ8V zI`?1G^l2ieBm}2%gM&rk8`SDkC41=QCbH8nm)amfPQka*=O)M@NyjvYsx_5BnFAZ; z`W^X_P9(^5=Y4;#mWi^x!?CM6x2b&15r3E!3Z)Gy5`cI+%tQQLYMd;KJ^R%=bj3F% z-IXj;uy5B~h&3+Smn?IyH)gak4E1Sw3~(P-ouS+F#K&ufVfWCvb1(BrbO;4lJA%Sk z*N4CAFW4TrZ`5>}hNj3knvx>p9ZtG6MGk^O>!;6z{u1-?^;v z2V&VDAY$OrnW0Qf)_el%{u!2TG2U`-fXj2e!PLVqlLrFIV#Q(qcVKY5=!gUN_`=N- z>NE*6v9k!!7pH0+CEv=2^W%JK^LxZEGg{mEE#dsIXGrDe=KO#ORIw8>IF{cELtLqX4@(v zq%qHn5G*)YSiuz8Tu!b0ON28L+ty4+Doc6HA5z0zuzaQph(@SPK4_LvrgH$;8gC?m z*v4`@t_VY67@QtCL-S;Lk4t`2B@_tI2&Rm@LXSJ7`}y6xH3#87cOokY zOku@1U*I$kfZ(i&4FYru=vch619Cwcwx{8)SQrPaI&ui!BkR;P;+N_=2==_$=`s-t z;_7rv6}VHcR(3=YPCQ>$HeHX|@{z}2t|4eScq zE?W(8y)|!#MgqE!E^lsx{YK~#TnOv);I<3XIh1!HP>&25m&KAq?XTfnfLFKGWPJ23 zl{eb>a2+b&)9WcxTr-T`Z6R-J#8YyeAwHL(GK{b@LED%raak|Eb8n9;v`<4SOaeL*=t`7so(Mo!3!@&bWLcxCZ=gtlxS(p(a~TeN zi^Dv7j$UsC4F&Gkt?;=!xQ$xNjqL7fjj1@?KeyKYfRm|78#x{(hq-O!v$6Xy#nl6! zjf)D}M%~-WSxBKX^%vyF`D@_!;R^kNgIwnh2u#&Sh3)O`CM3x-SE^d8DXE(FGY~Dy!1S7$W zfUYycY@v-Jh3)0sU-JzrN4A{XHDD0|YqyLn%vmiX3xCs!wF?)+$}Z8w&=O@MZ2Zq; z%WT(0wC(TNvSs)}w(YxVZl-J5Yztp^>%VIGI9!Bp>2 zHy!FAyQ34rJIdi#v+d06D2MgEvQ0>tQ82UB^<^5zq&LX&69Q69C(K_DFQlHGU?YM1 zSSOiUuhvL{Yc&^A_Z*qTVdHaTIwf{S4;))WPv*#05nqR!mRV$OXH1n3F6Vs4Y{-#O z{9Z37B(FoubzTTVUW1*RR&X|LBXu4a8V^zPYvlVbXf<^48ksrnchTrxpS%q#512hH zVWv2YXZ8XI#vwvsYOKOifeLW5c)1-hdl?9XNDS}Q<4#Nl9Lttq(&dDURj_b&!j%=5 zs=COBx&#$q65NquBLdbqC?^m$*|gm(9q;Z)EU)5q<7~xf+6M8bTs%2a`i(r&V-s>Clge( z=)Us{rp&1*K*Tv6vS|-83hP~3GPRIS6eIW7`k_+pKBxf7Nhcqt_4kz-s0X#Cx>e(aQa*}1u>Y(-h# zl!{RWW#xsXCFB?+S~@LI z@Mp!qJ~Bw6>k4FjN*^Q>#E`sMvkFV5QU5`5sLOcDLz8C8WanWIRn5ef^3xvr81XOf z**IUp{8^|)dAqW512WQ>22!{OPXZnVQ^jC8rP2;64-Ue6ks~N7;II%lCj=fI0^b<| zCx^iQ)a8X+bs0ZIz7f%@p4V`~zYlICmbW+#(Bs$3=5?DkETyPmfohZS4PtYn2H=Uq zR)mKzK3?ull?!C5H*;h;x+AmBC>a(tE3aZY&~ZqT!x#c#SZ)U)Q5^!=yhoEk?sF;YPv#0gu-RhwC@Adzd;7m-l8&nbNs)UVg{U z*L3OBDW`o--sCRXowKs0*k!nU9$lnv|xnKzCp%CoC54c_;gxxgKQS#jn$wJF1L6(9fWtoJ^(ov+j~xNadqNI zIlw_{N68&ca^t*48iL2-X@tjyC((_gWo6`>2u^|bsW|#q^Gh*UxVQmtm2}gBF8)5-x`yM0_s41}>A1jnoeTbNFXgerMov zr~G8W;m!0AY6h2?%XnIoFB|u>Nu|6ZudHHX-qebMvf{#-g%$e|jZyIiT<+ujD3slI zU0%ZlH?O?BpkiVnbQHrl-HguU!?10nQAC0KDXA_RF~Fzim6Q||vqFPneN$z#ffGRZ z++#PC78R8AD=4U7cVd1)N$JcoRx>6w*TomXkm)Vd^o4RbZ(Gnh7j^1R~Wf-+xW zxv!+O!k3pnv#`YQWl+yT;Hn$qFollHpkjun17=*^g~hkl!{WzQw11{d7`YqaOklr<%fpZs5JfLT@sA7>0-Q=4Uvb5qN%w=QpY< z!>sS*wW9||$S%po4FG(2SQK%G zb6fbG+cJ_S-6s9iW0w3OvTc@To!zon8S+OCv*3wYTGzQ1Fv|~wv##UYY{3)ZGVU)U zAPm#%Ar}uK{3e9I3zZ@pE-KclOty;b(_Yi$xc1c(%49u9!mwn=s-WRJH8_gp98&RO~>llb71xl8qHi+aHd0@bX_MSmk4yt=?(Mb$VQ_8@sD*P z7CtH#&6p=UWZ4OpA&f_}4SxohS&0qDL)~W;hs^CVi!RQS!=gt6v}x)_8arQht>ZO@ zw$7I=;#ldkV~xY%kF&tR_YIgMHl_c}mkop3pg7Xd1=0rr*#8=@F%?N!AJL4EYh(Me zT99GGv~PjTX*3=n|G16ZTPiBKZpX@^CZkE&HFbmAe&7E034Rb-fTJu?Y`4%~V z9=k;*HO7!FET5M*D>t{S6f@nj+*~y^re(Lt6zVrq#=DF`T{UAU?y49=^Hp8zG6qJx zJ&>8P=i@2R19|HIFpx*acdI*)SqHGuIUVnXcxK=U_Ad&7i$ma(z(U5rE^DbYPv)YjO@`z z6ZZ9eXx0);Y9|3^vH=Xn-aAj?Q%#|5kb_ME(z~LeAMHCnu|N9X5 z>k#;F7Mx!&r8FPrgW`gcX%*D;$+Gk9B^>sDgg)Me(ycbb}=NUCfUJSpF(6Tmg6---J%B7K?SxL?hqU=>N zJ>EC?m*+XnoA*Hs&WuGi6N(Mb#CsPTrXNX{kTYIZ;Nc%YV=bO_))Op4*2C{=c!~3s!-xpWIg9VJ$b32?^URBTQo*$T zF4-b!{`FcVvZHYK^MF%u^#^y!2b}SJhQhQ2=5*Dv=%agNbT(%8!@Ww!VYQVe zdn%r*X3(*4X27a`0-3Oa#8~Fx7tHH7046*e@!Urb-YXNsDn_8^$*~qoHOKD7&bsGD z(9ie6jCf%L^;#>hO=|i(uW=2c+u2GB!3w4a*UF*Mw<3yZN1-3r%Ii8EgI8DE3vQ3# zRDdUhz|0F8Q1p7)EPn6}dVX-V#y0L2UqM+}X&DC9 zCivGU$2u(coLet@LB|t0huJo`tmO=_G>qv5^L^zNWms6r_3a-;KW~ujl8zxxI^rm+#MII`CHb`s zMbZG0%_7rA>p|XaG|eTM+<6#aW+2_*g6@o=a|_C*VtI@i#C-U%2yFDJA*3x7<(j7xBN zY}X&F-4wV{fLp^AaI?qKL-)(<1On^Rk`W^C1heo$3C~G9f*`AahPhLHU%tSp|9!P4F5e$f-G=Mp)5(5o&l< zw&J|e6;@aWgteq@L$Sm;?O~acF?^yPq;~jy2xshGY0&CoH*A)XknYQnun-Z`@GzgW z;e~kTv8Q0l+$+6JR$rT59ekJSk~0{BaA!nH;eRurryXnf;y_=BP?fc|0a6*9$LhwoEi$K4y&?^xhX^~F4K-XD$RIW(!Ubf`im6=y!>K{=MZ9x&*x?ML_X6-f=-*qh>NXxxSZo!-WfYZB>qle<$10lmh)j$* z0AJSMYC~5(BF!MJz}Ec|!cy|l4b_?3cJWT|J0;4bqC&Tw(~UJcj5{5+eHuTkWGSWtBgQD z?2w6-Vy2#DeS!3>znn)QKu*A&r?fvc}; zr)5gS4uGtb-auj}jJ`G0dne8#cuTcVT#69xc^e*%Ht)bXO|o|{TQlr1Hwk&$-wgx z9vhPf@cuHMSMUV;zY6$&=Q;kMPANBb&C;Ec54RSvLwCcJuzQzGjyMZ{)}(9b=q}kC zC)*Nt<50w;+0 zsNh+8Xs_%NUWKilp6}@6z0%*SYQEmT&_Fr z26lei;LnJFf7^XHoLoc0_Q{+E#?5-wf_tDd9^>Zf`}WCa!m$OuUTe6FhE^Q>$|C{{eYRWbFU| diff --git a/contracts/cw-ics20-latest/src/contract.rs b/contracts/cw-ics20-latest/src/contract.rs index 40d6c97..bd3edab 100644 --- a/contracts/cw-ics20-latest/src/contract.rs +++ b/contracts/cw-ics20-latest/src/contract.rs @@ -3,12 +3,14 @@ use cosmwasm_std::entry_point; use cosmwasm_std::{ from_binary, to_binary, Addr, Binary, CosmosMsg, Deps, DepsMut, Empty, Env, IbcEndpoint, IbcQuery, MessageInfo, Order, PortIdResponse, Response, StdError, StdResult, Storage, Uint128, + WasmMsg, }; use cw2::set_contract_version; -use cw20::{Cw20Coin, Cw20ReceiveMsg}; +use cw20::{Cw20Coin, Cw20ExecuteMsg, Cw20ReceiveMsg}; use cw20_ics20_msg::converter::ConverterController; use cw20_ics20_msg::helper::parse_ibc_wasm_port_id; use cw_storage_plus::Bound; +use oraiswap::asset::AssetInfo; use oraiswap::router::RouterController; use crate::error::ContractError; @@ -27,7 +29,7 @@ use crate::state::{ ADMIN, ALLOW_LIST, CHANNEL_INFO, CHANNEL_REVERSE_STATE, CONFIG, RELAYER_FEE, REPLY_ARGS, SINGLE_STEP_REPLY_ARGS, TOKEN_FEE, }; -use cw20_ics20_msg::amount::{convert_local_to_remote, Amount}; +use cw20_ics20_msg::amount::{convert_local_to_remote, convert_remote_to_local, Amount}; use cw_utils::{maybe_addr, nonpayable, one_coin}; // version info for migration info @@ -211,6 +213,7 @@ pub fn handle_increase_channel_balance_ibc_receive( &ibc_denom, remote_amount.clone(), )?; + // we need to save the data to update the balances in reply let reply_args = ReplyArgs { channel: dst_channel_id.clone(), @@ -253,13 +256,32 @@ pub fn handle_reduce_channel_balance_ibc_receive( local_receiver: local_receiver.to_string(), }, )?; - Ok(Response::default().add_attributes(vec![ - ("action", "reduce_channel_balance_ibc_receive"), - ("channel_id", src_channel_id.as_str()), - ("ibc_denom", ibc_denom.as_str()), - ("amount", remote_amount.to_string().as_str()), - ("local_receiver", local_receiver.as_str()), - ])) + + // burn cw20 token if the mechanism is mint burn + + let mut cosmos_msgs: Vec = vec![]; + let pair_mapping = ics20_denoms() + .load(storage, &ibc_denom) + .map_err(|_| ContractError::NotOnMappingList {})?; + let burn_amount = convert_remote_to_local( + remote_amount, + pair_mapping.remote_decimals, + pair_mapping.asset_info_decimals, + )?; + let burn_msg = build_burn_cw20_mapping_msg(storage, ibc_denom.clone(), burn_amount)?; + if let Some(burn_msg) = burn_msg { + cosmos_msgs.push(burn_msg); + } + + Ok(Response::default() + .add_attributes(vec![ + ("action", "reduce_channel_balance_ibc_receive"), + ("channel_id", src_channel_id.as_str()), + ("ibc_denom", ibc_denom.as_str()), + ("amount", remote_amount.to_string().as_str()), + ("local_receiver", local_receiver.as_str()), + ]) + .add_messages(cosmos_msgs)) } pub fn update_config( @@ -427,10 +449,8 @@ pub fn execute_transfer_back_to_remote_chain( let config = CONFIG.load(deps.storage)?; // should be in form port/channel/denom - let mappings = get_mappings_from_asset_info( - deps.as_ref().storage, - amount.into_asset_info(deps.api)?, - )?; + let mappings = + get_mappings_from_asset_info(deps.as_ref().storage, amount.into_asset_info(deps.api)?)?; // parse denom & compare with user input. Should not use string.includes() because hacker can fake a port that has the same remote denom to return true let mapping = mappings @@ -540,6 +560,14 @@ pub fn execute_transfer_back_to_remote_chain( &msg.local_channel_id, timeout.into(), )?; + + // build burn msg if the mechanism is mint/burn + let burn_msg = + build_burn_cw20_mapping_msg(deps.storage, ibc_denom.clone(), fee_data.deducted_amount)?; + if let Some(burn_msg) = burn_msg { + cosmos_msgs.push(burn_msg); + } + Ok(Response::new() .add_messages(cosmos_msgs) .add_message(ibc_msg) @@ -550,6 +578,74 @@ pub fn execute_transfer_back_to_remote_chain( ])) } +pub fn build_burn_cw20_mapping_msg( + storage: &dyn Storage, + ibc_denom: String, + amount_local: Uint128, +) -> Result, ContractError> { + // burn cw20 token if the mechanism is mint burn + let pair_mapping = ics20_denoms() + .load(storage, &ibc_denom) + .map_err(|_| ContractError::NotOnMappingList {})?; + + if pair_mapping.is_mint_burn { + match pair_mapping.asset_info { + AssetInfo::NativeToken { denom } => { + return Err(ContractError::Std(StdError::generic_err(format!( + "Mapping token must be cw20 token. Got {}", + denom + )))); + } + AssetInfo::Token { contract_addr } => { + return Ok(Some(CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr: contract_addr.to_string(), + msg: to_binary(&Cw20ExecuteMsg::Burn { + amount: amount_local, + })?, + funds: vec![], + }))); + } + } + } else { + Ok(None) + } +} + +pub fn build_mint_cw20_mapping_msg( + storage: &dyn Storage, + ibc_denom: String, + amount_local: Uint128, + receiver: String, +) -> Result, ContractError> { + // mint cw20 token if the mechanism is mint burn + let pair_mapping = ics20_denoms() + .load(storage, &ibc_denom) + .map_err(|_| ContractError::NotOnMappingList {})?; + + if pair_mapping.is_mint_burn { + match pair_mapping.asset_info { + AssetInfo::NativeToken { denom } => { + return Err(ContractError::Std(StdError::generic_err(format!( + "Mapping token must be cw20 token. Got {}", + denom + )))); + } + AssetInfo::Token { contract_addr } => { + return Ok(Some(CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr: contract_addr.to_string(), + msg: to_binary(&Cw20ExecuteMsg::Mint { + recipient: receiver, + amount: amount_local, + })?, + funds: vec![], + }))); + } + } + } else { + Ok(None) + } +} + /// The gov contract can allow new contracts, or increase the gas limit on existing contracts. /// It cannot block or reduce the limit to avoid forcible sticking tokens in the channel. pub fn execute_allow( @@ -619,6 +715,7 @@ pub fn execute_update_mapping_pair( asset_info: mapping_pair_msg.local_asset_info.clone(), remote_decimals: mapping_pair_msg.remote_decimals, asset_info_decimals: mapping_pair_msg.local_asset_info_decimals, + is_mint_burn: mapping_pair_msg.is_mint_burn.unwrap_or_default(), }, )?; diff --git a/contracts/cw-ics20-latest/src/ibc.rs b/contracts/cw-ics20-latest/src/ibc.rs index 2521e4c..88f075c 100644 --- a/contracts/cw-ics20-latest/src/ibc.rs +++ b/contracts/cw-ics20-latest/src/ibc.rs @@ -7,8 +7,10 @@ use cosmwasm_std::{ IbcChannelConnectMsg, IbcChannelOpenMsg, IbcEndpoint, IbcMsg, IbcOrder, IbcPacket, IbcPacketAckMsg, IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcReceiveResponse, IbcTimeout, Order, QuerierWrapper, Reply, Response, StdError, StdResult, Storage, SubMsg, SubMsgResult, - Timestamp, Uint128, + Timestamp, Uint128, WasmMsg, }; + +use cw20::Cw20ExecuteMsg; use cw20_ics20_msg::converter::ConvertType; use cw20_ics20_msg::helper::{ denom_to_asset_info, get_prefix_decode_bech32, parse_asset_info_denom, @@ -18,6 +20,7 @@ use cw_storage_plus::Map; use oraiswap::asset::{Asset, AssetInfo}; use oraiswap::router::{RouterController, SwapOperation}; +use crate::contract::build_mint_cw20_mapping_msg; use crate::error::{ContractError, Never}; use crate::msg::{ExecuteMsg, FeeData, FollowUpMsgsData, PairQuery}; use crate::query_helper::get_destination_info_on_orai; @@ -131,6 +134,7 @@ pub fn reply(deps: DepsMut, _env: Env, reply: Reply) -> Result Result Ok(Response::new()), SubMsgResult::Err(err) => { let reply_args = SINGLE_STEP_REPLY_ARGS.load(deps.storage)?; + SINGLE_STEP_REPLY_ARGS.remove(deps.storage); // only time where we undo reduce chann balance because this message is sent and reduced optimistically on Oraichain. If fail then we undo and then refund undo_reduce_channel_balance( @@ -160,6 +165,7 @@ pub fn reply(deps: DepsMut, _env: Env, reply: Reply) -> Result token refunded on OraiBridge yet still refund on Oraichain @@ -447,6 +453,17 @@ fn handle_ibc_packet_receive_native_remote_chain( )?, ); + let mint_msg = build_mint_cw20_mapping_msg( + storage, + ibc_denom.clone(), + to_send.amount(), + env.contract.address.to_string(), + )?; + + if let Some(mint_msg) = mint_msg { + cosmos_msgs.push(mint_msg); + } + let mut fee_data = process_deduct_fee( storage, querier, @@ -1183,7 +1200,7 @@ fn on_packet_failure( return Ok(IbcBasicResponse::new()); } - let sub_msg = handle_packet_refund(deps.storage, &msg.sender, &msg.denom, msg.amount)?; + let sub_msg = handle_packet_refund(deps.storage, &msg.sender, &msg.denom, msg.amount, true)?; // since we reduce the channel's balance optimistically when transferring back, we undo reduce it again when receiving failed ack undo_reduce_channel_balance(deps.storage, &packet.src.channel_id, &msg.denom, msg.amount)?; @@ -1207,18 +1224,40 @@ pub fn handle_packet_refund( packet_sender: &str, packet_denom: &str, packet_amount: Uint128, + maybe_mint_burn: bool, ) -> Result { // get ibc denom mapping to get cw20 denom & from decimals in case of packet failure, we can refund the corresponding user & amount let pair_mapping = ics20_denoms().load(storage, &packet_denom)?; - let to_send = Amount::from_parts( - parse_asset_info_denom(pair_mapping.asset_info), - convert_remote_to_local( - packet_amount, - pair_mapping.remote_decimals, - pair_mapping.asset_info_decimals, - )?, - ); - let cosmos_msg = to_send.send_amount(packet_sender.to_string(), None); + + let local_amount = convert_remote_to_local( + packet_amount, + pair_mapping.remote_decimals, + pair_mapping.asset_info_decimals, + )?; + + let cosmos_msg = if maybe_mint_burn && pair_mapping.is_mint_burn { + match pair_mapping.asset_info { + AssetInfo::NativeToken { denom } => { + return Err(ContractError::Std(StdError::generic_err(format!( + "Mapping token must be cw20 token. Got {}", + denom + )))); + } + AssetInfo::Token { contract_addr } => CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr: contract_addr.to_string(), + msg: to_binary(&Cw20ExecuteMsg::Burn { + amount: local_amount, + })?, + funds: vec![], + }), + } + } else { + let to_send = Amount::from_parts( + parse_asset_info_denom(pair_mapping.asset_info), + local_amount, + ); + to_send.send_amount(packet_sender.to_string(), None) + }; // used submsg here & reply on error. This means that if the refund process fails => tokens will be locked in this IBC Wasm contract. We will manually handle that case. No retry // similar event messages like ibctransfer module diff --git a/contracts/cw-ics20-latest/src/msg.rs b/contracts/cw-ics20-latest/src/msg.rs index fb71030..4807e7f 100644 --- a/contracts/cw-ics20-latest/src/msg.rs +++ b/contracts/cw-ics20-latest/src/msg.rs @@ -98,6 +98,7 @@ pub struct UpdatePairMsg { pub local_asset_info: AssetInfo, pub remote_decimals: u8, pub local_asset_info_decimals: u8, + pub is_mint_burn: Option, } #[cw_serde] diff --git a/contracts/cw-ics20-latest/src/state.rs b/contracts/cw-ics20-latest/src/state.rs index f1589e7..8468812 100644 --- a/contracts/cw-ics20-latest/src/state.rs +++ b/contracts/cw-ics20-latest/src/state.rs @@ -134,6 +134,8 @@ pub struct MappingMetadata { pub asset_info: AssetInfo, pub remote_decimals: u8, pub asset_info_decimals: u8, + #[serde(default)] + pub is_mint_burn: bool, } #[cw_serde] diff --git a/contracts/cw-ics20-latest/src/testing/ibc_hooks_test.rs b/contracts/cw-ics20-latest/src/testing/ibc_hooks_test.rs index 8d18327..7053f74 100644 --- a/contracts/cw-ics20-latest/src/testing/ibc_hooks_test.rs +++ b/contracts/cw-ics20-latest/src/testing/ibc_hooks_test.rs @@ -102,6 +102,7 @@ fn test_ibc_hooks_receive() { local_asset_info: asset_info.clone(), remote_decimals: 18u8, local_asset_info_decimals: 18u8, + is_mint_burn: None, }; contract_instance diff --git a/contracts/cw-ics20-latest/src/testing/ibc_tests.rs b/contracts/cw-ics20-latest/src/testing/ibc_tests.rs index 025f713..36d3d76 100644 --- a/contracts/cw-ics20-latest/src/testing/ibc_tests.rs +++ b/contracts/cw-ics20-latest/src/testing/ibc_tests.rs @@ -289,6 +289,7 @@ fn proper_checks_on_execute_native_transfer_back_to_remote() { local_asset_info: asset_info.clone(), remote_decimals: 18u8, local_asset_info_decimals: 18u8, + is_mint_burn: None, }; let _ = execute( @@ -430,6 +431,7 @@ fn proper_checks_on_execute_native_transfer_back_to_remote() { }, remote_decimals: 18u8, local_asset_info_decimals: 18u8, + is_mint_burn: None, }; execute( @@ -528,6 +530,7 @@ fn send_from_remote_to_local_receive_happy_path() { local_asset_info: asset_info.clone(), remote_decimals: 18u8, local_asset_info_decimals: 18u8, + is_mint_burn: None, }; contract_instance @@ -872,6 +875,7 @@ fn test_get_ibc_msg_evm_case() { local_asset_info: receiver_asset_info.clone(), remote_decimals, local_asset_info_decimals: asset_info_decimals, + is_mint_burn: None, }; // works with proper funds @@ -899,6 +903,7 @@ fn test_get_ibc_msg_evm_case() { asset_info: receiver_asset_info.clone(), remote_decimals, asset_info_decimals: asset_info_decimals.clone(), + is_mint_burn: false, }, }), destination_asset_info_on_orai, @@ -1031,6 +1036,7 @@ fn test_get_ibc_msg_cosmos_based_case() { local_asset_info: receiver_asset_info.clone(), remote_decimals, local_asset_info_decimals: asset_info_decimals, + is_mint_burn: None, }; let msg = ExecuteMsg::UpdateMappingPair(update.clone()); @@ -1063,6 +1069,7 @@ fn test_get_ibc_msg_cosmos_based_case() { asset_info: receiver_asset_info.clone(), remote_decimals, asset_info_decimals, + is_mint_burn: false, }, }), destination_asset_info_on_orai, @@ -1501,6 +1508,7 @@ fn test_process_ibc_msg() { }, remote_decimals: 18, asset_info_decimals: 6, + is_mint_burn: false, }, }; let local_channel_id = "channel"; @@ -1644,6 +1652,7 @@ fn test_query_pair_mapping_by_asset_info() { local_asset_info: asset_info.clone(), remote_decimals: 18, local_asset_info_decimals: 18, + is_mint_burn: None, }; // works with proper funds @@ -1727,6 +1736,7 @@ fn test_update_cw20_mapping() { local_asset_info: asset_info.clone(), remote_decimals: 18, local_asset_info_decimals: 18, + is_mint_burn: None, }; // works with proper funds @@ -1815,6 +1825,7 @@ fn test_delete_cw20_mapping() { local_asset_info: cw20_denom.clone(), remote_decimals: 18, local_asset_info_decimals: 18, + is_mint_burn: None, }; // works with proper funds @@ -2089,6 +2100,7 @@ fn proper_checks_on_execute_cw20_transfer_back_to_remote() { local_asset_info: asset_info.clone(), remote_decimals: 18u8, local_asset_info_decimals: 18u8, + is_mint_burn: None, }; let _ = execute( @@ -2214,6 +2226,7 @@ fn proper_checks_on_execute_cw20_transfer_back_to_remote() { }, remote_decimals: 18u8, local_asset_info_decimals: 18u8, + is_mint_burn: None, }; execute( @@ -2325,8 +2338,8 @@ fn test_handle_packet_refund() { }; let mapping_denom = format!("wasm.cosmos2contract/{}/{}", local_channel_id, native_denom); - let result = - handle_packet_refund(deps.as_mut().storage, sender, native_denom, amount).unwrap_err(); + let result = handle_packet_refund(deps.as_mut().storage, sender, native_denom, amount, false) + .unwrap_err(); assert_eq!( result.to_string(), "cw_ics20_latest::state::MappingMetadata not found" @@ -2341,6 +2354,7 @@ fn test_handle_packet_refund() { local_asset_info: local_asset_info.clone(), remote_decimals: 6, local_asset_info_decimals: 6, + is_mint_burn: None, }; let msg = ExecuteMsg::UpdateMappingPair(update.clone()); @@ -2350,7 +2364,7 @@ fn test_handle_packet_refund() { // now we handle packet failure. should get sub msg let result = - handle_packet_refund(deps.as_mut().storage, sender, &mapping_denom, amount).unwrap(); + handle_packet_refund(deps.as_mut().storage, sender, &mapping_denom, amount, false).unwrap(); assert_eq!( result, SubMsg::reply_on_error( @@ -2418,13 +2432,41 @@ fn test_reduce_channel_balance_ibc_receive() { let ibc_denom = "foobar"; let local_receiver = "receiver"; let mut deps = setup(&[local_channel_id], &[]); + let local_asset_info = AssetInfo::NativeToken { + denom: "orai".to_string(), + }; + + let ibc_denom_keys = format!( + "wasm.{}/{}/{}", + mock_env().contract.address.to_string(), + local_channel_id, + ibc_denom + ); + + // register mapping + let update = UpdatePairMsg { + local_channel_id: local_channel_id.to_string(), + denom: ibc_denom.to_string(), + local_asset_info: local_asset_info.clone(), + remote_decimals: 6, + local_asset_info_decimals: 6, + is_mint_burn: None, + }; + execute( + deps.as_mut(), + mock_env(), + mock_info("gov", &vec![]), + ExecuteMsg::UpdateMappingPair(update), + ) + .unwrap(); + execute( deps.as_mut(), mock_env(), mock_info(mock_env().contract.address.as_str(), &vec![]), ExecuteMsg::IncreaseChannelBalanceIbcReceive { dest_channel_id: local_channel_id.to_string(), - ibc_denom: ibc_denom.to_string(), + ibc_denom: ibc_denom_keys.to_string(), amount: amount.clone(), local_receiver: local_receiver.to_string(), }, @@ -2438,7 +2480,7 @@ fn test_reduce_channel_balance_ibc_receive() { mock_info("attacker", &vec![]), ExecuteMsg::ReduceChannelBalanceIbcReceive { src_channel_id: local_channel_id.to_string(), - ibc_denom: ibc_denom.to_string(), + ibc_denom: ibc_denom_keys.to_string(), amount: amount.clone(), local_receiver: local_receiver.to_string(), }, @@ -2453,21 +2495,21 @@ fn test_reduce_channel_balance_ibc_receive() { mock_info(mock_env().contract.address.as_str(), &vec![]), ExecuteMsg::ReduceChannelBalanceIbcReceive { src_channel_id: local_channel_id.to_string(), - ibc_denom: ibc_denom.to_string(), + ibc_denom: ibc_denom_keys.to_string(), amount: amount.clone(), local_receiver: local_receiver.to_string(), }, ) .unwrap(); let channel_state = CHANNEL_REVERSE_STATE - .load(deps.as_ref().storage, (local_channel_id, ibc_denom)) + .load(deps.as_ref().storage, (local_channel_id, &ibc_denom_keys)) .unwrap(); assert_eq!(channel_state.outstanding, Uint128::zero()); assert_eq!(channel_state.total_sent, Uint128::from(10u128)); let reply_args = REPLY_ARGS.load(deps.as_ref().storage).unwrap(); assert_eq!(reply_args.amount, amount.clone()); assert_eq!(reply_args.channel, local_channel_id); - assert_eq!(reply_args.denom, ibc_denom.to_string()); + assert_eq!(reply_args.denom, ibc_denom_keys); assert_eq!(reply_args.local_receiver, local_receiver.to_string()); } @@ -2563,6 +2605,7 @@ fn test_get_destination_info_on_orai() { local_asset_info: asset_info.clone(), remote_decimals: 18, local_asset_info_decimals: 18, + is_mint_burn: None, }; // works with proper funds @@ -2615,7 +2658,8 @@ fn test_get_destination_info_on_orai() { contract_addr: Addr::unchecked("cw20:foobar".to_string()) }, remote_decimals: 18, - asset_info_decimals: 18 + asset_info_decimals: 18, + is_mint_burn: false } }) ); From 6a6281fdcc3ac2aa0920c02ef403b11c212b3f24 Mon Sep 17 00:00:00 2001 From: trung2891 Date: Mon, 25 Mar 2024 10:44:42 +0700 Subject: [PATCH 02/10] chore: fix mint msg in refund packet --- contracts/cw-ics20-latest/src/ibc.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/contracts/cw-ics20-latest/src/ibc.rs b/contracts/cw-ics20-latest/src/ibc.rs index 88f075c..d8bd87a 100644 --- a/contracts/cw-ics20-latest/src/ibc.rs +++ b/contracts/cw-ics20-latest/src/ibc.rs @@ -1224,7 +1224,7 @@ pub fn handle_packet_refund( packet_sender: &str, packet_denom: &str, packet_amount: Uint128, - maybe_mint_burn: bool, + with_mint_burn: bool, ) -> Result { // get ibc denom mapping to get cw20 denom & from decimals in case of packet failure, we can refund the corresponding user & amount let pair_mapping = ics20_denoms().load(storage, &packet_denom)?; @@ -1235,7 +1235,8 @@ pub fn handle_packet_refund( pair_mapping.asset_info_decimals, )?; - let cosmos_msg = if maybe_mint_burn && pair_mapping.is_mint_burn { + // check if mint_burn mechanism, then mint token for packet sender, if not, send from contract + let cosmos_msg = if with_mint_burn && pair_mapping.is_mint_burn { match pair_mapping.asset_info { AssetInfo::NativeToken { denom } => { return Err(ContractError::Std(StdError::generic_err(format!( @@ -1245,7 +1246,8 @@ pub fn handle_packet_refund( } AssetInfo::Token { contract_addr } => CosmosMsg::Wasm(WasmMsg::Execute { contract_addr: contract_addr.to_string(), - msg: to_binary(&Cw20ExecuteMsg::Burn { + msg: to_binary(&Cw20ExecuteMsg::Mint { + recipient: packet_sender.to_string(), amount: local_amount, })?, funds: vec![], From 4e1e5d13dc33c5cc8377d28b8cf9043d85d457e5 Mon Sep 17 00:00:00 2001 From: trung2891 Date: Mon, 25 Mar 2024 11:11:30 +0700 Subject: [PATCH 03/10] chore: add test for handle_refund with mint burn --- .../cw-ics20-latest/src/testing/ibc_tests.rs | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/contracts/cw-ics20-latest/src/testing/ibc_tests.rs b/contracts/cw-ics20-latest/src/testing/ibc_tests.rs index 36d3d76..5b514df 100644 --- a/contracts/cw-ics20-latest/src/testing/ibc_tests.rs +++ b/contracts/cw-ics20-latest/src/testing/ibc_tests.rs @@ -2348,7 +2348,7 @@ fn test_handle_packet_refund() { // update mapping pair so that we can get refunded // cosmos based case with mapping found. Should be successful & cosmos msg is ibc send packet // add a pair mapping so we can test the happy case evm based happy case - let update = UpdatePairMsg { + let mut update = UpdatePairMsg { local_channel_id: local_channel_id.to_string(), denom: native_denom.to_string(), local_asset_info: local_asset_info.clone(), @@ -2375,6 +2375,33 @@ fn test_handle_packet_refund() { REFUND_FAILURE_ID ) ); + + // case 2: refunds with mint msg + let local_asset_info = AssetInfo::Token { + contract_addr: Addr::unchecked("token0"), + }; + update.local_asset_info = local_asset_info; + update.is_mint_burn = Some(true); + let msg = ExecuteMsg::UpdateMappingPair(update.clone()); + let info = mock_info("gov", &coins(1234567, "ucosm")); + execute(deps.as_mut(), mock_env(), info, msg.clone()).unwrap(); + let result = + handle_packet_refund(deps.as_mut().storage, sender, &mapping_denom, amount, true).unwrap(); + assert_eq!( + result, + SubMsg::reply_on_error( + CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr: "token0".to_string(), + msg: to_binary(&Cw20ExecuteMsg::Mint { + recipient: sender.to_string(), + amount + }) + .unwrap(), + funds: vec![] + }), + REFUND_FAILURE_ID + ) + ); } #[test] From d270946d63339eb1ed05019aa2c2594d641c4ee5 Mon Sep 17 00:00:00 2001 From: trung2891 Date: Mon, 25 Mar 2024 11:57:48 +0700 Subject: [PATCH 04/10] chore: add unit test for build mint/burn msg --- .../cw-ics20-latest/src/testing/ibc_tests.rs | 132 +++++++++++++++++- 1 file changed, 131 insertions(+), 1 deletion(-) diff --git a/contracts/cw-ics20-latest/src/testing/ibc_tests.rs b/contracts/cw-ics20-latest/src/testing/ibc_tests.rs index 5b514df..8aa287a 100644 --- a/contracts/cw-ics20-latest/src/testing/ibc_tests.rs +++ b/contracts/cw-ics20-latest/src/testing/ibc_tests.rs @@ -38,7 +38,8 @@ use cw20::{Cw20Coin, Cw20ExecuteMsg, Cw20ReceiveMsg}; use cw20_ics20_msg::amount::{convert_local_to_remote, Amount}; use crate::contract::{ - execute, handle_override_channel_balance, query, query_channel, query_channel_with_key, + build_burn_cw20_mapping_msg, build_mint_cw20_mapping_msg, execute, + handle_override_channel_balance, query, query_channel, query_channel_with_key, }; use crate::msg::{ AllowMsg, ChannelResponse, ConfigResponse, DeletePairMsg, ExecuteMsg, InitMsg, @@ -2708,3 +2709,132 @@ fn test_get_destination_info_on_orai() { ); assert_eq!(destination_info.1, None); } + +#[test] +fn test_build_mint_cw20_mapping_msg() { + let mut deps = setup(&["channel-3", "channel-7"], &[]); + let ibc_denom = "cosmos"; + let local_channel_id = "channel-3"; + let ibc_denom_keys = format!( + "wasm.{}/{}/{}", + mock_env().contract.address.to_string(), + local_channel_id, + ibc_denom + ); + let asset_info = AssetInfo::Token { + contract_addr: Addr::unchecked("cw20:foobar".to_string()), + }; + + let amount_local = Uint128::from(10000u128); + let receiver = "receiver"; + + // case 1: failed, not register in mapping lít + let res = build_mint_cw20_mapping_msg( + &deps.storage, + ibc_denom_keys.clone(), + amount_local, + receiver.to_string(), + ); + assert_eq!(res, Err(ContractError::NotOnMappingList)); + + // case 2: on mappinglist, but mapping mechanism is not mint burn + let mut update = UpdatePairMsg { + local_channel_id: local_channel_id.to_string(), + denom: ibc_denom.to_string(), + local_asset_info: asset_info.clone(), + remote_decimals: 18, + local_asset_info_decimals: 18, + is_mint_burn: None, + }; + let msg = ExecuteMsg::UpdateMappingPair(update.clone()); + let info = mock_info("gov", &coins(1234567, "ucosm")); + execute(deps.as_mut(), mock_env(), info, msg.clone()).unwrap(); + let res = build_mint_cw20_mapping_msg( + &deps.storage, + ibc_denom_keys.clone(), + amount_local, + receiver.to_string(), + ); + assert_eq!(res, Ok(None)); + + // case 3: got mint msg + update.is_mint_burn = Some(true); + let msg = ExecuteMsg::UpdateMappingPair(update.clone()); + let info = mock_info("gov", &coins(1234567, "ucosm")); + execute(deps.as_mut(), mock_env(), info, msg.clone()).unwrap(); + let res = build_mint_cw20_mapping_msg( + &deps.storage, + ibc_denom_keys.clone(), + amount_local, + receiver.to_string(), + ) + .unwrap(); + assert_eq!( + res, + Some(CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr: "cw20:foobar".to_string(), + msg: to_binary(&Cw20ExecuteMsg::Mint { + recipient: receiver.to_string(), + amount: amount_local + }) + .unwrap(), + funds: vec![] + })), + ); +} + +#[test] +fn test_build_burn_cw20_mapping_msg() { + let mut deps = setup(&["channel-3", "channel-7"], &[]); + let ibc_denom = "cosmos"; + let local_channel_id = "channel-3"; + let ibc_denom_keys = format!( + "wasm.{}/{}/{}", + mock_env().contract.address.to_string(), + local_channel_id, + ibc_denom + ); + let asset_info = AssetInfo::Token { + contract_addr: Addr::unchecked("cw20:foobar".to_string()), + }; + + let amount_local = Uint128::from(10000u128); + + // case 1: failed, not register in mapping lít + let res = build_burn_cw20_mapping_msg(&deps.storage, ibc_denom_keys.clone(), amount_local); + assert_eq!(res, Err(ContractError::NotOnMappingList)); + + // case 2: on mappinglist, but mapping mechanism is not mint burn + let mut update = UpdatePairMsg { + local_channel_id: local_channel_id.to_string(), + denom: ibc_denom.to_string(), + local_asset_info: asset_info.clone(), + remote_decimals: 18, + local_asset_info_decimals: 18, + is_mint_burn: None, + }; + let msg = ExecuteMsg::UpdateMappingPair(update.clone()); + let info = mock_info("gov", &coins(1234567, "ucosm")); + execute(deps.as_mut(), mock_env(), info, msg.clone()).unwrap(); + let res = build_burn_cw20_mapping_msg(&deps.storage, ibc_denom_keys.clone(), amount_local); + assert_eq!(res, Ok(None)); + + // case 3: got mint msg + update.is_mint_burn = Some(true); + let msg = ExecuteMsg::UpdateMappingPair(update.clone()); + let info = mock_info("gov", &coins(1234567, "ucosm")); + execute(deps.as_mut(), mock_env(), info, msg.clone()).unwrap(); + let res = + build_burn_cw20_mapping_msg(&deps.storage, ibc_denom_keys.clone(), amount_local).unwrap(); + assert_eq!( + res, + Some(CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr: "cw20:foobar".to_string(), + msg: to_binary(&Cw20ExecuteMsg::Burn { + amount: amount_local + }) + .unwrap(), + funds: vec![] + })), + ); +} From 8d282af2e5fe61548c065e51938b7a11e1692278 Mon Sep 17 00:00:00 2001 From: trung2891 Date: Mon, 25 Mar 2024 17:33:36 +0700 Subject: [PATCH 05/10] chore: hot fix ibc_receive_msg if return_amount is zere & add test cases --- .../artifacts/cw-ics20-latest.wasm | Bin 600002 -> 600253 bytes contracts/cw-ics20-latest/src/ibc.rs | 1 + simulate-tests/bridge-contract.spec.ts | 8 +- simulate-tests/bridge-with-mint-burn.spec.ts | 1804 +++++++++++++++++ simulate-tests/common.ts | 7 +- .../contracts-sdk/CwIcs20Latest.client.ts | 558 +++++ .../contracts-sdk/CwIcs20Latest.types.ts | 236 +++ simulate-tests/contracts-sdk/index.ts | 2 + 8 files changed, 2610 insertions(+), 6 deletions(-) create mode 100644 simulate-tests/bridge-with-mint-burn.spec.ts create mode 100644 simulate-tests/contracts-sdk/CwIcs20Latest.client.ts create mode 100644 simulate-tests/contracts-sdk/CwIcs20Latest.types.ts create mode 100644 simulate-tests/contracts-sdk/index.ts diff --git a/contracts/cw-ics20-latest/artifacts/cw-ics20-latest.wasm b/contracts/cw-ics20-latest/artifacts/cw-ics20-latest.wasm index 9a4dd0862592d75dd90d4c2fc618dfa59e0e0913..4a603d319c96aef57efbda0207d4115448e50249 100644 GIT binary patch delta 7313 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 U^M>~H`RQTVFx1zXnD^TM0RDq`p#T5? delta 7080 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 { }, relayer: relayerAddress, }); - console.dir(result, { depth: null }); const transferEvent = result.events.find( (event) => @@ -1781,7 +1781,7 @@ describe.only("IBCModule", () => { }, relayer: relayerAddress, }); - console.dir(result, { depth: null }); + const hasRelayerFee = result.events.find( (event) => event.type === "wasm" && @@ -1874,7 +1874,7 @@ describe.only("IBCModule", () => { (attr) => attr.key === "amount" && attr.value === expectedTotalFee ) ); - console.dir(result, { depth: null }); + expect(hasFees).not.toBeUndefined(); expect( result.attributes.find( diff --git a/simulate-tests/bridge-with-mint-burn.spec.ts b/simulate-tests/bridge-with-mint-burn.spec.ts new file mode 100644 index 0000000..dc29c50 --- /dev/null +++ b/simulate-tests/bridge-with-mint-burn.spec.ts @@ -0,0 +1,1804 @@ +import { Event, toBinary } from "@cosmjs/cosmwasm-stargate"; +import { Coin, coins, coin } from "@cosmjs/proto-signing"; +import { + CWSimulateApp, + GenericError, + IbcOrder, + IbcPacket, + SimulateCosmWasmClient, +} from "@oraichain/cw-simulate"; +import { Ok } from "ts-results"; +import bech32 from "bech32"; +import { readFileSync } from "fs"; +import { + OraiswapFactoryClient, + OraiswapRouterClient, + OraiswapTokenClient, + OraiswapPairClient, + OraiswapOracleClient, +} from "@oraichain/oraidex-contracts-sdk"; +// import { CwIcs20LatestClient } from "@oraichain/common-contracts-sdk"; +import { CwIcs20LatestClient } from "./contracts-sdk/CwIcs20Latest.client"; +import * as oraidexArtifacts from "@oraichain/oraidex-contracts-build"; +import { FungibleTokenPacketData } from "cosmjs-types/ibc/applications/transfer/v2/packet"; +import { + deployIcs20Token, + deployToken, + senderAddress as oraiSenderAddress, + senderAddress, +} from "./common"; +import { oraib2oraichain, toAmount } from "@oraichain/oraidex-common"; +import { ORAI } from "@oraichain/oraidex-common"; +import { + AssetInfo, + TransferBackMsg, +} from "@oraichain/common-contracts-sdk/build/CwIcs20Latest.types"; +import { toDisplay } from "@oraichain/oraidex-common"; +import { parseToIbcWasmMemo } from "./proto-gen"; + +let cosmosChain: CWSimulateApp; +// oraichain support cosmwasm +let oraiClient: SimulateCosmWasmClient; + +const bobAddress = "orai1ur2vsjrjarygawpdwtqteaazfchvw4fg6uql76"; +const bobAddressEth = "0x8754032Ac7966A909e2E753308dF56bb08DabD69"; +const bridgeReceiver = "tron-testnet0x3C5C6b570C1DA469E8B24A2E8Ed33c278bDA3222"; +const routerContractAddress = "placeholder"; // we will update the contract config later when we need to deploy the actual router contract +const converterContractAddress = "converter"; // we will update the contract config later when we need to deploy the actual converter contract +const cosmosSenderAddress = bech32.encode( + "cosmos", + bech32.decode(oraiSenderAddress).words +); +const relayerAddress = "orai1704r4dhuwdqvt7vs35m0360py6ep6cwwxeyfxn"; +const oraibridgeSenderAddress = bech32.encode( + "oraib", + bech32.decode(oraiSenderAddress).words +); +console.log({ cosmosSenderAddress }); +const ibcTransferAmount = "100000000"; +const initialBalanceAmount = "10000000000000"; + +describe.only("IBCModuleWithMintBurn", () => { + let oraiPort: string; + let oraiIbcDenom: string = + "tron-testnet0xA325Ad6D9c92B55A3Fc5aD7e412B1518F96441C0"; + let airiIbcDenom: string = + "tron-testnet0x7e2A35C746F2f7C240B664F1Da4DD100141AE71F"; + let usdtIbcDenom: string = + "tron-testnet0xdac17f958d2ee523a2206206994597c13d831ec7"; + let AtomDenom = + "ibc/A2E2EEC9057A4A1C2C0A6A4C78B0239118DF5F278830F50B4A6BDD7A66506B78"; + let atomChannel = "channel-15"; + let cosmosPort: string = "transfer"; + let channel = "channel-0"; + let ics20Contract: CwIcs20LatestClient; + let airiToken: OraiswapTokenClient; + let packetData = { + src: { + port_id: cosmosPort, + channel_id: channel, + }, + dest: { + port_id: oraiPort, + channel_id: channel, + }, + sequence: 27, + timeout: { + block: { + revision: 1, + height: 12345678, + }, + }, + }; + beforeEach(async () => { + // reset state for every test + cosmosChain = new CWSimulateApp({ + chainId: "cosmoshub-4", + bech32Prefix: "cosmos", + }); + + oraiClient = new SimulateCosmWasmClient({ + chainId: "Oraichain", + bech32Prefix: ORAI, + metering: process.env.METERING === "true", + }); + + ics20Contract = await deployIcs20Token(oraiClient, { + swap_router_contract: routerContractAddress, + converter_contract: converterContractAddress, + }); + oraiPort = "wasm." + ics20Contract.contractAddress; + packetData.dest.port_id = oraiPort; + + // init cw20 AIRI token + airiToken = await deployToken(oraiClient, { + decimals: 6, + symbol: "AIRI", + name: "Airight token", + initial_balances: [], + minter: ics20Contract.contractAddress, + }); + + // init ibc channel between two chains + oraiClient.app.ibc.relay( + channel, + oraiPort, + channel, + cosmosPort, + cosmosChain + ); + await cosmosChain.ibc.sendChannelOpen({ + open_init: { + channel: { + counterparty_endpoint: { + port_id: oraiPort, + channel_id: channel, + }, + endpoint: { + port_id: cosmosPort, + channel_id: channel, + }, + order: IbcOrder.Unordered, + version: "ics20-1", + connection_id: "connection-0", + }, + }, + }); + + await cosmosChain.ibc.sendChannelConnect({ + open_ack: { + channel: { + counterparty_endpoint: { + port_id: oraiPort, + channel_id: channel, + }, + endpoint: { + port_id: cosmosPort, + channel_id: channel, + }, + order: IbcOrder.Unordered, + version: "ics20-1", + connection_id: "connection-0", + }, + counterparty_version: "ics20-1", + }, + }); + + cosmosChain.ibc.addMiddleWare((msg, app) => { + const data = msg.data.packet as IbcPacket; + if (Number(data.timeout.timestamp) < cosmosChain.time) { + throw new GenericError("timeout at " + data.timeout.timestamp); + } + }); + // topup + oraiClient.app.bank.setBalance( + ics20Contract.contractAddress, + coins(initialBalanceAmount, ORAI) + ); + + await ics20Contract.updateMappingPair({ + localAssetInfo: { + token: { + contract_addr: airiToken.contractAddress, + }, + }, + localAssetInfoDecimals: 6, + denom: airiIbcDenom, + remoteDecimals: 6, + localChannelId: channel, + isMintBurn: true, + }); + }); + + it("mint-burn-demo-getting-channel-state-ibc-wasm-should-increase-balances-and-total-sent", async () => { + // fixture. Setup everything from the ics 20 contract to ibc relayer + const oraiClient = new SimulateCosmWasmClient({ + chainId: "Oraichain", + bech32Prefix: ORAI, + metering: process.env.METERING === "true", + }); + + const ics20Contract = await deployIcs20Token(oraiClient, { + swap_router_contract: routerContractAddress, + converter_contract: converterContractAddress, + }); + const oraiPort = "wasm." + ics20Contract.contractAddress; + let newPacketData = { + src: { + port_id: cosmosPort, + channel_id: channel, + }, + dest: { + port_id: oraiPort, + channel_id: channel, + }, + sequence: 27, + timeout: { + block: { + revision: 1, + height: 12345678, + }, + }, + }; + newPacketData.dest.port_id = oraiPort; + + // init cw20 AIRI token + const airiToken = await deployToken(oraiClient, { + decimals: 6, + symbol: "AIRI", + name: "Airight token", + initial_balances: [ + { + address: ics20Contract.contractAddress, + amount: initialBalanceAmount, + }, + ], + }); + + // init ibc channel between two chains + oraiClient.app.ibc.relay( + channel, + oraiPort, + channel, + cosmosPort, + cosmosChain + ); + await cosmosChain.ibc.sendChannelOpen({ + open_init: { + channel: { + counterparty_endpoint: { + port_id: oraiPort, + channel_id: channel, + }, + endpoint: { + port_id: cosmosPort, + channel_id: channel, + }, + order: IbcOrder.Unordered, + version: "ics20-1", + connection_id: "connection-0", + }, + }, + }); + + await cosmosChain.ibc.sendChannelConnect({ + open_ack: { + channel: { + counterparty_endpoint: { + port_id: oraiPort, + channel_id: channel, + }, + endpoint: { + port_id: cosmosPort, + channel_id: channel, + }, + order: IbcOrder.Unordered, + version: "ics20-1", + connection_id: "connection-0", + }, + counterparty_version: "ics20-1", + }, + }); + + cosmosChain.ibc.addMiddleWare((msg, app) => { + const data = msg.data.packet as IbcPacket; + if (Number(data.timeout.timestamp) < cosmosChain.time) { + throw new GenericError("timeout at " + data.timeout.timestamp); + } + }); + // topup + await ics20Contract.updateMappingPair({ + localAssetInfo: { + token: { + contract_addr: airiToken.contractAddress, + }, + }, + localAssetInfoDecimals: 6, + denom: airiIbcDenom, + remoteDecimals: 6, + localChannelId: channel, + }); + + const icsPackage: FungibleTokenPacketData = { + amount: ibcTransferAmount, + denom: airiIbcDenom, + receiver: bobAddress, + sender: cosmosSenderAddress, + memo: "", + }; + // transfer from cosmos to oraichain, should pass. This should increase the balances & total sent + await cosmosChain.ibc.sendPacketReceive({ + packet: { + data: toBinary(icsPackage), + ...newPacketData, + }, + relayer: relayerAddress, + }); + + const { channels } = await ics20Contract.listChannels(); + for (let channel of channels) { + const { balances } = await ics20Contract.channel({ id: channel.id }); + console.log(balances); + for (let balance of balances) { + if ("native" in balance) { + const pairMapping = await ics20Contract.pairMapping({ + key: balance.native.denom, + }); + const { balance: channelBalance } = + await ics20Contract.channelWithKey({ + channelId: channel.id, + denom: balance.native.denom, + }); + if ("native" in channelBalance) { + const trueBalance = toDisplay( + channelBalance.native.amount, + pairMapping.pair_mapping.remote_decimals + ); + expect(trueBalance).toEqual( + parseInt(ibcTransferAmount) / + 10 ** pairMapping.pair_mapping.remote_decimals + ); + } + } else { + // do nothing because currently we dont have any cw20 balance in the channel + } + } + } + }); + + // TODO: test with native_token + it.each([ + [ + false, + { + native_token: { + denom: ORAI, + }, + }, + ibcTransferAmount, + oraiIbcDenom, + coins(ibcTransferAmount, ORAI), + "cw-ics20-success-should-increase-native-balance-remote-to-local", + ], + [ + false, + null, + ibcTransferAmount, + oraiIbcDenom, + [], + "cw-ics20-fail-no-pair-mapping-should-not-send-balance-remote-to-local", + ], + [ + false, + { + native_token: { + denom: ORAI, + }, + }, + "10000000000001", + oraiIbcDenom, + [], + "cw-ics20-fail-transfer-native-fail-insufficient-funds-should-not-send-balance-remote-to-local", + ], + [ + true, + { + token: { + contract_addr: "orai18cvw806fj5n7xxz06ak8vjunveeks4zzzn37cu", // has to hard-code address airi due to jest issue: https://github.com/facebook/jest/issues/6888 + }, + }, + ibcTransferAmount, + airiIbcDenom, + [{ amount: ibcTransferAmount, denom: "" }], + "cw-ics20-success-transfer-cw20-should-increase-cw20-balance-remote-to-local", + ], + ])( + "mint-burn-bridge-test-cw-ics20-transfer-remote-to-local-given %j %s %s should return expected amount %j", //reference: https://jestjs.io/docs/api#1-testeachtablename-fn-timeout + async ( + isMintBurn: boolean, + assetInfo: AssetInfo, + transferAmount: string, + transferDenom: string, + expectedBalance: Coin[], + _name: string + ) => { + // create mapping + if (assetInfo) { + const pair = { + localAssetInfo: assetInfo, + localAssetInfoDecimals: 6, + denom: transferDenom, + remoteDecimals: 6, + localChannelId: channel, + isMintBurn, + }; + await ics20Contract.updateMappingPair(pair); + } + const icsPackage: FungibleTokenPacketData = { + amount: transferAmount, + denom: transferDenom, + receiver: bobAddress, + sender: cosmosSenderAddress, + memo: "", + }; + await cosmosChain.ibc.sendPacketReceive({ + packet: { + data: toBinary(icsPackage), + ...packetData, + }, + relayer: relayerAddress, + }); + + if (assetInfo && (assetInfo as any).token) { + const bobBalance = await airiToken.balance({ address: bobAddress }); + console.log("bob balance contract address: ", bobBalance); + expect(bobBalance.balance).toEqual(expectedBalance[0].amount); + return; + } + const bobBalance = oraiClient.app.bank.getBalance(icsPackage.receiver); + expect(bobBalance).toMatchObject(expectedBalance); + } + ); + + it("mint-burn-cw-ics20-success-cw20-should-transfer-balance-to-ibc-wasm-contract-local-to-remote", async () => { + let ibcWasmAiriBalance = await airiToken.balance({ + address: ics20Contract.contractAddress, + }); + expect(ibcWasmAiriBalance.balance).toEqual("0"); + // now send ibc package + const icsPackage: FungibleTokenPacketData = { + amount: ibcTransferAmount, + denom: airiIbcDenom, + receiver: bobAddress, + sender: cosmosSenderAddress, + memo: "", + }; + // transfer from cosmos to oraichain, should pass + await cosmosChain.ibc.sendPacketReceive({ + packet: { + data: toBinary(icsPackage), + ...packetData, + }, + relayer: relayerAddress, + }); + + const transferBackMsg: TransferBackMsg = { + local_channel_id: channel, + remote_address: cosmosSenderAddress, + remote_denom: airiIbcDenom, + }; + airiToken.sender = bobAddress; + await airiToken.send({ + amount: ibcTransferAmount, + contract: ics20Contract.contractAddress, + msg: Buffer.from(JSON.stringify(transferBackMsg)).toString("base64"), + }); + ibcWasmAiriBalance = await airiToken.balance({ + address: ics20Contract.contractAddress, + }); + expect(ibcWasmAiriBalance.balance).toEqual("0"); + }); + + it.each([ + [ + parseToIbcWasmMemo("", "", ""), + ibcTransferAmount, + "empty-memo-should-fallback-to-transfer-to-receiver", + ], + [ + parseToIbcWasmMemo(bobAddress, "", ""), + ibcTransferAmount, + "only-receiver-memo-should-fallback-to-transfer-to-receiver", + ], + [ + parseToIbcWasmMemo(bobAddress, oraib2oraichain, ""), + ibcTransferAmount, + "receiver-and-channel-memo-should-fallback-to-transfer-to-receiver", + ], + ])( + "mint-burn-cw-ics20-test-single-step-invalid-dest-denom-memo-remote-to-local-given %s should-get-expected-amount %s", + async (memo: string, expectedAmount: string, _name: string) => { + // now send ibc package + const icsPackage: FungibleTokenPacketData = { + amount: ibcTransferAmount, + denom: airiIbcDenom, + receiver: bobAddress, + sender: cosmosSenderAddress, + memo, + }; + // transfer from cosmos to oraichain, should pass + await cosmosChain.ibc.sendPacketReceive({ + packet: { + data: toBinary(icsPackage), + ...packetData, + }, + relayer: relayerAddress, + }); + const ibcWasmAiriBalance = await airiToken.balance({ + address: bobAddress, + }); + expect(ibcWasmAiriBalance.balance).toEqual(expectedAmount); + } + ); + + describe("mint-burn-cw-ics20-test-single-step-swap-to-tokens", () => { + let factoryContract: OraiswapFactoryClient; + let routerContract: OraiswapRouterClient; + let usdtToken: OraiswapTokenClient; + let oracleContract: OraiswapOracleClient; + let assetInfos: AssetInfo[]; + let lpId: number; + let icsPackage: FungibleTokenPacketData = { + amount: ibcTransferAmount, + denom: airiIbcDenom, + receiver: bobAddress, + sender: cosmosSenderAddress, + memo: "", + }; + const findWasmEvent = (events: Event[], key: string, value: string) => + events.find( + (event) => + event.type === "wasm" && + event.attributes.find( + (attr) => attr.key === key && attr.value === value + ) + ); + beforeEach(async () => { + assetInfos = [ + { native_token: { denom: ORAI } }, + { token: { contract_addr: airiToken.contractAddress } }, + ]; + // upload pair & lp token code id + const { codeId: pairCodeId } = await oraiClient.upload( + oraiSenderAddress, + readFileSync(oraidexArtifacts.getContractDir("oraiswap_pair")), + "auto" + ); + const { codeId: lpCodeId } = await oraiClient.upload( + oraiSenderAddress, + readFileSync(oraidexArtifacts.getContractDir("oraiswap_token")), + "auto" + ); + lpId = lpCodeId; + // deploy another cw20 for oraiswap testing + const { contractAddress: usdtAddress } = await oraiClient.instantiate( + oraiSenderAddress, + lpCodeId, + { + decimals: 6, + symbol: "USDT", + name: "USDT token", + initial_balances: [], + mint: { + minter: ics20Contract.contractAddress, + }, + }, + "cw20-usdt" + ); + usdtToken = new OraiswapTokenClient( + oraiClient, + oraiSenderAddress, + usdtAddress + ); + // deploy oracle addr + const { contractAddress: oracleAddress } = + await oraidexArtifacts.deployContract( + oraiClient, + oraiSenderAddress, + {}, + "oraiswap-oracle", + "oraiswap_oracle" + ); + // deploy factory contract + oracleContract = new OraiswapOracleClient( + oraiClient, + oraiSenderAddress, + oracleAddress + ); + + await oracleContract.updateTaxRate({ rate: "0" }); + await oracleContract.updateTaxCap({ denom: AtomDenom, cap: "100000" }); + const { contractAddress: factoryAddress } = + await oraidexArtifacts.deployContract( + oraiClient, + oraiSenderAddress, + { + commission_rate: "0", + oracle_addr: oracleAddress, + pair_code_id: pairCodeId, + token_code_id: lpCodeId, + }, + "oraiswap-factory", + "oraiswap_factory" + ); + + const { contractAddress: routerAddress } = + await oraidexArtifacts.deployContract( + oraiClient, + oraiSenderAddress, + { + factory_addr: factoryAddress, + factory_addr_v2: factoryAddress, + }, + "oraiswap-router", + "oraiswap_router" + ); + factoryContract = new OraiswapFactoryClient( + oraiClient, + oraiSenderAddress, + factoryAddress + ); + routerContract = new OraiswapRouterClient( + oraiClient, + oraiSenderAddress, + routerAddress + ); + + // set correct router contract to prepare for the tests + await ics20Contract.updateConfig({ swapRouterContract: routerAddress }); + // create mapping + await ics20Contract.updateMappingPair({ + localAssetInfo: { + token: { + contract_addr: airiToken.contractAddress, + }, + }, + localAssetInfoDecimals: 6, + denom: airiIbcDenom, + remoteDecimals: 6, + localChannelId: channel, + isMintBurn: true, + }); + await ics20Contract.updateMappingPair({ + localAssetInfo: { + token: { + contract_addr: usdtToken.contractAddress, + }, + }, + localAssetInfoDecimals: 6, + denom: usdtIbcDenom, + remoteDecimals: 6, + localChannelId: channel, + isMintBurn: true, + }); + await factoryContract.createPair({ + assetInfos, + }); + await factoryContract.createPair({ + assetInfos: [ + assetInfos[0], + { token: { contract_addr: usdtToken.contractAddress } }, + ], + }); + await factoryContract.createPair({ + assetInfos: [ + assetInfos[0], + { + native_token: { + denom: AtomDenom, + }, + }, + ], + }); + + const firstPairInfo = await factoryContract.pair({ + assetInfos, + }); + const secondPairInfo = await factoryContract.pair({ + assetInfos: [ + assetInfos[0], + { token: { contract_addr: usdtToken.contractAddress } }, + ], + }); + const thirdPairInfo = await factoryContract.pair({ + assetInfos: [ + assetInfos[0], + { + native_token: { + denom: AtomDenom, + }, + }, + ], + }); + + // mint lots of orai, airi for the pair contracts to mock provide lp + // here, ratio is 1:1 => 1 AIRI = 1 ORAI + oraiClient.app.bank.setBalance( + firstPairInfo.contract_addr, + coins(initialBalanceAmount, ORAI) + ); + + airiToken.sender = ics20Contract.contractAddress; + await airiToken.mint({ + amount: initialBalanceAmount, + recipient: firstPairInfo.contract_addr, + }); + oraiClient.app.bank.setBalance( + secondPairInfo.contract_addr, + coins(initialBalanceAmount, ORAI) + ); + + usdtToken.sender = ics20Contract.contractAddress; + await usdtToken.mint({ + amount: initialBalanceAmount, + recipient: secondPairInfo.contract_addr, + }); + oraiClient.app.bank.setBalance(thirdPairInfo.contract_addr, [ + coin(initialBalanceAmount, ORAI), + coin(initialBalanceAmount, AtomDenom), + ]); + }); + + it("mint-burn-test-simulate-withdraw-liquidity", async () => { + // deploy another cw20 for oraiswap testing + let scatomToken: OraiswapTokenClient; + const atomIbc = + "ibc/A2E2EEC9057A4A1C2C0A6A4C78B0239118DF5F278830F50B4A6BDD7A66506B78"; + const { contractAddress: scatomAddress } = await oraiClient.instantiate( + oraiSenderAddress, + lpId, + { + decimals: 6, + symbol: "scATOM", + name: "scATOM token", + initial_balances: [ + { address: oraiSenderAddress, amount: initialBalanceAmount }, + ], + mint: { + minter: oraiSenderAddress, + }, + }, + "cw20-scatom" + ); + scatomToken = new OraiswapTokenClient( + oraiClient, + oraiSenderAddress, + scatomAddress + ); + const assetInfos = [ + { native_token: { denom: atomIbc } }, + { token: { contract_addr: scatomAddress } }, + ]; + await factoryContract.createPair({ + assetInfos, + }); + const firstPairInfo = await factoryContract.pair({ + assetInfos, + }); + const pairAddress = firstPairInfo.contract_addr; + await scatomToken.increaseAllowance({ + amount: initialBalanceAmount, + spender: pairAddress, + }); + oraiClient.app.bank.setBalance( + pairAddress, + coins(initialBalanceAmount, atomIbc) + ); + oraiClient.app.bank.setBalance( + oraiSenderAddress, + coins(initialBalanceAmount, atomIbc) + ); + + const pairContract = new OraiswapPairClient( + oraiClient, + oraiSenderAddress, + pairAddress + ); + await pairContract.provideLiquidity( + { + assets: [ + { + amount: "10000000", + info: { token: { contract_addr: scatomAddress } }, + }, + { amount: "10000000", info: { native_token: { denom: atomIbc } } }, + ], + }, + "auto", + undefined, + [{ denom: atomIbc, amount: "10000000" }] + ); + // query liquidity balance + const lpToken = new OraiswapTokenClient( + oraiClient, + oraiSenderAddress, + firstPairInfo.liquidity_token + ); + const result = await lpToken.balance({ address: oraiSenderAddress }); + + // set tax rate + await oracleContract.updateTaxRate({ rate: "0.003" }); + await oracleContract.updateTaxCap({ denom: atomIbc, cap: "1000000" }); + + // now we withdraw lp + await lpToken.send({ + amount: "1000", + contract: pairAddress, + msg: Buffer.from(JSON.stringify({ withdraw_liquidity: {} })).toString( + "base64" + ), + }); + }); + + it("mint-burn-cw-ics20-test-simulate-swap-ops-mock-pair-contract", async () => { + const simulateResult = await routerContract.simulateSwapOperations({ + offerAmount: "1", + operations: [ + { + orai_swap: { + offer_asset_info: assetInfos[1], + ask_asset_info: assetInfos[0], + }, + }, + { + orai_swap: { + offer_asset_info: assetInfos[0], + ask_asset_info: { + token: { contract_addr: usdtToken.contractAddress }, + }, + }, + }, + ], + }); + expect(simulateResult.amount).toEqual("1"); + }); + + it.each<[string, string, string]>([ + [ + parseToIbcWasmMemo(bobAddress, "", "orai"), + bobAddress, + "Generic error: Destination channel empty in build ibc msg", + ], + [ + parseToIbcWasmMemo( + "not-evm-based-nor-cosmos-based", + channel, + oraiIbcDenom + ), + bobAddress, + "Generic error: The destination info is neither evm or cosmos based", + ], + ])( + "mint-burn-cw-ics20-test-single-step-native-token-swap-operations-to-dest-denom memo %s expected recipient %s", + async ( + memo: string, + expectedRecipient: string, + expectedIbcErrorMsg: string + ) => { + await ics20Contract.updateMappingPair({ + localAssetInfo: { + native_token: { + denom: ORAI, + }, + }, + localAssetInfoDecimals: 6, + denom: oraiIbcDenom, + remoteDecimals: 6, + localChannelId: channel, + isMintBurn: false, + }); + + // now send ibc package + icsPackage.memo = memo; + console.log(icsPackage); + // transfer from cosmos to oraichain, should pass + const result = await cosmosChain.ibc.sendPacketReceive({ + packet: { + data: toBinary(icsPackage), + ...packetData, + }, + relayer: relayerAddress, + }); + + const bobBalance = oraiClient.app.bank.getBalance(expectedRecipient); + expect(bobBalance.length).toBeGreaterThan(0); + expect(bobBalance[0].denom).toEqual(ORAI); + expect(parseInt(bobBalance[0].amount)).toBeGreaterThan(0); + const transferEvent = result.events.find( + (event) => + event.type === "transfer" && + event.attributes.find( + (attr) => + attr.key === "recipient" && attr.value === expectedRecipient + ) + ); + expect(transferEvent).not.toBeUndefined(); + const ibcErrorMsg = result.attributes.find( + (attr) => attr.key === "ibc_error_msg" + ); + expect(ibcErrorMsg).not.toBeUndefined(); + expect(ibcErrorMsg.value).toEqual(expectedIbcErrorMsg); + } + ); + + it.each([ + [ + `${bobAddress}`, + "orai1n6fwuamldz6mv5f3qwe9296pudjjemhmkfcgc3", + bobAddress, + "Generic error: Destination channel empty in build ibc msg", + ], // hard-coded usdt address + [ + `${bobAddress}`, + "orai18cvw806fj5n7xxz06ak8vjunveeks4zzzn37cu", + bobAddress, + "Generic error: Destination channel empty in build ibc msg", + ], // edge case, dest denom is also airi + ])( + "mint-burn-cw-ics20-test-single-step-cw20-token-swap-operations-to-dest-denom memo %s dest denom %s expected recipient %s", + async ( + destReceiver: string, + destDenom: string, + expectedRecipient: string, + expectedIbcErrorMsg: string + ) => { + // now send ibc package + icsPackage.memo = parseToIbcWasmMemo(destReceiver, "", destDenom); + // transfer from cosmos to oraichain, should pass + const result = await cosmosChain.ibc.sendPacketReceive({ + packet: { + data: toBinary(icsPackage), + ...packetData, + }, + relayer: relayerAddress, + }); + + const token = new OraiswapTokenClient( + oraiClient, + oraiSenderAddress, + destDenom + ); + const cw20Balance = await token.balance({ address: expectedRecipient }); + expect(parseInt(cw20Balance.balance)).toBeGreaterThan(1000); + expect( + result.attributes.find((attr) => attr.key === "ibc_error_msg").value + ).toEqual(expectedIbcErrorMsg); + } + ); + + it("mint-burn-cw-ics20-test-single-step-cw20-token-swap-operations-to-dest-denom-FAILED-cannot-simulate-swap", async () => { + // now send ibc package + + // => dest token on Orai = ibc/EB7094899ACFB7A6F2A67DB084DEE2E9A83DEFAA5DEF92D9A9814FFD9FF673FA + icsPackage.memo = parseToIbcWasmMemo(bobAddressEth, "channel-0", "foo"); + // transfer from cosmos to oraichain, should pass + const result = await cosmosChain.ibc.sendPacketReceive({ + packet: { + data: toBinary(icsPackage), + ...packetData, + }, + relayer: relayerAddress, + }); + expect( + result.attributes.find((attr) => attr.key === "ibc_error_msg").value + ).toEqual( + 'Cannot simulate swap with ops: [OraiSwap { offer_asset_info: Token { contract_addr: Addr("orai18cvw806fj5n7xxz06ak8vjunveeks4zzzn37cu") }, ask_asset_info: NativeToken { denom: "orai" } }, OraiSwap { offer_asset_info: NativeToken { denom: "orai" }, ask_asset_info: NativeToken { denom: "ibc/EB7094899ACFB7A6F2A67DB084DEE2E9A83DEFAA5DEF92D9A9814FFD9FF673FA" } }] with error: "Error parsing into type oraiswap::router::SimulateSwapOperationsResponse: unknown field `ok`, expected `amount`"' + ); + }); + + it("mint-burn-cw-ics20-test-single-step-cw20-FAILED-IBC_TRANSFER_NATIVE_ERROR_ID-ack-SUCCESS", async () => { + // fixture + // icsPackage.memo = `unknown-channel/${bobAddress}:${usdtToken.contractAddress}`; + + // dest denom on orai: ibc/79E5EC9A42F2FC01B2BA609F13C985393779BE5153E01D24E79C2681B0DFB592 + icsPackage.memo = parseToIbcWasmMemo(bobAddress, "channel-15", "uatom"); + icsPackage.amount = initialBalanceAmount; + + // transfer from cosmos to oraichain, should pass + const result = await cosmosChain.ibc.sendPacketReceive({ + packet: { + data: toBinary(icsPackage), + ...packetData, + }, + relayer: relayerAddress, + }); + console.log(result); + // refunding also fails because of not enough balance to refund + expect( + findWasmEvent(result.events, "action", "ibc_transfer_native_error_id") + ).not.toBeUndefined(); + // ack should be successful + expect(result.acknowledgement).toEqual( + Buffer.from('{"result":"MQ=="}').toString("base64") + ); + expect( + findWasmEvent(result.events, "undo_increase_channel", channel) + ).toBeUndefined(); + + // other types of reply id must not be called + expect( + findWasmEvent(result.events, "action", "swap_ops_failure_id") + ).toBeUndefined(); + expect( + findWasmEvent(result.events, "action", "native_receive_id") + ).toBeUndefined(); + expect( + findWasmEvent(result.events, "action", "follow_up_failure_id") + ).toBeUndefined(); + expect( + findWasmEvent(result.events, "action", "refund_failure_id") + ).toBeUndefined(); + + // for ibc native transfer case, we wont have refund either + expect( + result.events.find( + (ev) => + ev.type === "wasm" && + ev.attributes.find( + (attr) => attr.key === "action" && attr.value === "transfer" + ) && + ev.attributes.find( + (attr) => attr.key === "to" && attr.value === bobAddress + ) + ) + ).toBeUndefined(); + }); + + it("mint-burn-cw-ics20-test-single-step-cw20-success-FOLLOW_UP_IBC_SEND_FAILURE_ID-must-not-have-SWAP_OPS_FAILURE_ID-or-on_packet_failure-ack-SUCCESS", async () => { + // fixture + // icsPackage.memo = `${channel}/${bobAddress}:${airiToken.contractAddress}`; + icsPackage.memo = parseToIbcWasmMemo(bobAddress, channel, airiIbcDenom); + icsPackage.amount = initialBalanceAmount; + // transfer from cosmos to oraichain, should pass + const result = await cosmosChain.ibc.sendPacketReceive({ + packet: { + data: toBinary(icsPackage), + ...packetData, + }, + relayer: relayerAddress, + }); + // all id types of reply id must not be called, especially swap_ops_failure_id + expect( + findWasmEvent(result.events, "action", "swap_ops_failure_id") + ).toBeUndefined(); + expect( + findWasmEvent(result.events, "action", "native_receive_id") + ).toBeUndefined(); + expect( + findWasmEvent(result.events, "action", "follow_up_failure_id") + ).toBeUndefined(); + expect( + findWasmEvent(result.events, "action", "refund_failure_id") + ).toBeUndefined(); + expect( + findWasmEvent(result.events, "action", "ibc_transfer_native_error_id") + ).toBeUndefined(); + expect( + findWasmEvent(result.events, "action", "acknowledge") + ).toBeUndefined(); + expect( + findWasmEvent(result.events, "undo_reduce_channel", channel) + ).toBeUndefined(); + // ack should be successful + expect(result.acknowledgement).toEqual( + Buffer.from('{"result":"MQ=="}').toString("base64") + ); + + // for ibc native transfer case, we wont have refund either + expect( + result.events.find( + (ev) => + ev.type === "wasm" && + ev.attributes.find( + (attr) => attr.key === "action" && attr.value === "transfer" + ) && + ev.attributes.find( + (attr) => attr.key === "to" && attr.value === bobAddress + ) + ) + ).toBeUndefined(); + }); + + it.each([ + [channel, "abcd", usdtIbcDenom], // hard-coded usdt address + [channel, "0x", airiIbcDenom], + [channel, "0xabcd", usdtIbcDenom], + [channel, "tron-testnet0xabcd", airiIbcDenom], // bad evm address case + ])( + "mint-burn-cw-ics20-test-single-step-has-ibc-msg-dest-fail memo %s dest denom %s expected error", + async (destChannel: string, destReceiver: string, destDenom: string) => { + // now send ibc package + // icsPackage.memo = `${destChannel}/${destReceiver}:${destDenom}`; + icsPackage.memo = parseToIbcWasmMemo( + destReceiver, + destChannel, + destDenom + ); + // transfer from cosmos to oraichain, should pass + const result = await cosmosChain.ibc.sendPacketReceive({ + packet: { + data: toBinary(icsPackage), + ...packetData, + }, + relayer: relayerAddress, + }); + const ibcEvent = result.events.find( + (event) => + event.type === "transfer" && + event.attributes.find((attr) => attr.key === "channel") + ); + // get swap operation event + expect(ibcEvent).toBeUndefined(); + const ibcErrorMsg = result.attributes.find( + (attr) => + attr.key === "ibc_error_msg" && + attr.value === + "Generic error: The destination info is neither evm or cosmos based" + ); + expect(ibcErrorMsg).not.toBeUndefined(); + } + ); + + it.each([ + [channel, bridgeReceiver, airiIbcDenom], // hard-coded airi + ])( + "mint-burn-cw-ics20-test-single-step-has-ibc-msg-dest-receiver-evm-based memo %s dest denom %s expected recipient %s", + async (destChannel: string, destReceiver: string, destDenom: string) => { + // now send ibc package + // icsPackage.memo = `${destChannel}/${destReceiver}:${destDenom}`; + icsPackage.memo = parseToIbcWasmMemo( + destReceiver, + destChannel, + destDenom + ); + + // transfer from cosmos to oraichain, should pass + let result = await cosmosChain.ibc.sendPacketReceive({ + packet: { + data: toBinary(icsPackage), + ...packetData, + }, + relayer: relayerAddress, + }); + const sendPacketEvent = result.events.find( + (event) => event.type === "send_packet" + ); + expect(sendPacketEvent).not.toBeUndefined(); + const packetHex = sendPacketEvent.attributes.find( + (attr) => attr.key === "packet_data_hex" + ).value; + expect(packetHex).not.toBeUndefined(); + const packet = JSON.parse( + Buffer.from(packetHex, "hex").toString("ascii") + ); + expect(packet.receiver).toEqual(icsPackage.sender); + expect(packet.sender).toEqual(ics20Contract.contractAddress); + // expect(packet.memo).toEqual(ics20Contract.contractAddress); + + // pass 1 day with 86_400 seconds + cosmosChain.store.tx((setter) => + Ok(setter("time")(cosmosChain.time + 86_400 * 1e9)) + ); + + // transfer from cosmos to oraichain, should pass + result = await cosmosChain.ibc.sendPacketReceive({ + packet: { + data: toBinary(icsPackage), + ...packetData, + }, + relayer: relayerAddress, + }); + // expect( + // flatten(result.events.map((e) => e.attributes)).find((a) => a.key === 'error_follow_up_msgs').value + // ).toContain('Generic error: timeout at'); + } + ); + + it("mint-burn-cw-ics20-test-single-step-ibc-msg-map-with-fee-denom-orai-and-airi-destination-denom-should-swap-normally", async () => { + await ics20Contract.updateMappingPair({ + localAssetInfo: { + native_token: { + denom: ORAI, + }, + }, + localAssetInfoDecimals: 6, + denom: oraiIbcDenom, + remoteDecimals: 6, + localChannelId: channel, + }); + + let packetData = { + src: { + port_id: cosmosPort, + channel_id: channel, + }, + dest: { + port_id: oraiPort, + channel_id: channel, + }, + sequence: 27, + timeout: { + block: { + revision: 1, + height: 12345678, + }, + }, + }; + const icsPackage: FungibleTokenPacketData = { + amount: ibcTransferAmount, + denom: oraiIbcDenom, + receiver: bobAddress, + sender: cosmosSenderAddress, + // memo: `${bobAddress}:${airiToken.contractAddress}`, + memo: parseToIbcWasmMemo(bobAddress, "", airiToken.contractAddress), + }; + // transfer from cosmos to oraichain, should pass + let result = await cosmosChain.ibc.sendPacketReceive({ + packet: { + data: toBinary(icsPackage), + ...packetData, + }, + relayer: relayerAddress, + }); + + const swapEvent = result.events.find( + (event) => + event.type === "wasm" && + event.attributes.find((attr) => attr.value === "swap") + ); + expect( + swapEvent.attributes.filter( + (attr) => attr.key === "offer_asset" && attr.value === ORAI + ).length + ).toBeGreaterThan(0); + expect( + swapEvent.attributes.filter( + (attr) => + attr.key === "ask_asset" && attr.value === airiToken.contractAddress + ).length + ).toBeGreaterThan(0); + }); + + it("mint-burn-cw-ics20-test-single-step-ibc-msg-map-with-fee-denom-orai-and-orai-destination-denom-should-transfer-normally", async () => { + await ics20Contract.updateMappingPair({ + localAssetInfo: { + native_token: { + denom: ORAI, + }, + }, + localAssetInfoDecimals: 6, + denom: oraiIbcDenom, + remoteDecimals: 6, + localChannelId: channel, + }); + + let packetData = { + src: { + port_id: cosmosPort, + channel_id: channel, + }, + dest: { + port_id: oraiPort, + channel_id: channel, + }, + sequence: 27, + timeout: { + block: { + revision: 1, + height: 12345678, + }, + }, + }; + const icsPackage: FungibleTokenPacketData = { + amount: ibcTransferAmount, + denom: oraiIbcDenom, + receiver: bobAddress, + sender: cosmosSenderAddress, + // memo: `${bobAddress}:orai`, + memo: parseToIbcWasmMemo(bobAddress, "", "orai"), + }; + // transfer from cosmos to oraichain, should pass + let result = await cosmosChain.ibc.sendPacketReceive({ + packet: { + data: toBinary(icsPackage), + ...packetData, + }, + relayer: relayerAddress, + }); + const transferEvent = result.events.find( + (event) => event.type === "transfer" + ); + expect( + transferEvent.attributes.filter( + (attr) => attr.key === "recipient" && attr.value === bobAddress + ).length + ).toBeGreaterThan(0); + expect( + transferEvent.attributes.filter( + (attr) => + attr.key === "amount" && + attr.value === + JSON.stringify([{ denom: ORAI, amount: ibcTransferAmount }]) + ).length + ).toBeGreaterThan(0); + }); + + describe("test-single-step-cosmos-based-ibc-transfer-native", () => { + // unknowChannel is channel to cosmos + const unknownChannel = "channel-15"; + beforeEach(async () => { + // fixture + // needs to fake a new ibc channel so that we can successfully do ibc transfer + oraiClient.app.ibc.relay( + unknownChannel, + oraiPort, + unknownChannel, + cosmosPort, + cosmosChain + ); + await cosmosChain.ibc.sendChannelOpen({ + open_init: { + channel: { + counterparty_endpoint: { + port_id: oraiPort, + channel_id: unknownChannel, + }, + endpoint: { + port_id: cosmosPort, + channel_id: unknownChannel, + }, + order: IbcOrder.Unordered, + version: "ics20-1", + connection_id: "connection-0", + }, + }, + }); + + await cosmosChain.ibc.sendChannelConnect({ + open_ack: { + channel: { + counterparty_endpoint: { + port_id: oraiPort, + channel_id: unknownChannel, + }, + endpoint: { + port_id: cosmosPort, + channel_id: unknownChannel, + }, + order: IbcOrder.Unordered, + version: "ics20-1", + connection_id: "connection-0", + }, + counterparty_version: "ics20-1", + }, + }); + + cosmosChain.ibc.addMiddleWare((msg, app) => { + if ("packet" in msg.data) { + const data = msg.data.packet as IbcPacket; + if (Number(data.timeout.timestamp) < cosmosChain.time) { + throw new GenericError("timeout at " + data.timeout.timestamp); + } + } + }); + }); + + it.each([ + ["channel-15", "orai1g4h64yjt0fvzv5v2j8tyfnpe5kmnetejvfgs7g", "uatom"], // edge case, dest denom is also airi + ])( + "mint-burn-cw-ics20-test-single-step-has-ibc-msg-dest-receiver-cosmos-based dest channel %s dest denom %s expected recipient %s", + async ( + destChannel: string, + destReceiver: string, + destDenom: string + ) => { + // now send ibc package + // icsPackage.memo = `${destChannel}/${destReceiver}:${destDenom}`; + icsPackage.memo = parseToIbcWasmMemo( + destReceiver, + destChannel, + destDenom + ); + // transfer from cosmos to oraichain, should pass + const result = await cosmosChain.ibc.sendPacketReceive({ + packet: { + data: toBinary(icsPackage), + ...packetData, + }, + relayer: relayerAddress, + }); + + const ibcEvent = result.events.find( + (event) => + event.type === "transfer" && + event.attributes.find((attr) => attr.key === "channel") + ); + + // get swap operation event + expect(ibcEvent).not.toBeUndefined(); + expect( + ibcEvent.attributes.find((attr) => attr.key === "channel").value + ).toEqual(destChannel); + expect( + ibcEvent.attributes.find((attr) => attr.key === "recipient").value + ).toEqual(destReceiver); + expect( + ibcEvent.attributes.find((attr) => attr.key === "sender").value + ).toEqual(ics20Contract.contractAddress); + expect( + ibcEvent.attributes.find((attr) => attr.key === "amount").value + ).toContain(AtomDenom); + } + ); + + it("mint-burn-cw-ics20-test-single-step-ibc-msg-SUCCESS-map-with-fee-denom-orai-and-orai-destination-denom-with-dest-channel-not-matched-with-mapping-pair-should-do-ibctransfer", async () => { + await ics20Contract.updateMappingPair({ + localAssetInfo: { + native_token: { + denom: ORAI, + }, + }, + localAssetInfoDecimals: 6, + denom: oraiIbcDenom, + remoteDecimals: 6, + localChannelId: channel, + }); + + let packetData = { + src: { + port_id: cosmosPort, + channel_id: channel, + }, + dest: { + port_id: oraiPort, + channel_id: channel, + }, + sequence: 27, + timeout: { + block: { + revision: 1, + height: 12345678, + }, + }, + }; + const icsPackage: FungibleTokenPacketData = { + amount: ibcTransferAmount, + denom: oraiIbcDenom, + receiver: bobAddress, + sender: cosmosSenderAddress, + // memo: `${unknownChannel}/${bobAddress}:orai`, + memo: parseToIbcWasmMemo(bobAddress, atomChannel, "uatom"), + }; + // transfer from cosmos to oraichain, should pass + let result = await cosmosChain.ibc.sendPacketReceive({ + packet: { + data: toBinary(icsPackage), + ...packetData, + }, + relayer: relayerAddress, + }); + + const transferEvent = result.events.find( + (event) => + event.type === "transfer" && + event.attributes.find((attr) => attr.key === "channel") + ); + console.log(transferEvent); + expect( + transferEvent.attributes.filter( + (attr) => attr.key === "recipient" && attr.value === bobAddress + ).length + ).toBeGreaterThan(0); + expect( + transferEvent.attributes.filter( + (attr) => attr.key === "amount" && attr.value.includes(AtomDenom) + ).length + ).toBeGreaterThan(0); + expect( + transferEvent.attributes.filter( + (attr) => attr.key === "channel" && attr.value === unknownChannel + ).length + ).toBeGreaterThan(0); + }); + }); + + it("mint-burn-cw-ics20-test-single-step-handle_ibc_packet_receive_native_remote_chain-has-relayer-fee-should-be-deducted", async () => { + // setup relayer fee + const relayerFee = "100000"; + await ics20Contract.updateConfig({ + relayerFee: [{ prefix: "tron-testnet", fee: relayerFee }], + }); + + const icsPackage: FungibleTokenPacketData = { + amount: ibcTransferAmount, + denom: airiIbcDenom, + receiver: bobAddress, + sender: oraibridgeSenderAddress, + memo: parseToIbcWasmMemo(bobAddress, channel, oraiIbcDenom), + }; + // transfer from cosmos to oraichain, should pass + let result = await cosmosChain.ibc.sendPacketReceive({ + packet: { + data: toBinary(icsPackage), + ...packetData, + }, + relayer: relayerAddress, + }); + const hasRelayerFee = result.events.find( + (event) => + event.type === "wasm" && + event.attributes.find( + (attr) => attr.key === "to" && attr.value === relayerAddress + ) && + event.attributes.find( + (attr) => attr.key === "amount" && attr.value === relayerFee + ) + ); + expect(hasRelayerFee).not.toBeUndefined(); + expect( + result.attributes.find( + (attr) => attr.key === "relayer_fee" && attr.value === relayerFee + ) + ).not.toBeUndefined(); + }); + + it.each<[string, string]>([ + [parseToIbcWasmMemo(bobAddress, channel, oraiIbcDenom), "20000000"], + [parseToIbcWasmMemo(bobAddress, "", "orai"), "10000000"], + ])( + "mint-burn-cw-ics20-test-single-step-ibc-handle_ibc_packet_receive_native_remote_chain-has-token-fee-should-be-deducted", + async (memo, expectedTokenFee) => { + // setup relayer fee + await ics20Contract.updateConfig({ + tokenFee: [ + { + token_denom: airiIbcDenom, + ratio: { nominator: 1, denominator: 10 }, + }, + ], + }); + + const icsPackage: FungibleTokenPacketData = { + amount: ibcTransferAmount, + denom: airiIbcDenom, + receiver: bobAddress, + sender: oraibridgeSenderAddress, + memo, + }; + // transfer from cosmos to oraichain, should pass + let result = await cosmosChain.ibc.sendPacketReceive({ + packet: { + data: toBinary(icsPackage), + ...packetData, + }, + relayer: relayerAddress, + }); + const hasTokenFee = result.events.filter( + (event) => + event.type === "wasm" && + event.attributes.find( + (attr) => attr.key === "to" && attr.value === senderAddress + ) + ); + expect(hasTokenFee).not.toBeUndefined(); + expect( + result.attributes.find( + (attr) => attr.key === "token_fee" && expectedTokenFee + ) + ).not.toBeUndefined(); + } + ); + + it.each<[string, string, string]>([ + [ + parseToIbcWasmMemo(bobAddress, channel, airiIbcDenom), + "20000000", + "100000", + ], + [ + parseToIbcWasmMemo(bridgeReceiver, channel, airiIbcDenom), + "20000000", + "200000", + ], // double deducted when there's an outgoing ibc msg after receiving the packet + [parseToIbcWasmMemo(bobAddress, "", "orai"), "10000000", "100000"], + ])( + "mint-burn-test-handle_ibc_packet_receive_native_remote_chain-has-both-token-fee-and-relayer-fee-should-be-both-deducted-given memo %s should give expected token fee %s and expected relayer fee %s", + async (memo, expectedTokenFee, expectedRelayerFee) => { + // setup relayer fee + const relayerFee = "100000"; + await ics20Contract.updateConfig({ + tokenFee: [ + { + token_denom: airiIbcDenom, + ratio: { nominator: 1, denominator: 10 }, + }, + { token_denom: "orai", ratio: { nominator: 1, denominator: 10 } }, + ], + relayerFee: [{ prefix: "tron-testnet", fee: relayerFee }], + }); + + const icsPackage: FungibleTokenPacketData = { + amount: ibcTransferAmount, + denom: airiIbcDenom, + receiver: bobAddress, + sender: oraibridgeSenderAddress, + memo, + }; + // transfer from cosmos to oraichain, should pass + let result = await cosmosChain.ibc.sendPacketReceive({ + packet: { + data: toBinary(icsPackage), + ...packetData, + }, + relayer: relayerAddress, + }); + + const hasRelayerFee = result.events.find( + (event) => + event.type === "wasm" && + event.attributes.find( + (attr) => attr.key === "to" && attr.value === relayerAddress + ) && + event.attributes.find( + (attr) => + attr.key === "amount" && attr.value === expectedRelayerFee + ) + ); + expect(hasRelayerFee).not.toBeUndefined(); + expect( + result.attributes.find( + (attr) => + attr.key === "relayer_fee" && attr.value === expectedRelayerFee + ) + ).not.toBeUndefined(); + + const hasTokenFee = result.events.find( + (event) => + event.type === "wasm" && + event.attributes.find( + (attr) => attr.key === "to" && attr.value === senderAddress + ) && + event.attributes.find( + (attr) => attr.key === "amount" && attr.value === expectedTokenFee + ) + ); + expect(hasTokenFee).not.toBeUndefined(); + expect( + result.attributes.find( + (attr) => + attr.key === "token_fee" && attr.value === expectedTokenFee + ) + ).not.toBeUndefined(); + } + ); + + it.each<[string, string, string, string, string]>([ + [ + ibcTransferAmount, + ibcTransferAmount, + "10000000", + "90000000", + ibcTransferAmount, + ], + ])( + "mint-burn-cw-ics20-test-single-step-handle_ibc_packet_receive_native_remote_chain-deducted-amount-is-zero-should-still-charge-fees", + async ( + transferAmount, + relayerFee, + expectedTokenFee, + expectedRelayerFee, + expectedTotalFee + ) => { + await ics20Contract.updateConfig({ + tokenFee: [ + { + token_denom: airiIbcDenom, + ratio: { nominator: 1, denominator: 10 }, + }, + ], + relayerFee: [{ prefix: "tron-testnet", fee: relayerFee }], + }); + + const icsPackage: FungibleTokenPacketData = { + amount: transferAmount, + denom: airiIbcDenom, + receiver: bobAddress, + sender: oraibridgeSenderAddress, + memo: parseToIbcWasmMemo(bobAddress, "", "orai"), + }; + // transfer from cosmos to oraichain, should pass + let result = await cosmosChain.ibc.sendPacketReceive({ + packet: { + data: toBinary(icsPackage), + ...packetData, + }, + relayer: relayerAddress, + }); + + const hasFees = result.events.find( + (event) => + event.type === "wasm" && + event.attributes.find( + (attr) => attr.key === "to" && attr.value === senderAddress + ) && + event.attributes.find( + (attr) => attr.key === "amount" && attr.value === expectedTotalFee + ) + ); + + expect(hasFees).not.toBeUndefined(); + expect( + result.attributes.find( + (attr) => + attr.key === "token_fee" && attr.value === expectedTokenFee + ) + ).not.toBeUndefined(); + expect( + result.attributes.find( + (attr) => + attr.key === "relayer_fee" && attr.value === expectedRelayerFee + ) + ).not.toBeUndefined(); + } + ); + + // execute transfer to remote test cases + it("mint-burn-test-execute_transfer_back_to_remote_chain-native-FAILED-no-funds-sent", async () => { + oraiClient.app.bank.setBalance( + senderAddress, + coins(initialBalanceAmount, ORAI) + ); + try { + await ics20Contract.transferToRemote( + { + localChannelId: "1", + memo: null, + remoteAddress: "a", + remoteDenom: "a", + timeout: 60, + }, + "auto", + null + ); + } catch (error) { + expect(error.toString()).toContain("No funds sent"); + } + }); + + it("mint-burn-test-execute_transfer_back_to_remote_chain-native-FAILED-no-mapping-found", async () => { + oraiClient.app.bank.setBalance( + senderAddress, + coins(initialBalanceAmount, ORAI) + ); + try { + await ics20Contract.transferToRemote( + { + localChannelId: "1", + memo: null, + remoteAddress: "a", + remoteDenom: "a", + timeout: 60, + }, + "auto", + null, + [{ denom: ORAI, amount: "100" }] + ); + } catch (error) { + expect(error.toString()).toContain("Could not find the mapping pair"); + } + }); + + it("mint-burn-test-execute_transfer_back_to_remote_chain-native-FAILED-no-mapping-found", async () => { + oraiClient.app.bank.setBalance( + senderAddress, + coins(initialBalanceAmount, ORAI) + ); + try { + await ics20Contract.transferToRemote( + { + localChannelId: "1", + memo: null, + remoteAddress: "a", + remoteDenom: "a", + timeout: 60, + }, + "auto", + null, + [{ denom: ORAI, amount: "100" }] + ); + } catch (error) { + expect(error.toString()).toContain("Could not find the mapping pair"); + } + }); + }); +}); diff --git a/simulate-tests/common.ts b/simulate-tests/common.ts index abbaa49..62830aa 100644 --- a/simulate-tests/common.ts +++ b/simulate-tests/common.ts @@ -1,6 +1,7 @@ import { SimulateCosmWasmClient } from "@oraichain/cw-simulate"; import { OraiswapTokenClient } from "@oraichain/oraidex-contracts-sdk"; -import { CwIcs20LatestClient } from "@oraichain/common-contracts-sdk"; +// import { CwIcs20LatestClient } from "@oraichain/common-contracts-sdk"; +import { CwIcs20LatestClient } from "./contracts-sdk/CwIcs20Latest.client"; import * as oraidexArtifacts from "@oraichain/oraidex-contracts-build"; import * as commonArtifacts from "@oraichain/common-contracts-build"; import { readFileSync } from "fs"; @@ -27,11 +28,13 @@ export const deployToken = async ( name, decimals = 6, initial_balances = [{ address: senderAddress, amount: "1000000000" }], + minter = senderAddress, }: { symbol: string; name: string; decimals?: number; initial_balances?: Cw20Coin[]; + minter?: string; } ): Promise => { return new OraiswapTokenClient( @@ -46,7 +49,7 @@ export const deployToken = async ( decimals, symbol, name, - mint: { minter: senderAddress }, + mint: { minter: minter }, initial_balances, }, "token", diff --git a/simulate-tests/contracts-sdk/CwIcs20Latest.client.ts b/simulate-tests/contracts-sdk/CwIcs20Latest.client.ts new file mode 100644 index 0000000..6a5b895 --- /dev/null +++ b/simulate-tests/contracts-sdk/CwIcs20Latest.client.ts @@ -0,0 +1,558 @@ +/** +* This file was automatically generated by @oraichain/ts-codegen@0.35.8. +* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, +* and run the @oraichain/ts-codegen generate command to regenerate this file. +*/ + +import { CosmWasmClient, SigningCosmWasmClient, ExecuteResult } from "@cosmjs/cosmwasm-stargate"; +import { StdFee } from "@cosmjs/amino"; +import {InstantiateMsg, AllowMsg, ExecuteMsg, Uint128, Binary, AssetInfo, Addr, HookMethods, Cw20ReceiveMsg, TransferBackMsg, UpdatePairMsg, DeletePairMsg, RelayerFee, TokenFee, Ratio, QueryMsg, AdminResponse, AllowedResponse, Amount, ChannelResponse, Coin, Cw20Coin, ChannelInfo, IbcEndpoint, ChannelWithKeyResponse, ConfigResponse, RelayerFeeResponse, ListAllowedResponse, AllowedInfo, ListChannelsResponse, PairQuery, MappingMetadata, ArrayOfPairQuery, PortResponse} from "./CwIcs20Latest.types"; +export interface CwIcs20LatestReadOnlyInterface { + contractAddress: string; + port: () => Promise; + listChannels: () => Promise; + channel: ({ + id + }: { + id: string; + }) => Promise; + channelWithKey: ({ + channelId, + denom + }: { + channelId: string; + denom: string; + }) => Promise; + config: () => Promise; + admin: () => Promise; + allowed: ({ + contract + }: { + contract: string; + }) => Promise; + listAllowed: ({ + limit, + order, + startAfter + }: { + limit?: number; + order?: number; + startAfter?: string; + }) => Promise; + pairMappings: ({ + limit, + order, + startAfter + }: { + limit?: number; + order?: number; + startAfter?: string; + }) => Promise; + pairMapping: ({ + key + }: { + key: string; + }) => Promise; + pairMappingsFromAssetInfo: ({ + assetInfo + }: { + assetInfo: AssetInfo; + }) => Promise; + getTransferTokenFee: ({ + remoteTokenDenom + }: { + remoteTokenDenom: string; + }) => Promise; +} +export class CwIcs20LatestQueryClient implements CwIcs20LatestReadOnlyInterface { + client: CosmWasmClient; + contractAddress: string; + + constructor(client: CosmWasmClient, contractAddress: string) { + this.client = client; + this.contractAddress = contractAddress; + this.port = this.port.bind(this); + this.listChannels = this.listChannels.bind(this); + this.channel = this.channel.bind(this); + this.channelWithKey = this.channelWithKey.bind(this); + this.config = this.config.bind(this); + this.admin = this.admin.bind(this); + this.allowed = this.allowed.bind(this); + this.listAllowed = this.listAllowed.bind(this); + this.pairMappings = this.pairMappings.bind(this); + this.pairMapping = this.pairMapping.bind(this); + this.pairMappingsFromAssetInfo = this.pairMappingsFromAssetInfo.bind(this); + this.getTransferTokenFee = this.getTransferTokenFee.bind(this); + } + + port = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + port: {} + }); + }; + listChannels = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + list_channels: {} + }); + }; + channel = async ({ + id + }: { + id: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + channel: { + id + } + }); + }; + channelWithKey = async ({ + channelId, + denom + }: { + channelId: string; + denom: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + channel_with_key: { + channel_id: channelId, + denom + } + }); + }; + config = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + config: {} + }); + }; + admin = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + admin: {} + }); + }; + allowed = async ({ + contract + }: { + contract: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + allowed: { + contract + } + }); + }; + listAllowed = async ({ + limit, + order, + startAfter + }: { + limit?: number; + order?: number; + startAfter?: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + list_allowed: { + limit, + order, + start_after: startAfter + } + }); + }; + pairMappings = async ({ + limit, + order, + startAfter + }: { + limit?: number; + order?: number; + startAfter?: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + pair_mappings: { + limit, + order, + start_after: startAfter + } + }); + }; + pairMapping = async ({ + key + }: { + key: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + pair_mapping: { + key + } + }); + }; + pairMappingsFromAssetInfo = async ({ + assetInfo + }: { + assetInfo: AssetInfo; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + pair_mappings_from_asset_info: { + asset_info: assetInfo + } + }); + }; + getTransferTokenFee = async ({ + remoteTokenDenom + }: { + remoteTokenDenom: string; + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + get_transfer_token_fee: { + remote_token_denom: remoteTokenDenom + } + }); + }; +} +export interface CwIcs20LatestInterface extends CwIcs20LatestReadOnlyInterface { + contractAddress: string; + sender: string; + receive: ({ + amount, + msg, + sender + }: { + amount: Uint128; + msg: Binary; + sender: string; + }, _fee?: number | StdFee | "auto", _memo?: string, _funds?: Coin[]) => Promise; + transferToRemote: ({ + localChannelId, + memo, + remoteAddress, + remoteDenom, + timeout + }: { + localChannelId: string; + memo?: string; + remoteAddress: string; + remoteDenom: string; + timeout?: number; + }, _fee?: number | StdFee | "auto", _memo?: string, _funds?: Coin[]) => Promise; + updateMappingPair: ({ + denom, + isMintBurn, + localAssetInfo, + localAssetInfoDecimals, + localChannelId, + remoteDecimals + }: { + denom: string; + isMintBurn?: boolean; + localAssetInfo: AssetInfo; + localAssetInfoDecimals: number; + localChannelId: string; + remoteDecimals: number; + }, _fee?: number | StdFee | "auto", _memo?: string, _funds?: Coin[]) => Promise; + deleteMappingPair: ({ + denom, + localChannelId + }: { + denom: string; + localChannelId: string; + }, _fee?: number | StdFee | "auto", _memo?: string, _funds?: Coin[]) => Promise; + allow: ({ + contract, + gasLimit + }: { + contract: string; + gasLimit?: number; + }, _fee?: number | StdFee | "auto", _memo?: string, _funds?: Coin[]) => Promise; + updateConfig: ({ + admin, + converterContract, + defaultGasLimit, + defaultTimeout, + feeDenom, + feeReceiver, + relayerFee, + relayerFeeReceiver, + swapRouterContract, + tokenFee + }: { + admin?: string; + converterContract?: string; + defaultGasLimit?: number; + defaultTimeout?: number; + feeDenom?: string; + feeReceiver?: string; + relayerFee?: RelayerFee[]; + relayerFeeReceiver?: string; + swapRouterContract?: string; + tokenFee?: TokenFee[]; + }, _fee?: number | StdFee | "auto", _memo?: string, _funds?: Coin[]) => Promise; + increaseChannelBalanceIbcReceive: ({ + amount, + destChannelId, + ibcDenom, + localReceiver + }: { + amount: Uint128; + destChannelId: string; + ibcDenom: string; + localReceiver: string; + }, _fee?: number | StdFee | "auto", _memo?: string, _funds?: Coin[]) => Promise; + reduceChannelBalanceIbcReceive: ({ + amount, + ibcDenom, + localReceiver, + srcChannelId + }: { + amount: Uint128; + ibcDenom: string; + localReceiver: string; + srcChannelId: string; + }, _fee?: number | StdFee | "auto", _memo?: string, _funds?: Coin[]) => Promise; + overrideChannelBalance: ({ + channelId, + ibcDenom, + outstanding, + totalSent + }: { + channelId: string; + ibcDenom: string; + outstanding: Uint128; + totalSent?: Uint128; + }, _fee?: number | StdFee | "auto", _memo?: string, _funds?: Coin[]) => Promise; + ibcHooksReceive: ({ + args, + func + }: { + args: Binary; + func: HookMethods; + }, _fee?: number | StdFee | "auto", _memo?: string, _funds?: Coin[]) => Promise; +} +export class CwIcs20LatestClient extends CwIcs20LatestQueryClient implements CwIcs20LatestInterface { + client: SigningCosmWasmClient; + sender: string; + contractAddress: string; + + constructor(client: SigningCosmWasmClient, sender: string, contractAddress: string) { + super(client, contractAddress); + this.client = client; + this.sender = sender; + this.contractAddress = contractAddress; + this.receive = this.receive.bind(this); + this.transferToRemote = this.transferToRemote.bind(this); + this.updateMappingPair = this.updateMappingPair.bind(this); + this.deleteMappingPair = this.deleteMappingPair.bind(this); + this.allow = this.allow.bind(this); + this.updateConfig = this.updateConfig.bind(this); + this.increaseChannelBalanceIbcReceive = this.increaseChannelBalanceIbcReceive.bind(this); + this.reduceChannelBalanceIbcReceive = this.reduceChannelBalanceIbcReceive.bind(this); + this.overrideChannelBalance = this.overrideChannelBalance.bind(this); + this.ibcHooksReceive = this.ibcHooksReceive.bind(this); + } + + receive = async ({ + amount, + msg, + sender + }: { + amount: Uint128; + msg: Binary; + sender: string; + }, _fee: number | StdFee | "auto" = "auto", _memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + receive: { + amount, + msg, + sender + } + }, _fee, _memo, _funds); + }; + transferToRemote = async ({ + localChannelId, + memo, + remoteAddress, + remoteDenom, + timeout + }: { + localChannelId: string; + memo?: string; + remoteAddress: string; + remoteDenom: string; + timeout?: number; + }, _fee: number | StdFee | "auto" = "auto", _memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + transfer_to_remote: { + local_channel_id: localChannelId, + memo, + remote_address: remoteAddress, + remote_denom: remoteDenom, + timeout + } + }, _fee, _memo, _funds); + }; + updateMappingPair = async ({ + denom, + isMintBurn, + localAssetInfo, + localAssetInfoDecimals, + localChannelId, + remoteDecimals + }: { + denom: string; + isMintBurn?: boolean; + localAssetInfo: AssetInfo; + localAssetInfoDecimals: number; + localChannelId: string; + remoteDecimals: number; + }, _fee: number | StdFee | "auto" = "auto", _memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + update_mapping_pair: { + denom, + is_mint_burn: isMintBurn, + local_asset_info: localAssetInfo, + local_asset_info_decimals: localAssetInfoDecimals, + local_channel_id: localChannelId, + remote_decimals: remoteDecimals + } + }, _fee, _memo, _funds); + }; + deleteMappingPair = async ({ + denom, + localChannelId + }: { + denom: string; + localChannelId: string; + }, _fee: number | StdFee | "auto" = "auto", _memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + delete_mapping_pair: { + denom, + local_channel_id: localChannelId + } + }, _fee, _memo, _funds); + }; + allow = async ({ + contract, + gasLimit + }: { + contract: string; + gasLimit?: number; + }, _fee: number | StdFee | "auto" = "auto", _memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + allow: { + contract, + gas_limit: gasLimit + } + }, _fee, _memo, _funds); + }; + updateConfig = async ({ + admin, + converterContract, + defaultGasLimit, + defaultTimeout, + feeDenom, + feeReceiver, + relayerFee, + relayerFeeReceiver, + swapRouterContract, + tokenFee + }: { + admin?: string; + converterContract?: string; + defaultGasLimit?: number; + defaultTimeout?: number; + feeDenom?: string; + feeReceiver?: string; + relayerFee?: RelayerFee[]; + relayerFeeReceiver?: string; + swapRouterContract?: string; + tokenFee?: TokenFee[]; + }, _fee: number | StdFee | "auto" = "auto", _memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + update_config: { + admin, + converter_contract: converterContract, + default_gas_limit: defaultGasLimit, + default_timeout: defaultTimeout, + fee_denom: feeDenom, + fee_receiver: feeReceiver, + relayer_fee: relayerFee, + relayer_fee_receiver: relayerFeeReceiver, + swap_router_contract: swapRouterContract, + token_fee: tokenFee + } + }, _fee, _memo, _funds); + }; + increaseChannelBalanceIbcReceive = async ({ + amount, + destChannelId, + ibcDenom, + localReceiver + }: { + amount: Uint128; + destChannelId: string; + ibcDenom: string; + localReceiver: string; + }, _fee: number | StdFee | "auto" = "auto", _memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + increase_channel_balance_ibc_receive: { + amount, + dest_channel_id: destChannelId, + ibc_denom: ibcDenom, + local_receiver: localReceiver + } + }, _fee, _memo, _funds); + }; + reduceChannelBalanceIbcReceive = async ({ + amount, + ibcDenom, + localReceiver, + srcChannelId + }: { + amount: Uint128; + ibcDenom: string; + localReceiver: string; + srcChannelId: string; + }, _fee: number | StdFee | "auto" = "auto", _memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + reduce_channel_balance_ibc_receive: { + amount, + ibc_denom: ibcDenom, + local_receiver: localReceiver, + src_channel_id: srcChannelId + } + }, _fee, _memo, _funds); + }; + overrideChannelBalance = async ({ + channelId, + ibcDenom, + outstanding, + totalSent + }: { + channelId: string; + ibcDenom: string; + outstanding: Uint128; + totalSent?: Uint128; + }, _fee: number | StdFee | "auto" = "auto", _memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + override_channel_balance: { + channel_id: channelId, + ibc_denom: ibcDenom, + outstanding, + total_sent: totalSent + } + }, _fee, _memo, _funds); + }; + ibcHooksReceive = async ({ + args, + func + }: { + args: Binary; + func: HookMethods; + }, _fee: number | StdFee | "auto" = "auto", _memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + ibc_hooks_receive: { + args, + func + } + }, _fee, _memo, _funds); + }; +} \ No newline at end of file diff --git a/simulate-tests/contracts-sdk/CwIcs20Latest.types.ts b/simulate-tests/contracts-sdk/CwIcs20Latest.types.ts new file mode 100644 index 0000000..8a495f8 --- /dev/null +++ b/simulate-tests/contracts-sdk/CwIcs20Latest.types.ts @@ -0,0 +1,236 @@ +export interface InstantiateMsg { + allowlist: AllowMsg[]; + converter_contract: string; + default_gas_limit?: number | null; + default_timeout: number; + gov_contract: string; + swap_router_contract: string; +} +export interface AllowMsg { + contract: string; + gas_limit?: number | null; +} +export type ExecuteMsg = { + receive: Cw20ReceiveMsg; +} | { + transfer_to_remote: TransferBackMsg; +} | { + update_mapping_pair: UpdatePairMsg; +} | { + delete_mapping_pair: DeletePairMsg; +} | { + allow: AllowMsg; +} | { + update_config: { + admin?: string | null; + converter_contract?: string | null; + default_gas_limit?: number | null; + default_timeout?: number | null; + fee_denom?: string | null; + fee_receiver?: string | null; + relayer_fee?: RelayerFee[] | null; + relayer_fee_receiver?: string | null; + swap_router_contract?: string | null; + token_fee?: TokenFee[] | null; + }; +} | { + increase_channel_balance_ibc_receive: { + amount: Uint128; + dest_channel_id: string; + ibc_denom: string; + local_receiver: string; + }; +} | { + reduce_channel_balance_ibc_receive: { + amount: Uint128; + ibc_denom: string; + local_receiver: string; + src_channel_id: string; + }; +} | { + override_channel_balance: { + channel_id: string; + ibc_denom: string; + outstanding: Uint128; + total_sent?: Uint128 | null; + }; +} | { + ibc_hooks_receive: { + args: Binary; + func: HookMethods; + }; +}; +export type Uint128 = string; +export type Binary = string; +export type AssetInfo = { + token: { + contract_addr: Addr; + }; +} | { + native_token: { + denom: string; + }; +}; +export type Addr = string; +export type HookMethods = "universal_swap"; +export interface Cw20ReceiveMsg { + amount: Uint128; + msg: Binary; + sender: string; +} +export interface TransferBackMsg { + local_channel_id: string; + memo?: string | null; + remote_address: string; + remote_denom: string; + timeout?: number | null; +} +export interface UpdatePairMsg { + denom: string; + is_mint_burn?: boolean | null; + local_asset_info: AssetInfo; + local_asset_info_decimals: number; + local_channel_id: string; + remote_decimals: number; +} +export interface DeletePairMsg { + denom: string; + local_channel_id: string; +} +export interface RelayerFee { + fee: Uint128; + prefix: string; +} +export interface TokenFee { + ratio: Ratio; + token_denom: string; +} +export interface Ratio { + denominator: number; + nominator: number; +} +export type QueryMsg = { + port: {}; +} | { + list_channels: {}; +} | { + channel: { + id: string; + }; +} | { + channel_with_key: { + channel_id: string; + denom: string; + }; +} | { + config: {}; +} | { + admin: {}; +} | { + allowed: { + contract: string; + }; +} | { + list_allowed: { + limit?: number | null; + order?: number | null; + start_after?: string | null; + }; +} | { + pair_mappings: { + limit?: number | null; + order?: number | null; + start_after?: string | null; + }; +} | { + pair_mapping: { + key: string; + }; +} | { + pair_mappings_from_asset_info: { + asset_info: AssetInfo; + }; +} | { + get_transfer_token_fee: { + remote_token_denom: string; + }; +}; +export interface AdminResponse { + admin?: string | null; +} +export interface AllowedResponse { + gas_limit?: number | null; + is_allowed: boolean; +} +export type Amount = { + native: Coin; +} | { + cw20: Cw20Coin; +}; +export interface ChannelResponse { + balances: Amount[]; + info: ChannelInfo; + total_sent: Amount[]; +} +export interface Coin { + amount: Uint128; + denom: string; +} +export interface Cw20Coin { + address: string; + amount: Uint128; +} +export interface ChannelInfo { + connection_id: string; + counterparty_endpoint: IbcEndpoint; + id: string; +} +export interface IbcEndpoint { + channel_id: string; + port_id: string; +} +export interface ChannelWithKeyResponse { + balance: Amount; + info: ChannelInfo; + total_sent: Amount; +} +export interface ConfigResponse { + converter_contract: string; + default_gas_limit?: number | null; + default_timeout: number; + fee_denom: string; + gov_contract: string; + relayer_fee_receiver: Addr; + relayer_fees: RelayerFeeResponse[]; + swap_router_contract: string; + token_fee_receiver: Addr; + token_fees: TokenFee[]; +} +export interface RelayerFeeResponse { + amount: Uint128; + prefix: string; +} +export interface ListAllowedResponse { + allow: AllowedInfo[]; +} +export interface AllowedInfo { + contract: string; + gas_limit?: number | null; +} +export interface ListChannelsResponse { + channels: ChannelInfo[]; +} +export interface PairQuery { + key: string; + pair_mapping: MappingMetadata; +} +export interface MappingMetadata { + asset_info: AssetInfo; + asset_info_decimals: number; + is_mint_burn?: boolean; + remote_decimals: number; +} +export type ArrayOfPairQuery = PairQuery[]; +export interface PortResponse { + port_id: string; +} \ No newline at end of file diff --git a/simulate-tests/contracts-sdk/index.ts b/simulate-tests/contracts-sdk/index.ts new file mode 100644 index 0000000..5ab2419 --- /dev/null +++ b/simulate-tests/contracts-sdk/index.ts @@ -0,0 +1,2 @@ +export * as CwIcs20LatestTypes from './CwIcs20Latest.types'; +export * from './CwIcs20Latest.client'; \ No newline at end of file From 93cfe2e325fcffd85cb63f9ce5f65e5a5d3a0fbc Mon Sep 17 00:00:00 2001 From: trung2891 Date: Mon, 25 Mar 2024 17:49:57 +0700 Subject: [PATCH 06/10] chore: always add IncreaseChannelBalanceIbcReceive msg --- .../artifacts/cw-ics20-latest.wasm | Bin 600253 -> 600188 bytes contracts/cw-ics20-latest/src/ibc.rs | 23 +++++++++--------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/contracts/cw-ics20-latest/artifacts/cw-ics20-latest.wasm b/contracts/cw-ics20-latest/artifacts/cw-ics20-latest.wasm index 4a603d319c96aef57efbda0207d4115448e50249..a4816f35d1cf73c4220466e8ed91aba6b3f62cb9 100644 GIT binary patch delta 11305 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 delta 11241 zcmb_i4{#mDdB5Acy_59bv(L6<3!8zxlWd;APE4Rrgp|Z5FffENhB9El5T~UOWI8pj zo01Ogdn5`LjFYMqa%w^{Dm7SXP4F~MP&1^XByC4CWr&!%t*51_GNX_;sY#Tn+EJ&b z?eF*Pz9%^l$h2j!zHj&4?SB9N?B1E#{;$8%fBZjV_4JQF@kV^;jo8OOg?|D5g)h7j z>&6Z7kw<)G>Yc^NEqXS}27?DpR@{E8-a622f~tDLPuH7ZAQ<=4K8`2+bOYfLKkeoG zq@VT|&)=#a-XrSH3ATA@s*RWX52WFcO0(jDzYaGQHynt&UTEyrf9v~Mam(#G z2N=IyUv)9wsH)>ZdJf@HGeFSDd;_ z-+Xa(Fj$~eAm!79Nli5gHxCALgllW+Rl;>Ob&9a3xZ*>4!)>c;>O~IAH8n-Jv8GNC zR%+@vVOLEZBRr?3CJ9S5SS+Bb!GZy|3wF*nM0 zV2C4xkRe2`OemsPl;KH^bxq9z3J2Mc89i!JY`Ms(QGYo39uQKQC3){Puz0o2I~^6% zAJ*OLN;@mYl=44&e%c%Gyg@HArQ-V^*8AUE$~!)qmUETrd{x?oe;$HK1Q-HBFIA|a za$fm-5x`1;6l1@nZ>>|76%#@1$w$aCHiw(uWTi0>j8OvQ2tSd_2JC?N1UYv2B=9kZ z9|u0}a7wD_-lZfL9KIAmat>d=fWav@Xab)lo)r)MvffmO?uPt9)dZx(G7qpB4(G@I zXxd9&Dqk3%fsZ5%HWjn8HqhL zwHMft&rd^dyExY%wgcGfpP2UQHMJe+=bz)G0rp}+ECIHvrpf@{fHrEX16Wj3A;6Ri5$yrUtzWALBz z=~ChRewmj^{XkETG?uB_xO`9u1ca9fQF! z{UtXO&P93U>XtVzLYOnw9t2}`CN$5!1bC~ z;#K<^ykk(E1fGMwSwfg2{+V>%RxO^tNB2nhg3oHlb3PYXKY`SR0xZS2n0%3< zoY7noViaogS&y6kiIBQG&G_Ul22gU>gp%oeR5rO3%Avj$&Nroov!N1JcrvJLak7Fr zOj_pgCNe?P=j9E5U*`3D#>;20q0`xn&aiS-&FbRZ`}Dc@K%G^!i?z=-Z;z;Bs0(2t zG9gr>C9mS?BM}vaQYvcAyrg$lA`@d+jzCLQ?M^!huHT7D!!w=qT#x2_E`Tn+aG$=e zxq}hZzGMDsk^38P+KxB%VeNZDM^PVJ9QAqk)Bx?9y#_Nw^Dx zgU1cF8;>%qTGli0m{*r2=;h^M6HuGk7jV;SH#*wEbT2j;RK;fNj(gxdh3F zsrQaSHNtsFZ&ADu@}tnmns}-c9v+04CWylXPx8Qanc}(X!_6-CcvW5JzVskt| zQFC*VK8RVV7^?ykLcdhpm-p$u2)J+J;?;e68`P3*87kd~39(-$r)hCPo1A7G&g3-f za3-fy4xa)(=Wr&uDc}PjKNUAXK>i^I$L~|X zd&^iBYa#yG!ht`$Q~7k5K8Tk_Lwa5AONkM)ya2um|2oUPSe5k>DHSn7d{yZ8eKxyb z2jP9u6=EpVkbI|bBFLX& zHmrq4`8=#f@*k{biBO!bNfyLL* zb4e&g&$V(H_FSSSgjgxC5WbPsDF5VX#fT8*hhL{OA;0r5c%(HT{r`3PHun=5`1cmg zWZ;Lb0U3A}^v{KF$$+EZ^fH!jkkq}NXjif4*Y!Xhw8QSI>Ta8($YQX+l}p;@DCtVr zL&gwGgOrw4R{}q13Hv=5IbA1`B7*1$ijpRM49W5gV&I&^7lEGwjv8tJ3nEXrALfD2 zXh~~Q0%3ZH+DQgct^kLn&j3mZ!Lc`}xK7@Th7-glAJI}O7E4J}+vZYynAH#Cl*-2x z;!{8DLCq;uWShg# z_*guEA_jtMlhs z1Wr07kOC*e5?q0k;ilxA8J&UvR+=^kfpQUcQ!_VF`)C-o?Euh|fWZ2Kb}ayfWNWU| ztcS2JtF3wDKCzB`UXo1vaa+CP$+je7NP_tYJ4r_BOn&IA9W4`Wm+fa)8rxfB%?6e% z=D3#TElF%jS|p)ReeI*VT0e`2Hccy7uzI#Ew7U{(Rqe-@8xSiCn?{8I*r$l2sgi#Y ziB3it>;iKlq&i4q*8nN8CSA_XohCM$O}~{u@(=Pfn>0D$IGgh_BiuU|Bs|Y4chlTK zSdyVY+C1dd(|$K&JnrYL>6kO7No!27Vrv|TI7I0H#-cQKFRP?Z`pmT zD{dQ5@|@6(0$9vuWdZCj7r^Wys%j!Y)jQ|iPlJbYfhOM#QRHCOAGTGo2cmF~#@`7%6guHA z#jMP{KSuIGiC=bIT~_E~18}RYQ~qmwOKy`F+2T1g20f zlj$k28!?xHA4{;7#&4RUiUpk!sfi*NE&q@M3T#f}JxCrV1-t`?bx^hhIJCZ$8;{WD z`3}aA0G^`G6P&VwU)-fYFcieCz>ibBTqcrDr82_wG^QJF*BRiW4wqOJEtj{w_LvZn zjo~Dr1e#%S=R-QZ5{okVi;l57C7MIaE6zl$$Z;UK89$9%C9!39`kRP~Z#<-XZXtCb z2~w7|;6A6^+OvSs^qYfYfss=Pc5%K8x`OBxZYV8siE)|si8g)sj(2J z6qm#@DY<_Xx&36vh7)qk%Zd4FLNva3ZMjivHEyj&uGQF`aVPF4I*Ntg#-T}1$&_>N z+DfS{SB#}?fLzO{kxUORW4;@5H=dP>9|6LT;4SV=8k@N&e9L%@M+(PX(w!9X<dqrL{x;}1lk6HylDz2f`0A&hWu2d$on(lX)k2zM@k$DFn&Bi^&{xQzi& z>RjkSYGJ1jE36gAflw(=vLF!{OoOWX!n6o+G9zB9Z8>LSmr8ws} z2L9VjLa@^8LQJ^lYG7L~L~|b_&buI7Fu7@Z*d*}_5KKYwP#p(TB65g$cBQW)&Oae9 z*&1a6I91KR5Y>B?BtjD0F3n*3u|33S#<;%)5#S1kXDbhMvd*74(y8NTWDlf9F~ru{ z4g!2A2_*9=)UC#6;^~JspffW7Xxz>PKp)o&fTQ4U09@E5064xcBMaia4tY;(0|&;E z6&(XlL)YZT=0fhyEJ&mKU#CGy$Jj$M9?t*7Q*m}Do{F&quy(?;=}y(zK=2fymF8GQ zF(A?ASEf9US%T5Mk?=TtbGnOB)sPqDFn`|%SwQ7XUpNX({u~TT2D847*yl5YU1uT_ z18LO`hW8FgIlK;bN5^)@K%6(!}&zxK+R9fR@lvZ z4_^E!>5ALEO}YZ%jQEsl&UEF*lx)7#c1@-$S_ov6W+bf9!SE}w1wV;b+Kd&uj1}7$ zwh-HP4^@uDq$N~4eEy8}>f&{#E3*dY$Yu62yuxpFA+g;FE67eO;()AxI8ZXHVNu=7 z#d`t|jA>*%x%JTj`^jf~*kr@!AuY~0_hoU#E0tDQBDSrswfn9Gg**=zbL<<0XJCxb zAm`+$Hl>t7RFG2;_?}oL?(L;?b&k$(u`I)O`pqjg{i5_=1?o;c@6L2I27gm;jc~7U zH0v~7Hk`3o=t{PUv|N5~<@;9tZ`A|1ac>{wiZ&t}`5Unff~+fW%w#(A-uqeG;Ifi8 zCdl|~vx+|)fseUTrc**1S!XN|6+jSapJ?wT*UineuY^vynUn3Ac{elHo*8j7tpf#Q zIyd9GLY~ssE3h9pTL`?es=ONev1qh5fQ%_NfQ;Ei{*W=n29Pm@E@Vtp36e1(=yHNd z$tW3G6i<$I*QIj8U0yHGpI&+X4(?#mb?JL$7f4rjfpldTRAHKnl+VGpE%v^jqfJ=q z-QMePlx^ORU~vZzFr71WSfZhnv{mZ zk`Rf;5rpD=q$HOE5!mMifmdcR{q~ftB`GUOD|Z&Z@`&CV;3~9GhxAo?9UN;Y{JLQNr~UK zKtw>GwW|6*n)4-X3qK~;WLVJ|G_W&)Wojvq@Z>}l6}^w@>u|pS0-&mE;GU~mlpc3) z9FsTX5zjJ&n+7n`A&jKB2Ng|lS&@|$;sieyBLzW5adxC0!k@?R=b`4|sU)mnUluX^ ziC~TdJcj773hksq-&I`ln0~}himyGUHyO|PAW}YHk?nzv^9BkM3=QH*@o$geNMlX$ z@W<4;y1&zMi|-gD4Ls$u1XSSe9@Nw{j^IT zkxBAbS_3BzvoZODU^(%??A>QKooMV|!^2h2t9da7|GeT&D=mBuL8*wWa0m}M4Sf>l zG_yFTxfBLb6ra|=`5x3%4`P5scMt&I;_L^&$20c>;3K%b04SFC0N~nwH^7==$M5PZ z<$D&VMt)?2&(K5SLLq`oln2OMI zmTf+P@B5(tHN{y`%i7;v!!;G@9j zqI~9)(_VfNh=)Zij_GIotoZEj>Ag90&mcgjO=ORZ-*ZCp*!1nbyWG+K?DBn&>kIw9 z;-1Ixy=7nV$m9A?ll6Gn)=#(`Qf9*o*Z#h~PIbUdc9G@cvrp>Hopc&4! Date: Mon, 25 Mar 2024 22:51:27 +0700 Subject: [PATCH 07/10] chore: fix test case --- .../artifacts/cw-ics20-latest.wasm | Bin 600188 -> 600188 bytes .../cw-ics20-latest/src/testing/ibc_tests.rs | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/cw-ics20-latest/artifacts/cw-ics20-latest.wasm b/contracts/cw-ics20-latest/artifacts/cw-ics20-latest.wasm index a4816f35d1cf73c4220466e8ed91aba6b3f62cb9..45d95a75d71b3b6d55bd08547669186da50e4689 100644 GIT binary patch delta 33 pcmex!LFLZ{m4+6^7N!>F7M2#)7Pc1lEgXT7j1t>}B003q0|4jK3;O^7 delta 33 pcmex!LFLZ{m4+6^7N!>F7M2#)7Pc1lEgXT7jFQ`fB003q0|4jR3;X~8 diff --git a/contracts/cw-ics20-latest/src/testing/ibc_tests.rs b/contracts/cw-ics20-latest/src/testing/ibc_tests.rs index 8aa287a..b6b7fbe 100644 --- a/contracts/cw-ics20-latest/src/testing/ibc_tests.rs +++ b/contracts/cw-ics20-latest/src/testing/ibc_tests.rs @@ -567,7 +567,7 @@ fn send_from_remote_to_local_receive_happy_path() { // TODO: fix test cases. Possibly because we are adding two add_submessages? assert_eq!(res.messages.len(), 3); // 3 messages because we also have deduct fee msg and increase channel balance msg - match res.messages[0].msg.clone() { + match res.messages[1].msg.clone() { CosmosMsg::Wasm(WasmMsg::Execute { contract_addr, msg, @@ -590,7 +590,7 @@ fn send_from_remote_to_local_receive_happy_path() { assert!(matches!(ack, Ics20Ack::Result(_))); // query channel state|_| - match res.messages[1].msg.clone() { + match res.messages[0].msg.clone() { CosmosMsg::Wasm(WasmMsg::Execute { contract_addr, msg, From 5efd27ba86c0f857dc936cdb5ea3e28cc2bd93db Mon Sep 17 00:00:00 2001 From: trung2891 Date: Tue, 26 Mar 2024 00:07:00 +0700 Subject: [PATCH 08/10] chore: add test ibc_receive in case mint burn --- .../cw-ics20-latest/src/testing/ibc_tests.rs | 179 +++++++++++++++++- 1 file changed, 178 insertions(+), 1 deletion(-) diff --git a/contracts/cw-ics20-latest/src/testing/ibc_tests.rs b/contracts/cw-ics20-latest/src/testing/ibc_tests.rs index b6b7fbe..793a584 100644 --- a/contracts/cw-ics20-latest/src/testing/ibc_tests.rs +++ b/contracts/cw-ics20-latest/src/testing/ibc_tests.rs @@ -35,7 +35,7 @@ use crate::state::{ TOKEN_FEE, }; use cw20::{Cw20Coin, Cw20ExecuteMsg, Cw20ReceiveMsg}; -use cw20_ics20_msg::amount::{convert_local_to_remote, Amount}; +use cw20_ics20_msg::amount::{convert_local_to_remote, convert_remote_to_local, Amount}; use crate::contract::{ build_burn_cw20_mapping_msg, build_mint_cw20_mapping_msg, execute, @@ -2838,3 +2838,180 @@ fn test_build_burn_cw20_mapping_msg() { })), ); } + +#[test] +fn send_from_remote_to_local_receive_with_mint_mechanism() { + let mut contract_instance = MockContract::new( + WASM_BYTES, + Addr::unchecked(CONTRACT), + MockInstanceOptions { + balances: &[(SENDER, &coins(100_000_000_000, "orai"))], + gas_limit: 40_000_000_000_000_000, + ..MockInstanceOptions::default() + }, + ); + let cw20_addr = "orai1lus0f0rhx8s03gdllx2n6vhkmf0536dv57wfge"; + let relayer = Addr::unchecked("orai12zyu8w93h0q2lcnt50g3fn0w3yqnhy4fvawaqz"); + let send_channel = "channel-9"; + let custom_addr = "orai12zyu8w93h0q2lcnt50g3fn0w3yqnhy4fvawaqz"; + let denom = "uatom0x"; + let asset_info = AssetInfo::Token { + contract_addr: Addr::unchecked(cw20_addr), + }; + let contract_port = format!("wasm.{}", CONTRACT); + let gas_limit = 1234567; + let send_amount = Uint128::from(876543210u128 * 1_000_000_000_000); + let channels = &["channel-1", "channel-7", send_channel]; + + let allow = &[(cw20_addr, gas_limit)]; + + let allowlist = allow + .iter() + .map(|(contract, gas)| AllowMsg { + contract: contract.to_string(), + gas_limit: Some(*gas), + }) + .collect(); + + // instantiate an empty contract + let instantiate_msg = InitMsg { + default_gas_limit: None, + default_timeout: DEFAULT_TIMEOUT, + gov_contract: SENDER.to_string(), + allowlist, + swap_router_contract: "router".to_string(), + converter_contract: "converter".to_string(), + }; + + contract_instance + .instantiate(instantiate_msg, SENDER, &[]) + .unwrap(); + + for channel_id in channels { + let channel = mock_channel(channel_id); + let open_msg = IbcChannelOpenMsg::new_init(channel.clone()); + contract_instance.ibc_channel_open(open_msg).unwrap(); + let connect_msg = IbcChannelConnectMsg::new_ack(channel, ICS20_VERSION); + contract_instance.ibc_channel_connect(connect_msg).unwrap(); + } + + contract_instance + .with_storage(|storage| { + TOKEN_FEE + .save( + storage, + denom, + &Ratio { + nominator: 1, + denominator: 10, + }, + ) + .unwrap(); + Ok(()) + }) + .unwrap(); + + let pair = UpdatePairMsg { + local_channel_id: send_channel.to_string(), + denom: denom.to_string(), + local_asset_info: asset_info.clone(), + remote_decimals: 18u8, + local_asset_info_decimals: 6u8, + is_mint_burn: Some(true), + }; + + contract_instance + .execute(ExecuteMsg::UpdateMappingPair(pair), SENDER, &[]) + .unwrap(); + + let data = Ics20Packet { + // this is returning a foreign native token, thus denom is , eg: uatom + denom: denom.to_string(), + amount: send_amount, + sender: SENDER.to_string(), + receiver: custom_addr.to_string(), + memo: None, + }; + let recv_packet = IbcPacket::new( + to_binary(&data).unwrap(), + IbcEndpoint { + port_id: REMOTE_PORT.to_string(), + channel_id: "channel-1234".to_string(), + }, + IbcEndpoint { + port_id: contract_port.clone(), + channel_id: send_channel.to_string(), + }, + 3, + Timestamp::from_seconds(1665321069).into(), + ); + + // we can receive this denom, channel balance should increase + let ibc_msg = IbcPacketReceiveMsg::new(recv_packet.clone(), relayer); + + let (res, _gas_used) = contract_instance.ibc_packet_receive(ibc_msg).unwrap(); + + assert_eq!(res.messages.len(), 4); // 4 messages because we also have deduct fee msg, increase channel balance msg and mint + + match res.messages[0].msg.clone() { + CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr, + msg, + funds: _, + }) => { + assert_eq!(contract_addr, CONTRACT); // self-call msg + assert_eq!( + msg, + to_binary(&ExecuteMsg::IncreaseChannelBalanceIbcReceive { + dest_channel_id: send_channel.to_string(), + ibc_denom: get_key_ics20_ibc_denom(contract_port.as_str(), send_channel, denom), + amount: send_amount, + local_receiver: custom_addr.to_string(), + }) + .unwrap() + ); + } + _ => panic!("Unexpected return message: {:?}", res.messages[0]), + } + + match res.messages[1].msg.clone() { + CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr, + msg, + funds: _, + }) => { + assert_eq!(contract_addr, cw20_addr); + assert_eq!( + msg, + to_binary(&Cw20ExecuteMsg::Mint { + recipient: CONTRACT.to_string(), + amount: convert_remote_to_local(send_amount, 18, 6).unwrap() + }) + .unwrap() + ) + } + _ => panic!("Unexpected return message: {:?}", res.messages[0]), + } + + match res.messages[2].msg.clone() { + CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr, + msg, + funds: _, + }) => { + assert_eq!(contract_addr, cw20_addr); + assert_eq!( + msg, + to_binary(&Cw20ExecuteMsg::Transfer { + recipient: SENDER.to_string(), + amount: Uint128::from(87654321u64) // send amount / token fee + }) + .unwrap() + ); + } + _ => panic!("Unexpected return message: {:?}", res.messages[0]), + } + + let ack: Ics20Ack = from_binary(&res.acknowledgement).unwrap(); + assert!(matches!(ack, Ics20Ack::Result(_))); +} From 9d7075cd51ad2a19f93977ad0dae5f2fe0777c3a Mon Sep 17 00:00:00 2001 From: ducphamle2 Date: Tue, 26 Mar 2024 00:43:26 -0700 Subject: [PATCH 09/10] chore: refactor & optimize code --- contracts/cw-ics20-latest/src/contract.rs | 120 +++++++++--------- contracts/cw-ics20-latest/src/ibc.rs | 45 +++---- contracts/cw-ics20-latest/src/msg.rs | 2 +- .../cw-ics20-latest/src/testing/ibc_tests.rs | 84 ++++++------ 4 files changed, 125 insertions(+), 126 deletions(-) diff --git a/contracts/cw-ics20-latest/src/contract.rs b/contracts/cw-ics20-latest/src/contract.rs index bd3edab..b5ebb1a 100644 --- a/contracts/cw-ics20-latest/src/contract.rs +++ b/contracts/cw-ics20-latest/src/contract.rs @@ -17,8 +17,8 @@ use crate::error::ContractError; use crate::ibc::{build_ibc_send_packet, parse_voucher_denom, process_deduct_fee}; use crate::ibc_hooks::ibc_hooks_receive; use crate::msg::{ - AllowMsg, AllowedInfo, AllowedResponse, ChannelResponse, ChannelWithKeyResponse, - ConfigResponse, DeletePairMsg, ExecuteMsg, InitMsg, ListAllowedResponse, ListChannelsResponse, + AllowedInfo, AllowedResponse, ChannelResponse, ChannelWithKeyResponse, ConfigResponse, + DeletePairMsg, ExecuteMsg, InitMsg, ListAllowedResponse, ListChannelsResponse, ListMappingResponse, MigrateMsg, PairQuery, PortResponse, QueryMsg, RelayerFeeResponse, TransferBackMsg, UpdatePairMsg, }; @@ -88,7 +88,7 @@ pub fn execute( } ExecuteMsg::UpdateMappingPair(msg) => execute_update_mapping_pair(deps, env, info, msg), ExecuteMsg::DeleteMappingPair(msg) => execute_delete_mapping_pair(deps, env, info, msg), - ExecuteMsg::Allow(allow) => execute_allow(deps, env, info, allow), + // ExecuteMsg::Allow(allow) => execute_allow(deps, env, info, allow), ExecuteMsg::UpdateConfig { default_timeout, default_gas_limit, @@ -268,7 +268,11 @@ pub fn handle_reduce_channel_balance_ibc_receive( pair_mapping.remote_decimals, pair_mapping.asset_info_decimals, )?; - let burn_msg = build_burn_cw20_mapping_msg(storage, ibc_denom.clone(), burn_amount)?; + let burn_msg = build_burn_cw20_mapping_msg( + pair_mapping.is_mint_burn, + pair_mapping.asset_info, + burn_amount, + )?; if let Some(burn_msg) = burn_msg { cosmos_msgs.push(burn_msg); } @@ -562,8 +566,11 @@ pub fn execute_transfer_back_to_remote_chain( )?; // build burn msg if the mechanism is mint/burn - let burn_msg = - build_burn_cw20_mapping_msg(deps.storage, ibc_denom.clone(), fee_data.deducted_amount)?; + let burn_msg = build_burn_cw20_mapping_msg( + mapping.pair_mapping.is_mint_burn, + mapping.pair_mapping.asset_info, + fee_data.deducted_amount, + )?; if let Some(burn_msg) = burn_msg { cosmos_msgs.push(burn_msg); } @@ -579,17 +586,13 @@ pub fn execute_transfer_back_to_remote_chain( } pub fn build_burn_cw20_mapping_msg( - storage: &dyn Storage, - ibc_denom: String, + is_mint_burn: bool, + burn_asset_info: AssetInfo, amount_local: Uint128, ) -> Result, ContractError> { // burn cw20 token if the mechanism is mint burn - let pair_mapping = ics20_denoms() - .load(storage, &ibc_denom) - .map_err(|_| ContractError::NotOnMappingList {})?; - - if pair_mapping.is_mint_burn { - match pair_mapping.asset_info { + if is_mint_burn { + match burn_asset_info { AssetInfo::NativeToken { denom } => { return Err(ContractError::Std(StdError::generic_err(format!( "Mapping token must be cw20 token. Got {}", @@ -612,18 +615,13 @@ pub fn build_burn_cw20_mapping_msg( } pub fn build_mint_cw20_mapping_msg( - storage: &dyn Storage, - ibc_denom: String, + is_mint_burn: bool, + mint_asset_info: AssetInfo, amount_local: Uint128, receiver: String, ) -> Result, ContractError> { - // mint cw20 token if the mechanism is mint burn - let pair_mapping = ics20_denoms() - .load(storage, &ibc_denom) - .map_err(|_| ContractError::NotOnMappingList {})?; - - if pair_mapping.is_mint_burn { - match pair_mapping.asset_info { + if is_mint_burn { + match mint_asset_info { AssetInfo::NativeToken { denom } => { return Err(ContractError::Std(StdError::generic_err(format!( "Mapping token must be cw20 token. Got {}", @@ -646,46 +644,46 @@ pub fn build_mint_cw20_mapping_msg( } } -/// The gov contract can allow new contracts, or increase the gas limit on existing contracts. -/// It cannot block or reduce the limit to avoid forcible sticking tokens in the channel. -pub fn execute_allow( - deps: DepsMut, - _env: Env, - info: MessageInfo, - allow: AllowMsg, -) -> Result { - ADMIN.assert_admin(deps.as_ref(), &info.sender)?; - - let contract = deps.api.addr_validate(&allow.contract)?; - let set = AllowInfo { - gas_limit: allow.gas_limit, - }; - ALLOW_LIST.update(deps.storage, &contract, |old| { - if let Some(old) = old { - // we must ensure it increases the limit - match (old.gas_limit, set.gas_limit) { - (None, Some(_)) => return Err(ContractError::CannotLowerGas), - (Some(old), Some(new)) if new < old => return Err(ContractError::CannotLowerGas), - _ => {} - }; - } - Ok(AllowInfo { - gas_limit: allow.gas_limit, - }) - })?; +// /// The gov contract can allow new contracts, or increase the gas limit on existing contracts. +// /// It cannot block or reduce the limit to avoid forcible sticking tokens in the channel. +// pub fn execute_allow( +// deps: DepsMut, +// _env: Env, +// info: MessageInfo, +// allow: AllowMsg, +// ) -> Result { +// ADMIN.assert_admin(deps.as_ref(), &info.sender)?; - let gas = if let Some(gas) = allow.gas_limit { - gas.to_string() - } else { - "None".to_string() - }; +// let contract = deps.api.addr_validate(&allow.contract)?; +// let set = AllowInfo { +// gas_limit: allow.gas_limit, +// }; +// ALLOW_LIST.update(deps.storage, &contract, |old| { +// if let Some(old) = old { +// // we must ensure it increases the limit +// match (old.gas_limit, set.gas_limit) { +// (None, Some(_)) => return Err(ContractError::CannotLowerGas), +// (Some(old), Some(new)) if new < old => return Err(ContractError::CannotLowerGas), +// _ => {} +// }; +// } +// Ok(AllowInfo { +// gas_limit: allow.gas_limit, +// }) +// })?; + +// let gas = if let Some(gas) = allow.gas_limit { +// gas.to_string() +// } else { +// "None".to_string() +// }; - let res = Response::new() - .add_attribute("action", "allow") - .add_attribute("contract", allow.contract) - .add_attribute("gas_limit", gas); - Ok(res) -} +// let res = Response::new() +// .add_attribute("action", "allow") +// .add_attribute("contract", allow.contract) +// .add_attribute("gas_limit", gas); +// Ok(res) +// } /// The gov contract can allow new contracts, or increase the gas limit on existing contracts. /// It cannot block or reduce the limit to avoid forcible sticking tokens in the channel. diff --git a/contracts/cw-ics20-latest/src/ibc.rs b/contracts/cw-ics20-latest/src/ibc.rs index 49eb6ff..2426738 100644 --- a/contracts/cw-ics20-latest/src/ibc.rs +++ b/contracts/cw-ics20-latest/src/ibc.rs @@ -7,10 +7,9 @@ use cosmwasm_std::{ IbcChannelConnectMsg, IbcChannelOpenMsg, IbcEndpoint, IbcMsg, IbcOrder, IbcPacket, IbcPacketAckMsg, IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcReceiveResponse, IbcTimeout, Order, QuerierWrapper, Reply, Response, StdError, StdResult, Storage, SubMsg, SubMsgResult, - Timestamp, Uint128, WasmMsg, + Timestamp, Uint128, }; -use cw20::Cw20ExecuteMsg; use cw20_ics20_msg::converter::ConvertType; use cw20_ics20_msg::helper::{ denom_to_asset_info, get_prefix_decode_bech32, parse_asset_info_denom, @@ -466,8 +465,8 @@ fn handle_ibc_packet_receive_native_remote_chain( })); let mint_msg = build_mint_cw20_mapping_msg( - storage, - ibc_denom.clone(), + pair_mapping.is_mint_burn, + pair_mapping.asset_info, to_send.amount(), env.contract.address.to_string(), )?; @@ -1238,29 +1237,25 @@ pub fn handle_packet_refund( )?; // check if mint_burn mechanism, then mint token for packet sender, if not, send from contract - let cosmos_msg = if with_mint_burn && pair_mapping.is_mint_burn { - match pair_mapping.asset_info { - AssetInfo::NativeToken { denom } => { - return Err(ContractError::Std(StdError::generic_err(format!( - "Mapping token must be cw20 token. Got {}", - denom - )))); + let send_amount_msg = Amount::from_parts( + parse_asset_info_denom(pair_mapping.asset_info.to_owned()), + local_amount, + ) + .send_amount(packet_sender.to_string(), None); + let cosmos_msg = match build_mint_cw20_mapping_msg( + pair_mapping.is_mint_burn, + pair_mapping.asset_info, + local_amount, + packet_sender.to_string(), + )? { + Some(cosmos_msg) => { + if with_mint_burn { + cosmos_msg + } else { + send_amount_msg } - AssetInfo::Token { contract_addr } => CosmosMsg::Wasm(WasmMsg::Execute { - contract_addr: contract_addr.to_string(), - msg: to_binary(&Cw20ExecuteMsg::Mint { - recipient: packet_sender.to_string(), - amount: local_amount, - })?, - funds: vec![], - }), } - } else { - let to_send = Amount::from_parts( - parse_asset_info_denom(pair_mapping.asset_info), - local_amount, - ); - to_send.send_amount(packet_sender.to_string(), None) + None => send_amount_msg, }; // used submsg here & reply on error. This means that if the refund process fails => tokens will be locked in this IBC Wasm contract. We will manually handle that case. No retry diff --git a/contracts/cw-ics20-latest/src/msg.rs b/contracts/cw-ics20-latest/src/msg.rs index 4807e7f..8edb5af 100644 --- a/contracts/cw-ics20-latest/src/msg.rs +++ b/contracts/cw-ics20-latest/src/msg.rs @@ -50,7 +50,7 @@ pub enum ExecuteMsg { UpdateMappingPair(UpdatePairMsg), DeleteMappingPair(DeletePairMsg), /// This must be called by gov_contract, will allow a new cw20 token to be sent - Allow(AllowMsg), + // Allow(AllowMsg), /// Change the admin (must be called by current admin) UpdateConfig { admin: Option, diff --git a/contracts/cw-ics20-latest/src/testing/ibc_tests.rs b/contracts/cw-ics20-latest/src/testing/ibc_tests.rs index 793a584..c9e74f7 100644 --- a/contracts/cw-ics20-latest/src/testing/ibc_tests.rs +++ b/contracts/cw-ics20-latest/src/testing/ibc_tests.rs @@ -2715,12 +2715,6 @@ fn test_build_mint_cw20_mapping_msg() { let mut deps = setup(&["channel-3", "channel-7"], &[]); let ibc_denom = "cosmos"; let local_channel_id = "channel-3"; - let ibc_denom_keys = format!( - "wasm.{}/{}/{}", - mock_env().contract.address.to_string(), - local_channel_id, - ibc_denom - ); let asset_info = AssetInfo::Token { contract_addr: Addr::unchecked("cw20:foobar".to_string()), }; @@ -2728,16 +2722,7 @@ fn test_build_mint_cw20_mapping_msg() { let amount_local = Uint128::from(10000u128); let receiver = "receiver"; - // case 1: failed, not register in mapping lít - let res = build_mint_cw20_mapping_msg( - &deps.storage, - ibc_denom_keys.clone(), - amount_local, - receiver.to_string(), - ); - assert_eq!(res, Err(ContractError::NotOnMappingList)); - - // case 2: on mappinglist, but mapping mechanism is not mint burn + // case 1: on mappinglist, but mapping mechanism is not mint burn let mut update = UpdatePairMsg { local_channel_id: local_channel_id.to_string(), denom: ibc_denom.to_string(), @@ -2750,25 +2735,39 @@ fn test_build_mint_cw20_mapping_msg() { let info = mock_info("gov", &coins(1234567, "ucosm")); execute(deps.as_mut(), mock_env(), info, msg.clone()).unwrap(); let res = build_mint_cw20_mapping_msg( - &deps.storage, - ibc_denom_keys.clone(), + false, + asset_info.clone(), amount_local, receiver.to_string(), ); assert_eq!(res, Ok(None)); + // case 2: on mappinglist, is mint burn but asset info is native + let err = build_mint_cw20_mapping_msg( + true, + AssetInfo::NativeToken { + denom: "orai".to_string(), + } + .clone(), + amount_local, + receiver.to_string(), + ) + .unwrap_err(); + assert_eq!( + err, + ContractError::Std(StdError::generic_err(format!( + "Mapping token must be cw20 token. Got {}", + "orai" + ))) + ); + // case 3: got mint msg update.is_mint_burn = Some(true); let msg = ExecuteMsg::UpdateMappingPair(update.clone()); let info = mock_info("gov", &coins(1234567, "ucosm")); execute(deps.as_mut(), mock_env(), info, msg.clone()).unwrap(); - let res = build_mint_cw20_mapping_msg( - &deps.storage, - ibc_denom_keys.clone(), - amount_local, - receiver.to_string(), - ) - .unwrap(); + let res = + build_mint_cw20_mapping_msg(true, asset_info, amount_local, receiver.to_string()).unwrap(); assert_eq!( res, Some(CosmosMsg::Wasm(WasmMsg::Execute { @@ -2788,23 +2787,13 @@ fn test_build_burn_cw20_mapping_msg() { let mut deps = setup(&["channel-3", "channel-7"], &[]); let ibc_denom = "cosmos"; let local_channel_id = "channel-3"; - let ibc_denom_keys = format!( - "wasm.{}/{}/{}", - mock_env().contract.address.to_string(), - local_channel_id, - ibc_denom - ); let asset_info = AssetInfo::Token { contract_addr: Addr::unchecked("cw20:foobar".to_string()), }; let amount_local = Uint128::from(10000u128); - // case 1: failed, not register in mapping lít - let res = build_burn_cw20_mapping_msg(&deps.storage, ibc_denom_keys.clone(), amount_local); - assert_eq!(res, Err(ContractError::NotOnMappingList)); - - // case 2: on mappinglist, but mapping mechanism is not mint burn + // case 1: on mappinglist, but mapping mechanism is not mint burn let mut update = UpdatePairMsg { local_channel_id: local_channel_id.to_string(), denom: ibc_denom.to_string(), @@ -2816,16 +2805,33 @@ fn test_build_burn_cw20_mapping_msg() { let msg = ExecuteMsg::UpdateMappingPair(update.clone()); let info = mock_info("gov", &coins(1234567, "ucosm")); execute(deps.as_mut(), mock_env(), info, msg.clone()).unwrap(); - let res = build_burn_cw20_mapping_msg(&deps.storage, ibc_denom_keys.clone(), amount_local); + let res = build_burn_cw20_mapping_msg(false, asset_info.clone(), amount_local); assert_eq!(res, Ok(None)); + // case 2: on mappinglist, is mint burn but asset info is native + let err = build_burn_cw20_mapping_msg( + true, + AssetInfo::NativeToken { + denom: "orai".to_string(), + } + .clone(), + amount_local, + ) + .unwrap_err(); + assert_eq!( + err, + ContractError::Std(StdError::generic_err(format!( + "Mapping token must be cw20 token. Got {}", + "orai" + ))) + ); + // case 3: got mint msg update.is_mint_burn = Some(true); let msg = ExecuteMsg::UpdateMappingPair(update.clone()); let info = mock_info("gov", &coins(1234567, "ucosm")); execute(deps.as_mut(), mock_env(), info, msg.clone()).unwrap(); - let res = - build_burn_cw20_mapping_msg(&deps.storage, ibc_denom_keys.clone(), amount_local).unwrap(); + let res = build_burn_cw20_mapping_msg(true, asset_info.clone(), amount_local).unwrap(); assert_eq!( res, Some(CosmosMsg::Wasm(WasmMsg::Execute { From e92f33cf0a64ba887cc161bb44eb557af09883fe Mon Sep 17 00:00:00 2001 From: trung2891 Date: Tue, 26 Mar 2024 17:50:34 +0700 Subject: [PATCH 10/10] chore: remove mint msg into IncreaseChannelBalance --- .../artifacts/cw-ics20-latest.wasm | Bin 600188 -> 597511 bytes contracts/cw-ics20-latest/src/contract.rs | 39 ++- contracts/cw-ics20-latest/src/ibc.rs | 11 - .../cw-ics20-latest/src/testing/ibc_tests.rs | 330 ++++++++++-------- 4 files changed, 224 insertions(+), 156 deletions(-) diff --git a/contracts/cw-ics20-latest/artifacts/cw-ics20-latest.wasm b/contracts/cw-ics20-latest/artifacts/cw-ics20-latest.wasm index 45d95a75d71b3b6d55bd08547669186da50e4689..7743ccad9b7a4d8b12c341a2145ffea0d8fc1e1d 100644 GIT binary patch delta 171286 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