From 4eec1c1ae8a09fac38b73f0451101bf3b7ef112e Mon Sep 17 00:00:00 2001 From: Rootul P Date: Mon, 1 Jul 2024 11:05:59 -0600 Subject: [PATCH 01/40] docs: add v2 audit report (#3646) Closes https://github.com/celestiaorg/celestia-app/issues/3645 --- README.md | 9 +++++---- docs/audit/informal-systems-v2.pdf | Bin 0 -> 207684 bytes 2 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 docs/audit/informal-systems-v2.pdf diff --git a/README.md b/README.md index d0cc48f279..16c2d21e04 100644 --- a/README.md +++ b/README.md @@ -153,7 +153,8 @@ Package-specific READMEs aim to explain implementation details for developers th ## Audits -| Date | Auditor | Version | Report | -|------------|-----------------------------------------------|-------------------------------------------------------------------------------------|---------------------------------------------------------| -| 2023/9/15 | [Informal Systems](https://informal.systems/) | [v1.0.0-rc6](https://github.com/celestiaorg/celestia-app/releases/tag/v1.0.0-rc6) | [informal-systems.pdf](docs/audit/informal-systems.pdf) | -| 2023/10/17 | [Binary Builders](https://binary.builders/) | [v1.0.0-rc10](https://github.com/celestiaorg/celestia-app/releases/tag/v1.0.0-rc10) | [binary-builders.pdf](docs/audit/binary-builders.pdf) | +| Date | Auditor | Version | Report | +|------------|-----------------------------------------------|-------------------------------------------------------------------------------------|---------------------------------------------------------------| +| 2023/9/15 | [Informal Systems](https://informal.systems/) | [v1.0.0-rc6](https://github.com/celestiaorg/celestia-app/releases/tag/v1.0.0-rc6) | [informal-systems.pdf](docs/audit/informal-systems.pdf) | +| 2023/10/17 | [Binary Builders](https://binary.builders/) | [v1.0.0-rc10](https://github.com/celestiaorg/celestia-app/releases/tag/v1.0.0-rc10) | [binary-builders.pdf](docs/audit/binary-builders.pdf) | +| 2024/7/1 | [Informal Systems](https://informal.systems/) | [v2.0.0-rc1](https://github.com/celestiaorg/celestia-app/releases/tag/v2.0.0-rc1) | [informal-systems-v2.pdf](docs/audit/informal-systems-v2.pdf) | diff --git a/docs/audit/informal-systems-v2.pdf b/docs/audit/informal-systems-v2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..48e7bded121f8624475b862696ffa6e17ef5abc2 GIT binary patch literal 207684 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

4hz6iu-03=7z$zKEM^FF1{sd~72{)4HqS*9BIf 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

YdjinZVkXV|>?d#^ta_Lx-q?8wZF|ZFn}D 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ÐjWRVLzKu{YFxEeay;r3)@+Js-YU=W?2z>WciZNp8#SP*ekTX2TrwgsKngS zR5|#tLE#mbU@1_#`NTvE>HOritCI~jR#vv14a?Yv6_qE^;|eL~bKB%p3eUL%Rw#1( zug7?j3w0fx8(POvqF1xzBS=kv#qy5g6r}@W#_w=*8Gcifd;;Q3b5|j z_?yGCP~#gkl#@qU9r>F?|6fEpU7j)XMR;D5%|89$DKkio!cGBVjXunG*5;U`KIwn& zGGWMpMQ@)kGJG%Q3RcoT2z)s?1ff|PeG6z7rW~+{-_EtS1rx8 z9A0?hcfQQ+oSV*YlhivjGE2m)@zlUi$!|{&G9tKNWHnUSI$!LPL)g{*<-W2*h+dFe z3|offA`;0!$ZJ*>)SQ&-)nXON3LT@@_;Q(rDn(W)QH7_WU2c#f1s>};p?Bo4xE5h; zw`XhZBAfDX{B}jqthS`0y`4)CcIYpNJxUxbiPx{F!Ei-L`F2+tz#= zdfIp#zpS08yyQ1PTj;nRlc};ZGqXyt-3mv1o`dxkIRh*i zF>osxU`+pbEH}SA zr>jGy1gPoGUI>if`Vh4!Wcq-nbWW3y2p?sjn2gAB9Y(q-233Px2CMXG_=&kYpqB%g1eO?vHmxJHneV z#Oo(TDG0gsp*zZvDjN~1YO05H++lxvbl0sE|jZ|x9n#2w9MA0v`6 zf!4|xoiW|brdm+~;}12o4xZJeik)8G;)l@+6Z+QdHDfTV)##bpmiN^e9?0eq$`g=! z!^UjN^Ec?SVp}E5Tt6&b*f-GD@fM)HSO`uLrJgfObaM|JLbi_=xZA<*4(jc)Hgoi} zm)un=y&9U2O6O)H0mrf&T92e!YOe_uw6moz5z0F472_xt1V{rHCDpuXRrcXp!Xu}* zhIHGkTKWR(Lp-!+=bI;h)^YOG^Pfl2bBEjFjm&Q6y(I;E>O^|P#F*PbPfnXu>nY%K|m7OHiTkBmOd zXO^gNo$wZ_)dgyhN@yC%MvbQ7LzBHCvx6tS#FVn-N{sMY$MK&+-9XW8clGqRHmzOQ z=@4OVwoCT6PaG011xPu%^k>MCrymt#%~B|(wNJ@8TrB9%FPfBDM5RH!CMros7%x#b zc=7%k+E6>0qaJ0Ii!&BKWNABWYakK}(Nf>@lHBf!D-*YHjetwB5sdgPa-^%r)N1vE z95=TyY9d#Vo;{tSkb@>w&GAAE$GrJPS5>zM`pE57<=dpWb6c-ekq7j{TC5u{3)!`H zCH8qgX3MF6#8TQypVmPnr}|)7--ng#cez6SZ4o;M9dJ9k- z%zK33{=u)`mzQy9n<|vrjGneWFKmg89Nnd;<)?bbBEmpj`TN%|)e_x-pGQqOG!L3g zZ0cx`0!)cqg4vS#^<;NHzTF*oY!20rOF%67OzV48$jb?fnE5tU@ncfGh>@7Hs7xvX z>D38$oWLFP9`9`Ex?@HrFToyM)Z%^xu_ zL|uDy8z2rzGHscj1iwWrrh`NmpNM+A7 zO?y#lo-1`6NNyfRwhU@y+3H2*)5aeb$Ysp1rG)|asaajJCW91bi5r{tE_Q(3-(x}- zk6f<03{gl}gAhM1N*HLTFuU>V)n^n}V}J9WrXfi{Ytlu63K=YLplnhQKHSJ@idQJ+ zUhPj;?9qUvyVIJ`)`qPcHfd9VEFXB3vo9l&qsfn}Z2o(1hy@D~-7}hAYqaUWVF=aL zu%xT>#|_7Ec12LDntM#t5w$}=wiuw1N}oat+mx%TQ$40;>X>BRWAbuldBNAHP=n9& z$CfUOLDQ9VPm-4WMaLQlfk7DcL%zl4!o92_te&I6b~rsqh>; z1^dWhsJ9vNQIz)A{cmAT9Bs@c3N3u<>*?^SnS4@Zt~2+&YimF9qlWaJZGVMfO?mO} zmg2f#4h<5$%IXH~Gb(N4#*7#(VZ$Eol?m|)ohAOLm5$#Qk5&&I-l{djXwK~wLBnMc z_-tz3y;suv5Jw2~k3GfG}8G@J4yPX40plTC?0s-H5+%OBS3{CY$oDQ0%&K51N&6fdn? zLJ`5@vnt-}RF-fF65z}_o$jh;Q22~3g4``Q!b(e!>o*vXCt)@sF zniRI-Awdjp4dr3+zbyt5w_opfs|Ilak}3H-oEyE_2*b3h`h3C zT_nS`hYppv`mlwpO@5>_RJp7CejWRvzV_*3hb+DHCwg_s)DErNYRxqmUBSrDuB9r< z^YU7Ym^oQ4pH7mi0(n+IDJRNIaDZnp2U36?-tkPDJF}n1$3{+0#vKP0X2^0WPea1_ zIPR)%a2ZD$9H-4VvQ-@TMTQ{P<>bZ99AZTm#Gf06b-T}Qx2Xja`^V7=WulxllX*6@ z1iGW!$ZRpcBjlNdHXR!G<@JgEdW&pTYiCeWzGmg>2C>fIp$2NmShcinAp1e#`|dvt z7DPRpBtP&)vaVl|q4GF@*Q)Mmxn|u@uKJ6?llQI$U^llD+|p-v<>JIRhbc(GQhuCD z?<#jq_;Z9#>rT4(RLTmE&`E5cz8AQp{ym&VUoqQE-6z=)yBtMeAB`iR7{33-dowCV zZvNr5l@aIy-h3rQ|Hj?@P80J`+r+n4cbFhUeHZPS%@;R&7}-lO`LUYD@(fbLANZtv z>Ud&4DNSHx(gXf+t&FOl_TjGy!zY6iJb%X*jWbW|b^We)OhjY?51k?FE*s(P|0e)< z@J-mM6KMl_C&8#|Wn9H%+gv!`SSfz=zFAorbZMx)iL|Ae+2-ADaRPtc0O zF%(al(eDbeVfQ0)>Sz4lx{?Ogl@Iw6a1B@*tMsK(ysq2g( z?RV(GV+{Vr_+a3j2u6iltbXK*za%LWc9Awlb&9HSB1rIWGSRUS@%4ZNlpX~xTd~d$ zxa;Vf_RFk^Fp<{9km!trtPFizUwG5c*q0HIS}-D_>Yc_#Fz^`2V^@cbvA3%!2?TrT zjUx@$gmePyKs>NC!>UBY68wbt<9LDMhja8@5k0V9*ndaBlE_N1F^AHo^pjC|!8j=d zf4W6wnHI}~`@UUwLSBYl4bDOd(*}>)8TYZX3%nAFbuTZ;s&` z<{1j8451E2{z5bVHZ@LM$Zcdga+ulYI!Z2?5c~`O*LY%qx{z8GuHvx*|5Mo5=vI)hb^dOPs=zY#A~x$KPOu#h@(+J z#DziM4mUfZb*Z_SwKRM2*V9|a)7x}6i`!-U(NpJ9ZiXfyP<{Y7C~|ag1Brzi#8@N4P@beaLm4b)A*(;=cmj zg7gu~6HO+S%%A~&n1h})#I*~$8WenHlNk)NFo*gO-HIJoKBZDWC*?a4F#ZMk(-Zy% zCZi6(Vgy-;{Zl4Na-M?wm)j)YLaV&I3_-RYQ}=gPo!fWs6UCT9%2G%f%-gwQx2B+~H<+dTq$1#>ILl$U{yU=6{|O-=sCgT|q%lyn;(Y zYHeNd!q~pPHLhnE}WMZkRrI~(- zVRd{u$7TLts`H}VB&loWHkypnIH53Pq!Ni07r$Ni0A_e^d``T>8D!T5V1HI=i?MP2 z*#rn+pSv2{D)(m6QqCzjE|Ntd$(9$VGsDPTF3hD0m`6gk)W~&IkMVZNH|)!0E}>>d z!ShxA7RIk-fpo>_&3>$1yv0L_@$qXfqCu;;2V+6u!6E5(vCG;e&>nKr3Fr!Q0Om76 z<-@d7-=^2B>$>V4!teZT+yF(@zMV`&B{%30-36j?rIpdrki$^*XDN#gV6pajL@cYO zR!wtU;5FR4)tx0XC6iD+|FG+`XKXUubKFtZ25Dj;z;hft~`B4HL!Pe8$R zi?yug<{Kc_YF{qF6Q*2q>d%Hf7K;6+xjP|L)vkXYi6*X1y5fB;c*h#|cPY+50(B9E z+GTCSFmBW-h^?f#i|CZ9CE&)4-!3NAt%R75jh-tCd_FC1++#{Vdv7}B1ROO(nrJeg z_C-}c*KSa<9 zhj)=v7Qw1jM2-))(zfuBi=8!_uvCL*yUm__y@tXrJv@+LqWxZpf z+ejxn+e)h2WV$UUzrJpezl{Cf4dJmvJUBKPp^zlRePz3eUIP|@emWpvXo)&T-Q9iy!kVv)R@#rG)6Tq=w++c*}7=;lrN8T0^%LX zpK*&s`-`Y~&1i<cvU!oWNH^9 zG%0Gk(x^N(ZQY^HX8kR6;HJh2ka>sbDNi+JX(vy;XrPS*jCJu;M-AW|sI>M<*&j{K zA9!DOGe5L1tNP3%jPeTbi|cu;&n2$9oKi1%$F{xTKH@Z0rkSU2968BB%^W6p&*7dC z4Ev;=6GXYjg?LX(s>kfu_7}N2d5k{xKcCl=t+Eq0xqxHr)uR~S7m~&!%y%@*Dtiu0 zJNvL(>Si^zU~R5>Wi81VaI$ALJ&P^S+&Qa#96TK_&|Mzi8k(kcj?)o+!d|r}ej|~A ziAgC~sw-q@WK8;Ln(I1?e#SPwRy`c8L#-zCjYB=C5<1gUEL=i0<1~#l&O9?3%=V@> znU!aXL)^}aoh4O6yR#ixW92FHBLk0tGDYr~;Q*|qFXmV@lM7?OrDN#D8NRvI3znTT zQ-gy5WpyM(6O=ZLJrt)j^mI0#t~R>ut!U>2@!@xHT}0!8)3w`B*iaFom9uHS$JcLE zxu9Uvtl@Gw68|f;^*P7T*<-Pqfei;HMz41Eyb?ysgg@qZfw==or;&eGO**5^jC#zT zFxr#;=BtrHsm9czqmuH>o~~2YOFWZm9}r6%L{!Sg8N}YLD;{mR#P?(}WB4P6%hxL&WL`bp;%0@@_}l^QYas$CLi%TxQsRI6}lh?YaUWq=^h#rhjspGM;aEU^29XU(2qE7+2f-9jKYDhG=Zh19DcO!XWX76M)!jto*+kHR=q(i5vD&Nc zD|?YSvDAt2BhxJ7RU%AhD>LSBD)#pMu3(Sn0hR|`q6 zk+6aEdjert#fuWrqb1Y*me5J;5J6$UkGAGCU>(7HFyJk_@lSVW%(VEUAT)qvpNSX) zBNpTOKC2)RgBxvbc02j>+MU61H=Q*T1cVrX7GDQ=xV(~ixs)<5P1EY&S$7@ExYRd# zBT8{&L2@QF3ckoQIeWZ#kiXPvf=5Irtm<)Fd2DIwZxSTzLWqag&+3&=8Q=VQ0FG}j z$a$J!pZ1{;F2eujRl6md`}kP96&cw#+$kJ@Vl<1$FgtJh++yFpf3x*GAt_SXI9vDUY2xnqw8oCw@2!YsI`y8T7eRQd3{VI z?B$J_x6t30NYIrTLr~xtchkU6nbDPz+pq-iSe+_&(MjFMdm>a7z0fl*vueVN+W>9H zG~kN%ooJV39i&xGAfZW@A5luE;5&NQB!;nDf^MxU_TG1I^^N5m@9~mA5|5`$D^MC4 zC@$m-J!md8M4qi1Dl0MF#)oGPH#{25wC)KDP2M4VSH8NY&O7U^Rpt zov_Uakrj-U@$AVHYkEy|Xm+v-6?uA<9%`03i3z+ttP9t>3g0ZUq?$j=*bP*XW8yr& z@g9)@N0o;*P^KIzW3P=%!cQQ{sVMFORB9C{GV8XkkzJh_^(m&OcyCl*V^k#8#B4;e84W@Ag-G~!|D3Yn?seYb zgYSXUeka%$nUXP|s(S@|w~`280;`glq~+q+sY}SjW`eC6j4)j%KCkXN;;A0{c~N}2 zR=`M;@T0~>s8k|sweDDZ&aft8iJN1kV%jI5sNpTcs7qvus%PyHMk)ALATnY@Gd#ve z#jr^jniX*HN*V!hbAJ{k5RT!iOW~RlQ&D=;*4Oie0f};0p)Xim_^i!bN003v1g^$D zdtVQ%GS`k5*;-jfZRmpMyU^6WplB(yWB+tN{(sT`n3?~*{z+G1(rS<<$XM~G> zjabLwK0p$DX2a=Nm$)?PYE@%RiUUD#1FAr&hqCqaKsI_1uO_DOeom2@H#FKrM zUE$>QGu=b1ltp1NX%G)INyT)Yf%Bi#P0)2R^9el$B^0|g@4gQUs#00-`&9qGw{!YMJRS(>_;Iw?4rnwdJ8+8LWV^YSu?SUQ;+11#g4Ze~ViRz?m+CMFhUR#p}*Dh6REQ$v8g6Q#1Tlf8`% zp@N7Qp{Toqy%WIHiI9O%nu!fSC~j*c@xMEMPxSv9NWsb8#KqXuiBieb&_>?K>U&wv z{~GRleBgR2F`_z5Xuo0n)t!-T+TT_IbB>jE=Acl7GGdJRGwuJ z8Dut=tYQHshz8R!FJqkf?QR+BkPrDFVMe;ZL{6mY@6{BVi3Nuy0X{se0E%FY?j%YF zZEuM$)yO!6%H)hbQcT`o_)~PsL5HmdxCR1y{+>7*Q$tKp1iKWU=|rkNJn1(`$IZkj z+@VBLET>4sFh6XO)>i1Uj_A{2u71gPNdL33I5FP5*!NnVSkB%RoftB z0*yTr<{|}^6BsRk*pPmwVE3h3hySeGV;Vy~;B3O>+7LPnw?Q_PDmFl-CEo0NP5@KI zpTi`Exf4k|wmOvtND3w%hgv9#sL%6`yS5<`OW-l$|BR|EgzyAyScEUMBb$~o0C(M5e_0htd;}@;ehZ&Vg#UK2O|Biw$3ve4z^pviD*FtgCKfMQHEhKCML>Y z^b*D!uQo<6gXlFuLX6%eF+>f9(Mu3L;zjgMh?1zIw~X@n&RJ)jv)1{3K0o%o|LkY2 zXI*PQ_f4rHJ@+zLHH2J9DRS*_-ZwA34*wPX>g5Ia&+=ev2K}2|7M4hrDd7gT3nv)z zJD|9eRP%1u-hSFuv9;DHjoCOLOS@$MY|Y$o3h${K7Pk-@%HwMLCRfL--od6nUnAZ4 zoxOQ(p6~0H?r`WgB@R$ZRd;)hT=V1o(nj-&gSP`o`~!g*d_SnsEFbZIK3^G3=b!$O9zv(`F%tbx_^%(ivoEOU zL5QB|2KkY>W~yPu?YL^beQsdA$c)CqE$8@K6N7vct#=~VzL9UGw9W0~5XX4F9usFb>95sN>=Eo9m{MaRHHurI7d8$f8eqK#0yuOt! zs>Mt1fQ9;#FuGpmh_6X^By9ed@w@qojKhxZBcPmzK^QSVMpu!W>%+tuRYqICPb3f5&?k`QegG_1Iw%+D(3w#hoP6V0Be$rf0_#}T z@sX+QTV?IW>FNO|WM(SP@TbZ%iV@o3!Wjz;Zj|_hgx{mHtRrd+U(Qv}FGz@fmEkV`O<9ptaR(W_Z?Erl`R}ZzxJ8s9trN z-V?wNWq8DvCEPa&ZpkzjUGem?nC{-0Itd&h?BktAJ~X?>6Gj?Ycz^%ibHdG~EDBaM z`4TLfzro_EDBrMCZ&fual-}0%`uXGXo#@uu(Yj^mMbJK>UjNKLDK-4wSr7zL>ahK! z*R5iaJP#mY=}>d;G|1aH5xRp-JqjD9)3Zn1M1XVSECdU@WflBg2ETIk4snLGX)2%I z57w?u#%oUw=F9bj)5fKbI+?`1?sMij=~0bzWCH-p?jGeP-wOYr-J^qDz?B!b(SKca z`KRm)u|_#^z#*f6mU^C&JVK6xA*uex%{-U3r+6+la#xxqG12Dp)n&qOo-1!0A^NS5 zmbDVsxgEyjAb%?SHW!ouaI(K)t-^`D10Yl~CYYq|vPON#qk&*mY1T%cZW#yB`jiq& zf@dXR8+xrdh0CH*5eDjBir=iA2WoP@R7f7{sHrS#pr5U%sZuHcYfwF|bZUHZr;nv> z=O}AIA43AhL}U6nbUZHzKGk_Dk0B<;Gm9ndvGm@rF-0KYYkRoi5Tc|oPyU~0Y+Oi# z&_Bb8X=GCKy~1A~;H&wT$bHO+UxpW9Mu-> zE_8bu^`>ykr>PeL_h0;G5R0hl|M-``0?fL zA<1SbsQP9G+UHY)a0Zg}t{Dz180z<*~ebv_pnCV*9zM ztg-AM5Fh5&)lD(I8GN}s-DjD!`l(V`r1@v|BDSn5&gjl?`zFWMDEUzLsi$@-Wd_Y# z^-Df2$8;(o*P_XIpSX%`&Z<>TrrTj;P-T~}+uy|&PW|?KX0M$t01B^7uNL3AOAxqg z@@yu_`QFL2leeTk*=@b>oexo{3b!Ina<%Lf!^-u1eFsAqPa-5wf1sc7{bV0Hw$v}9 zw!)fO1s)v4V=P3Xw8q=<5{G8o@wosO+Z46Vh8ymU z=!+Q|U^Ha~>^?bd#?8|)>Bl;7pzga>=twf+7z@^&8dS-_MD?9Djz*i0U(g?y)%G&V zRSg~y0f2mP%{st(1w3^pV8_nKENf=XY+;rgtgHTKnpn za~th_>*nQ$jrvN*<*g!L%y-?(t&9Z~7h1<#-+AI|Nf}2&K3=&^O84Wt^OAuBx6Qck z%!p(#S{tmr@oA_{9e&jq&tbx$Y0bjN0%N%;^HhAit+td%iumh>l68!z(&;l~)8$8_ z@Z1?lEv+(BZ!UT24V-&&{!H&uIz`F7E5*PU6SeD%uQoP|uq2^vYm5RCe~`Q8;XfR5 ztS$sE$!0D#F_cEIEqL79YG}IJzPRw&lWX&3YkSp|tl@=kKG8ZHyUwQHUH!Zn8=S1$ zR|$e0jBEY6n_l^@5ewV3y=+eHzI;o1M34G{CwSc94g1x!ViyeTx&F6T=afYYDL)#1 zSW4@H7q_nb%-^+v0+(VR;Kd15pAFkL!gxvtVXY}muo^VKLpkXe?+KuoVxKCUNJ^a- zj5rK`P?EZAj};uC1e|hzQnc?#-^=DxTRAvu3$gh1+L`rBZ3pg>qdh;R~6(`Shc~{eC3R=F)QEv7E!CZ|3f5raHitX5@W%+LK*v&Vt{-`Z;L(w_0P ze5bVpxoEyYfX(lzo4a}?p`SV6_jSz2QsJ`32G7|c)O+L2g!XGAO<+J1ue#JOLAaBi zmv*nVVW;hLf+f~}kgKlZPkhyJ!vc+aBAt%a0}i$8Zl8mQrN7JlELJy1&g!(y<=(3& z&Av_8O;q(|zpOkU&VoV&;TYjY76xTUX;}yGbw%<~k;vidTT)EUB{BbU3w<$;NNvLC z&WVU{VG);JDZcD_(M5T!opFYWTxU2$K>%c_*4s??lX70ZfoaeTJ7P3o-RW|mhcbK= z`o14okc{2o9a+EBQZyeBLn+zv8G*Q7xX)pH+%T1dk46JV4+M_Dba&~Y*(+MK!(;6@ zp5`>o`q$@niFWI#+J-v)cUkAL4E3U0OzTSyf2{z>KNpZpg){X=H=UV;Am4H(yyl2( zRFIg}7ZbEa=)GvVj<{KQ8nqC<(iV4Zxo9`iD%8rYFAe}Xfa-`i~rg0SlQuzq&z31;OPg?J1 z{Z?O^Iq!!`wfu`Tt!t8y*ib6an9k-uZ)eoB-!$_&aY16(>7vL@Xir-aFo;%iwh9UM zM*bBotI6~0!5dg%y(v`{WFy2V*r`Bi2>jW2NQ!&t<@C5mMOQzgrl_liJrVfbL%PR3 zC`;g|1pGG*iAQuqs<90`zf~Whq_!M=LD^C zcp)<}=}uuCzh7r@iPydkq^1+|@+d$g)6BEDxZsp(X!wu6^Kai3jPr5EW1O&CS$GsN zSsTCL_-ja|W3RKL7)O@4B2Qs4FZNQ=l&%9s{$m;g_=kF^=v=`Z%(&Ae+{ z=U0Yz-evZ>QTF@|#Z#ps2dj-cwS{XaYLt})OQ~p{L{9rslm?4}`A(Ex^#FQ*Q_8Z& zZ*&exK{2<@&c&Enmjs72%R|ZAZ}3Hd(UBx#ugt?>D0Hfb=`$C%ifEc}^iXr&QPml7 zHn3npt|1k8k?oxwVLrv!p#oD``nhOoL6z4G3bX-A+XAJfWNdAvr9ifJAQ>BJIiL*~Ehh((x06CELZu{SP?A#8HfSjz z$`&MNV*^B4Tg%Bv+sUBhrEINb6wM_JF&M9F&3{8B!~X#ha*|RKMveit|L*mFc86rf z)wNlaID7WacE}#F>ib7&R){_^&r037%D-+m-1lA7oeMA8qr-JW`@a^*0e;&&bn6;uxQ%sxtgx;v z=I}ArZ7q&_>c)MPz+u71cJKI7o4a%Bl;2X#2aRCI`RKWZ(TS82S z?J@K{Klq>6y?;SeNqTvqL79752pOJVa(}6zeerxcBPPHLNZ;X?cnY(#6OI$)iBgk|i9?O}k;-#|4cs(qVqX&kqZ)P3HHFLe zKUx?36T${h;+xR*1(oPM1XKg5ihg?ace7{2Q^?WUFLQpt9=P8W?}9h5r7ueT9rxH> zh;@nMZ|tVWEw^^p2HKM)#kqK@3O21>Uha-gKl1n`NobtNt{|@Cg&()XBD^^wU4ER` zMaPqiuz06AdNLz#!Af?I^@lJ<>w;`&(Ok4M&@}F3@1|mxy6NlqO0w)lt)S?^U3rtL za@a=w$>X3{%&u6TnErxI80!qGo<`bV%S*-gu#IwxA-IAu0A=G6ChihFFhtuTc_Y~1 zD*V(s$8^%EpF6DkQ7PCvu(G6D`#Og0?a{+=e~T|E@1d&rcjQLCjI$Q#4L4LEG801A z*?o+V?3Mly*NAFL8$YTsZ)M4znYlWftylQ}xBrEgwWpWgHD#rd0)oLHc^V-hxSkr# FzW`TJRSEzA literal 0 HcmV?d00001 From 0e30a817741c426b654348019c7babfe4b88b0d7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2024 11:21:34 -0400 Subject: [PATCH 02/40] chore(deps): Bump actions/upload-artifact from 3 to 4 (#3647) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 3 to 4.

Release notes

Sourced from actions/upload-artifact's releases.

v4.0.0

What's Changed

The release of upload-artifact@v4 and download-artifact@v4 are major changes to the backend architecture of Artifacts. They have numerous performance and behavioral improvements.

ℹ️ However, this is a major update that includes breaking changes. Artifacts created with versions v3 and below are not compatible with the v4 actions. Uploads and downloads must use the same major actions versions. There are also key differences from previous versions that may require updates to your workflows.

For more information, please see:

  1. The changelog post.
  2. The README.
  3. The migration documentation.
  4. As well as the underlying npm package, @​actions/artifact documentation.

New Contributors

Full Changelog: https://github.com/actions/upload-artifact/compare/v3...v4.0.0

v3.1.3

What's Changed

Full Changelog: https://github.com/actions/upload-artifact/compare/v3...v3.1.3

v3.1.2

  • Update all @actions/* NPM packages to their latest versions- #374
  • Update all dev dependencies to their most recent versions - #375

v3.1.1

  • Update actions/core package to latest version to remove set-output deprecation warning #351

v3.1.0

What's Changed

Commits
  • 6546280 updating package version
  • c004fb4 Merge branch 'main' into eggyhead/use-artifact-v2.1.6
  • 90aba49 updating toolkit artifact dependency to 2.1.6
  • b06cde3 Merge pull request #563 from actions/eggyhead/release-4.3.2
  • 1746f4a Revert "updating to release 4.3.2"
  • 31685d0 updating to release 4.3.2
  • 18bf333 Merge pull request #562 from actions/eggyhead/update-artifact-v215
  • dac413b update package lock version
  • bb3b4a3 updating package version
  • 3e3da83 updating artifact and core dependencies
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/upload-artifact&package-manager=github_actions&previous-version=3&new-version=4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/test-interchain.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-interchain.yml b/.github/workflows/test-interchain.yml index 08233d86ef..f43b2a7a23 100644 --- a/.github/workflows/test-interchain.yml +++ b/.github/workflows/test-interchain.yml @@ -21,7 +21,7 @@ jobs: run: docker image save -o ${{ env.ARTIFACT_PATH }} ${{ env.DOCKER_IMAGE }} - name: Publish Docker image as artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{ env.ARTIFACT_NAME }} path: ${{ env.ARTIFACT_PATH }} From c691822f7e67b50f5a02235f085059cae98c7bac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2024 11:21:52 -0400 Subject: [PATCH 03/40] chore(deps): Bump actions/download-artifact from 3 to 4 (#3648) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 3 to 4.
Release notes

Sourced from actions/download-artifact's releases.

v4.0.0

What's Changed

The release of upload-artifact@v4 and download-artifact@v4 are major changes to the backend architecture of Artifacts. They have numerous performance and behavioral improvements.

ℹ️ However, this is a major update that includes breaking changes. Artifacts created with versions v3 and below are not compatible with the v4 actions. Uploads and downloads must use the same major actions versions. There are also key differences from previous versions that may require updates to your workflows.

For more information, please see:

  1. The changelog post.
  2. The README.
  3. The migration documentation.
  4. As well as the underlying npm package, @​actions/artifact documentation.

New Contributors

Full Changelog: https://github.com/actions/download-artifact/compare/v3...v4.0.0

v3.0.2

  • Bump @actions/artifact to v1.1.1 - actions/download-artifact#195
  • Fixed a bug in Node16 where if an HTTP download finished too quickly (<1ms, e.g. when it's mocked) we attempt to delete a temp file that has not been created yet actions/toolkit#1278

v3.0.1

Commits
  • 65a9edc Merge pull request #325 from bethanyj28/main
  • fdd1595 licensed
  • c13dba1 update @​actions/artifact dependency
  • 0daa75e Merge pull request #324 from actions/eggyhead/use-artifact-v2.1.6
  • 9c19ed7 Merge branch 'main' into eggyhead/use-artifact-v2.1.6
  • 3d3ea87 updating license
  • 89af5db updating artifact package v2.1.6
  • b4aefff Merge pull request #323 from actions/eggyhead/update-artifact-v215
  • 8caf195 package lock update
  • d7a2ec4 updating package version
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/download-artifact&package-manager=github_actions&previous-version=3&new-version=4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/test-interchain.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-interchain.yml b/.github/workflows/test-interchain.yml index f43b2a7a23..90ee2f9a50 100644 --- a/.github/workflows/test-interchain.yml +++ b/.github/workflows/test-interchain.yml @@ -40,7 +40,7 @@ jobs: go-version-file: 'go.mod' - name: Download artifact - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: ${{ env.ARTIFACT_NAME }} From dea16d5df7c02c4fffabc9e3386d9a2ee6784372 Mon Sep 17 00:00:00 2001 From: Rootul P Date: Tue, 2 Jul 2024 11:43:21 -0600 Subject: [PATCH 04/40] docs: fix index wrapper inconsistencies (#3635) Closes https://github.com/celestiaorg/celestia-app/issues/3632 Also removes a few sections about intermediate state roots b/c those haven't been implemented (and potentially will never be). Note: there are other references to intermediate state roots in the specs that we need to resolve so we still need to do https://github.com/celestiaorg/celestia-app/issues/3113 --- specs/src/specs/data_structures.md | 54 ++++++++---------------------- 1 file changed, 14 insertions(+), 40 deletions(-) diff --git a/specs/src/specs/data_structures.md b/specs/src/specs/data_structures.md index 0315633a63..5e3785f875 100644 --- a/specs/src/specs/data_structures.md +++ b/specs/src/specs/data_structures.md @@ -72,12 +72,11 @@ Implementations can prune rows containing only [tail padding](./consensus.md#res Data that is [erasure-coded](#erasure-coding) for [data availability checks](https://arxiv.org/abs/1809.09044). -| name | type | description | -|-----------------------------|---------------------------------------------------------|--------------------------------------------------------------------------------------------------------------| -| `transactionData` | [TransactionData](#transactiondata) | Transaction data. Transactions modify the validator set and balances, and pay fees for blobs to be included. | -| `intermediateStateRootData` | [IntermediateStateRootData](#intermediatestaterootdata) | Intermediate state roots used for fraud proofs. | -| `payForBlobData` | [PayForBlobData](#payforblobdata) | PayForBlob data. Transactions that pay for blobs to be included. | -| `blobData` | [BlobData](#blobdata) | Blob data. Blobs are app data. | +| name | type | description | +|------------------|-----------------------------------|-----------------------------------------------------------------------------------------------------------------------| +| `transactions` | [Transaction](#transaction) | Transactions are ordinary Cosmos SDK transactions. For example: they may modify the validator set and token balances. | +| `payForBlobData` | [PayForBlobData](#payforblobdata) | PayForBlob data. Transactions that pay for blobs to be included. | +| `blobData` | [BlobData](#blobdata) | Blob data is arbitrary user submitted data that will be published to the Celestia blockchain. | ### Commit @@ -326,7 +325,7 @@ Finally, the `availableDataRoot` of the block [Header](#header) is computed as t ### Arranging Available Data Into Shares -The previous sections described how some original data, arranged into a `k * k` matrix, can be extended into a `2k * 2k` matrix and committed to with NMT roots. This section specifies how [available data](#available-data) (which includes [transactions](#transactiondata), [intermediate state roots](#intermediatestaterootdata), PayForBlob transactions, and [blobs](#blobdata)) is arranged into the matrix in the first place. +The previous sections described how some original data, arranged into a `k * k` matrix, can be extended into a `2k * 2k` matrix and committed to with NMT roots. This section specifies how [available data](#available-data) (which includes [transactions](#transaction), PayForBlob transactions, and [blobs](#blobdata)) is arranged into the matrix in the first place. Note that each [share](./shares.md) only has a single namespace, and that the list of concatenated shares is lexicographically ordered by namespace. @@ -370,46 +369,21 @@ The blob share commitment rules may introduce empty shares that do not belong to ## Available Data -### TransactionData - -| name | type | description | -|-----------------------|-----------------------------------------------|-------------------------------| -| `wrappedTransactions` | [WrappedTransaction](#wrappedtransaction)`[]` | List of wrapped transactions. | - -#### WrappedTransaction - -Wrapped transactions include additional metadata by the block proposer that is committed to in the [available data matrix](#arranging-available-data-into-shares). - -| name | type | description | -|------------------|-----------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `index` | `uint64` | Index of this transaction in the list of wrapped transactions. This information is lost when splitting transactions into fixed-sized [shares](./shares.md), and needs to be re-added here for fraud proof support. Allows linking a transaction to an [intermediate state root](#wrappedintermediatestateroot). | -| `transaction` | [Transaction](#transaction) | Actual transaction. | -| `blobStartIndex` | `uint64` | _Optional, only used if transaction pays for a blob or padding_. Share index (in row-major order) of first share of blob this transaction pays for. Needed for light verification of proper blob inclusion. | - -#### Transaction +### Transaction Celestia transactions are Cosmos SDK [transactions](https://github.com/cosmos/cosmos-sdk/blob/v0.46.15/docs/core/transactions.md). ### PayForBlobData -### IntermediateStateRootData - -| name | type | description | -|---------------------------------|-------------------------------------------------------------------|-------------------------------------------| -| `wrappedIntermediateStateRoots` | [WrappedIntermediateStateRoot](#wrappedintermediatestateroot)`[]` | List of wrapped intermediate state roots. | - -#### WrappedIntermediateStateRoot - -| name | type | description | -|-------------------------|-------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `index` | `uint64` | Index of this intermediate state root in the list of intermediate state roots. This information is lost when splitting intermediate state roots into fixed-sized [shares](./shares.md), and needs to be re-added here for fraud proof support. Allows linking an intermediate state root to a [transaction](#wrappedtransaction). | -| `intermediateStateRoot` | [IntermediateStateRoot](#intermediatestateroot) | Intermediate state root. Used for fraud proofs. | +### IndexWrapper -#### IntermediateStateRoot +IndexWrapper are wrappers around PayForBlob transactions. They include additional metadata by the block proposer that is committed to in the [available data matrix](#arranging-available-data-into-shares). -| name | type | description | -|--------|---------------------------|------------------------------------------------------------------------------------------| -| `root` | [HashDigest](#hashdigest) | Root of intermediate state, which is composed of the global state and the validator set. | +| name | type | description | +|-----------------|------------|--------------------------------------------------------------------------------------------------------------------------------------------------------| +| `tx` | `bytes` | Actual transaction. | +| `share_indexes` | `[]uint32` | Share indexes (in row-major order) of the first share for each blob this transaction pays for. Needed for light verification of proper blob inclusion. | +| `type_id` | `string` | Type ID of the IndexWrapper transaction type. This is used for encoding and decoding IndexWrapper transactions. It is always set to `"INDX"`. | ### BlobData From 4e460c0d5cae0082cc92b5978932984241bbdd4a Mon Sep 17 00:00:00 2001 From: Rootul P Date: Tue, 2 Jul 2024 13:26:59 -0600 Subject: [PATCH 05/40] docs: clarify `CELESTIA_HOME` (#3644) Clarify the `CELESTIA_HOME` variable explanation b/c IMO the previous explanation wasn't totally clear. --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 16c2d21e04..52fbc287f4 100644 --- a/README.md +++ b/README.md @@ -84,9 +84,9 @@ celestia-appd --help ### Environment variables -| Variable | Explanation | Default value | Required | -|-----------------|------------------------------------|----------------------------------------------------------|----------| -| `CELESTIA_HOME` | Home directory for the application | User home dir. [Ref](https://pkg.go.dev/os#UserHomeDir). | Optional | +| Variable | Explanation | Default value | Required | +|-----------------|-------------------------------------------------------------------|----------------------------------------------------------|----------| +| `CELESTIA_HOME` | Where the application directory (`.celestia-app`) should be saved | [User home directory](https://pkg.go.dev/os#UserHomeDir) | Optional | ### Create your own single node devnet From 97121d0d43b9caac0ab17b0bb6ecd023553f27b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nina=20/=20=E1=83=9C=E1=83=98=E1=83=9C=E1=83=90?= Date: Wed, 3 Jul 2024 10:55:18 +0200 Subject: [PATCH 06/40] chore: bump celestia-core (#3654) ## Overview Bump to the latest release of celestia-core --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index d279501187..e5c42e9f36 100644 --- a/go.mod +++ b/go.mod @@ -255,5 +255,5 @@ replace ( github.com/cosmos/ledger-cosmos-go => github.com/cosmos/ledger-cosmos-go v0.12.4 github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 - github.com/tendermint/tendermint => github.com/celestiaorg/celestia-core v1.37.0-tm-v0.34.29 + github.com/tendermint/tendermint => github.com/celestiaorg/celestia-core v1.38.0-tm-v0.34.29 ) diff --git a/go.sum b/go.sum index 4c95bc25cb..c9acaf11b4 100644 --- a/go.sum +++ b/go.sum @@ -320,8 +320,8 @@ github.com/celestiaorg/bittwister v0.0.0-20231213180407-65cdbaf5b8c7 h1:nxplQi8w github.com/celestiaorg/bittwister v0.0.0-20231213180407-65cdbaf5b8c7/go.mod h1:1EF5MfOxVf0WC51Gb7pJ6bcZxnXKNAf9pqWtjgPBAYc= github.com/celestiaorg/blobstream-contracts/v3 v3.1.0 h1:h1Y4V3EMQ2mFmNtWt2sIhZIuyASInj1a9ExI8xOsTOw= github.com/celestiaorg/blobstream-contracts/v3 v3.1.0/go.mod h1:x4DKyfKOSv1ZJM9NwV+Pw01kH2CD7N5zTFclXIVJ6GQ= -github.com/celestiaorg/celestia-core v1.37.0-tm-v0.34.29 h1:9nJDE37cTg/Cx+f4FS2g7yYeoLrsaNJg36XsQ47sS1A= -github.com/celestiaorg/celestia-core v1.37.0-tm-v0.34.29/go.mod h1:IIdMu9gnDtjUmZkFuBN4Bf11z/rBtlL2rtwbQxdbRAU= +github.com/celestiaorg/celestia-core v1.38.0-tm-v0.34.29 h1:HwbA4OegRvXX0aNchBA7Cmu+oIxnH7xRcOhISuDP0ak= +github.com/celestiaorg/celestia-core v1.38.0-tm-v0.34.29/go.mod h1:MyElURdWAOJkOp84WZnfEUJ+OLvTwOOHG2lbK9E8XRI= github.com/celestiaorg/cosmos-sdk v1.23.0-sdk-v0.46.16 h1:N2uETI13szEKnGAdKhtTR0EsrpcW0AwRKYER74WLnuw= github.com/celestiaorg/cosmos-sdk v1.23.0-sdk-v0.46.16/go.mod h1:Bpl1LSWiDpQumgOhhMTZBMopqa0j7fRasIhvTZB44P0= github.com/celestiaorg/go-square v1.1.0 h1:K4tBL5PCJwDtpBfyDxxZ3N962aC9VYb5/bw3LjagEtY= From 8caa5807df8d15477554eba953bd056ae72d4503 Mon Sep 17 00:00:00 2001 From: Callum Waters Date: Wed, 3 Jul 2024 15:35:23 +0200 Subject: [PATCH 07/40] chore!: rename tx option for better clarity (#3649) We had an instance of someone putting the fee as the second argument instead of the gas price. I realised having `SetFee` in the function signature is misleading so I'm proposing to change it --- app/errors/insufficient_gas_price_test.go | 5 ++--- app/test/big_blob_test.go | 2 +- app/test/fuzz_abci_test.go | 4 ++-- app/test/priority_test.go | 2 +- pkg/user/e2e_test.go | 2 +- pkg/user/tx_client.go | 2 +- pkg/user/tx_options.go | 11 ++--------- x/blob/types/estimate_gas_test.go | 8 ++------ 8 files changed, 12 insertions(+), 24 deletions(-) diff --git a/app/errors/insufficient_gas_price_test.go b/app/errors/insufficient_gas_price_test.go index 57b32c0c20..be501b701f 100644 --- a/app/errors/insufficient_gas_price_test.go +++ b/app/errors/insufficient_gas_price_test.go @@ -26,7 +26,7 @@ import ( func TestInsufficientMinGasPriceIntegration(t *testing.T) { var ( gasLimit uint64 = 1_000_000 - feeAmount int64 = 10 + feeAmount uint64 = 10 gasPrice = float64(feeAmount) / float64(gasLimit) ) account := "test" @@ -40,14 +40,13 @@ func TestInsufficientMinGasPriceIntegration(t *testing.T) { signer, err := user.NewSigner(kr, enc.TxConfig, testutil.ChainID, appconsts.LatestVersion, user.NewAccount(account, acc.GetAccountNumber(), acc.GetSequence())) require.NoError(t, err) - fee := sdk.NewCoins(sdk.NewCoin(app.BondDenom, sdk.NewInt(feeAmount))) b, err := blob.NewBlob(namespace.RandomNamespace(), []byte("hello world"), 0) require.NoError(t, err) msg, err := blob.NewMsgPayForBlobs(signer.Account(account).Address().String(), appconsts.LatestVersion, b) require.NoError(t, err) - rawTx, err := signer.CreateTx([]sdk.Msg{msg}, user.SetGasLimit(gasLimit), user.SetFeeAmount(fee)) + rawTx, err := signer.CreateTx([]sdk.Msg{msg}, user.SetGasLimit(gasLimit), user.SetFee(feeAmount)) require.NoError(t, err) decorator := ante.NewDeductFeeDecorator(testApp.AccountKeeper, testApp.BankKeeper, testApp.FeeGrantKeeper, nil) diff --git a/app/test/big_blob_test.go b/app/test/big_blob_test.go index 8e23e8f6c6..e3cd56e84c 100644 --- a/app/test/big_blob_test.go +++ b/app/test/big_blob_test.go @@ -80,7 +80,7 @@ func (s *BigBlobSuite) TestErrBlobsTooLarge() { s.Run(tc.name, func() { subCtx, cancel := context.WithTimeout(s.cctx.GoContext(), 30*time.Second) defer cancel() - res, err := txClient.SubmitPayForBlob(subCtx, []*blob.Blob{tc.blob}, user.SetGasLimitAndFee(1e9, appconsts.DefaultMinGasPrice)) + res, err := txClient.SubmitPayForBlob(subCtx, []*blob.Blob{tc.blob}, user.SetGasLimitAndGasPrice(1e9, appconsts.DefaultMinGasPrice)) require.Error(t, err) require.NotNil(t, res) require.Equal(t, tc.want, res.Code, res.Logs) diff --git a/app/test/fuzz_abci_test.go b/app/test/fuzz_abci_test.go index c048e38917..afbc1e698f 100644 --- a/app/test/fuzz_abci_test.go +++ b/app/test/fuzz_abci_test.go @@ -104,7 +104,7 @@ func TestPrepareProposalConsistency(t *testing.T) { true, testutil.ChainID, accounts[:tt.count], - user.SetGasLimitAndFee(1_000_000_000, 0.1), + user.SetGasLimitAndGasPrice(1_000_000_000, 0.1), ) // create 100 send transactions sendTxs := testutil.SendTxsWithAccounts( @@ -116,7 +116,7 @@ func TestPrepareProposalConsistency(t *testing.T) { accounts[0], accounts[len(accounts)-sendTxCount:], testutil.ChainID, - user.SetGasLimitAndFee(1_000_000, 0.1), + user.SetGasLimitAndGasPrice(1_000_000, 0.1), ) txs = append(txs, sendTxs...) diff --git a/app/test/priority_test.go b/app/test/priority_test.go index 5a89ca7cea..c695615611 100644 --- a/app/test/priority_test.go +++ b/app/test/priority_test.go @@ -90,7 +90,7 @@ func (s *PriorityTestSuite) TestPriorityByGasPrice() { s.cctx.GoContext(), accName, blobs, - user.SetGasLimitAndFee(gasLimit, gasPrice), + user.SetGasLimitAndGasPrice(gasLimit, gasPrice), ) require.NoError(t, err) require.Equal(t, abci.CodeTypeOK, resp.Code, resp.RawLog) diff --git a/pkg/user/e2e_test.go b/pkg/user/e2e_test.go index 3206e77b2a..7caf8c42a6 100644 --- a/pkg/user/e2e_test.go +++ b/pkg/user/e2e_test.go @@ -49,7 +49,7 @@ func TestConcurrentTxSubmission(t *testing.T) { wg.Add(1) go func(b *blob.Blob) { defer wg.Done() - _, err := txClient.SubmitPayForBlob(subCtx, []*blob.Blob{b}, user.SetGasLimitAndFee(500_000, appconsts.DefaultMinGasPrice)) + _, err := txClient.SubmitPayForBlob(subCtx, []*blob.Blob{b}, user.SetGasLimitAndGasPrice(500_000, appconsts.DefaultMinGasPrice)) if err != nil && !errors.Is(err, context.Canceled) { // only catch the first error select { diff --git a/pkg/user/tx_client.go b/pkg/user/tx_client.go index b8818a7c89..7897f0e578 100644 --- a/pkg/user/tx_client.go +++ b/pkg/user/tx_client.go @@ -375,7 +375,7 @@ func (client *TxClient) retryBroadcastingTx(ctx context.Context, txBytes []byte) opts = append(opts, SetMemo(memo)) } if fee := tx.GetFee(); fee != nil { - opts = append(opts, SetFeeAmount(fee)) + opts = append(opts, SetFee(fee.AmountOf(appconsts.BondDenom).Uint64())) } if gas := tx.GetGas(); gas > 0 { opts = append(opts, SetGasLimit(gas)) diff --git a/pkg/user/tx_options.go b/pkg/user/tx_options.go index e62f614a61..53ec78513f 100644 --- a/pkg/user/tx_options.go +++ b/pkg/user/tx_options.go @@ -18,13 +18,6 @@ func SetGasLimit(limit uint64) TxOption { } } -func SetFeeAmount(fees sdk.Coins) TxOption { - return func(builder sdkclient.TxBuilder) sdkclient.TxBuilder { - builder.SetFeeAmount(fees) - return builder - } -} - func SetFee(fees uint64) TxOption { return func(builder sdkclient.TxBuilder) sdkclient.TxBuilder { builder.SetFeeAmount(sdk.NewCoins(sdk.NewCoin(appconsts.BondDenom, sdk.NewInt(int64(fees))))) @@ -67,10 +60,10 @@ func SetFeeGranter(feeGranter sdk.AccAddress) TxOption { } } -// SetGasLimitAndFee sets the gas limit and fee using the provided gas price and +// SetGasLimitAndGasPrice sets the gas limit and fee using the provided gas price and // gas limit. Note that this could overwrite or be overwritten by other // conflicting TxOptions. -func SetGasLimitAndFee(gasLimit uint64, gasPrice float64) TxOption { +func SetGasLimitAndGasPrice(gasLimit uint64, gasPrice float64) TxOption { return func(builder sdkclient.TxBuilder) sdkclient.TxBuilder { builder.SetGasLimit(gasLimit) builder.SetFeeAmount( diff --git a/x/blob/types/estimate_gas_test.go b/x/blob/types/estimate_gas_test.go index 44d6c450ec..bb13c4b9ed 100644 --- a/x/blob/types/estimate_gas_test.go +++ b/x/blob/types/estimate_gas_test.go @@ -4,7 +4,6 @@ import ( "fmt" "testing" - "cosmossdk.io/math" "github.com/celestiaorg/celestia-app/v2/app" "github.com/celestiaorg/celestia-app/v2/app/encoding" "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" @@ -16,7 +15,6 @@ import ( "github.com/stretchr/testify/require" blobtypes "github.com/celestiaorg/celestia-app/v2/x/blob/types" - sdk "github.com/cosmos/cosmos-sdk/types" abci "github.com/tendermint/tendermint/abci/types" tmrand "github.com/tendermint/tendermint/libs/rand" ) @@ -44,8 +42,7 @@ func TestPFBGasEstimation(t *testing.T) { require.NoError(t, err) blobs := blobfactory.ManyRandBlobs(rand, tc.blobSizes...) gas := blobtypes.DefaultEstimateGas(toUint32(tc.blobSizes)) - fee := sdk.NewCoins(sdk.NewCoin(app.BondDenom, math.NewInt(int64(gas)))) - tx, _, err := signer.CreatePayForBlobs(accnts[0], blobs, user.SetGasLimit(gas), user.SetFeeAmount(fee)) + tx, _, err := signer.CreatePayForBlobs(accnts[0], blobs, user.SetGasLimitAndGasPrice(gas, appconsts.DefaultMinGasPrice)) require.NoError(t, err) blobTx, ok := blob.UnmarshalBlobTx(tx) require.True(t, ok) @@ -88,8 +85,7 @@ func FuzzPFBGasEstimation(f *testing.F) { require.NoError(t, err) blobs := blobfactory.ManyRandBlobs(rand, blobSizes...) gas := blobtypes.DefaultEstimateGas(toUint32(blobSizes)) - fee := sdk.NewCoins(sdk.NewCoin(app.BondDenom, math.NewInt(int64(gas)))) - tx, _, err := signer.CreatePayForBlobs(accnts[0], blobs, user.SetGasLimit(gas), user.SetFeeAmount(fee)) + tx, _, err := signer.CreatePayForBlobs(accnts[0], blobs, user.SetGasLimitAndGasPrice(gas, appconsts.DefaultMinGasPrice)) require.NoError(t, err) blobTx, ok := blob.UnmarshalBlobTx(tx) require.True(t, ok) From 8fa5264a502be52194c103690cf0e17b43056742 Mon Sep 17 00:00:00 2001 From: Rootul P Date: Wed, 3 Jul 2024 16:37:22 -0600 Subject: [PATCH 08/40] ci: enable backporting to v2.x (#3658) --- .github/mergify.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/mergify.yml b/.github/mergify.yml index c78c248ae8..1e60d88bb2 100644 --- a/.github/mergify.yml +++ b/.github/mergify.yml @@ -7,3 +7,11 @@ pull_request_rules: backport: branches: - v1.x + - name: backport patches to v2.x branch + conditions: + - base=main + - label=backport:v2.x + actions: + backport: + branches: + - v2.x From 1ce822cec4dd540c7bff7ca20d1c909c208c2b2b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Jul 2024 13:38:41 +0200 Subject: [PATCH 09/40] chore(deps): Bump github.com/ethereum/go-ethereum from 1.14.5 to 1.14.6 (#3656) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [github.com/ethereum/go-ethereum](https://github.com/ethereum/go-ethereum) from 1.14.5 to 1.14.6.
Release notes

Sourced from github.com/ethereum/go-ethereum's releases.

Talaria (v1.14.6)

Geth v1.14.6 is a maintenance release, but it does ship with the experimental witness building validation code used in @​karalabe's "cross validation" proposal. Note that the engine API part is not included in this release.


Shipped features:

  • Add stateless witness builder and (self-)cross validator (#29719, #29807, #29970, #30024)
  • Set a 2KB hard limit for p2p handshake messages (#30029)
  • Improved display of database statistics (#29948)

Shipped bugfixes:

  • Fix issue in which the beacon root contract balance would not be saved in developer mode, causing an error on restart (#29963)
  • Fix shutdown crash when geth runs in blsync mode (#29946)
  • Fix data races in snapshot access (#30001, #30011)
  • Fix out of bounds access in json unmarshalling (#30014)
  • Add missing lock in peer discovery (#29960)

For a full rundown of the changes please consult the Geth 1.14.6 release milestone.


As with all our previous releases, you can find the:

Commits
  • aadddf3 params: release Geth v1.14.6
  • 0905660 core/state: fix inconsistent verkle test error messages (#29753)
  • 41abab9 build: add check for stale generated files (#30037)
  • a4e338f accounts/usbwallet/trezor: upgrade to generate with protoc 27.1 (#30058)
  • 7cfff30 rpc: truncate call error data logs (#30028)
  • 06f1d07 all: replace division with right shift if possible (#29911)
  • 4939c25 cmd/evm/internal/t8ntool: log writeTraceResult error message (#30038)
  • 36d67be core/txpool/blobpool: improve newPriceHeap function (#30050)
  • 19c3c1e triedb/pathdb: fix flaky test in pathdb (#29901)
  • 045b971 trie: relocate state execution logic into pathdb package (#29861)
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/ethereum/go-ethereum&package-manager=go_modules&previous-version=1.14.5&new-version=1.14.6)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index e5c42e9f36..8d5bdff8da 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,7 @@ require ( github.com/cosmos/gogoproto v1.5.0 github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v6 v6.1.2 github.com/cosmos/ibc-go/v6 v6.2.2 - github.com/ethereum/go-ethereum v1.14.5 + github.com/ethereum/go-ethereum v1.14.6 github.com/gogo/protobuf v1.3.3 github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.4 diff --git a/go.sum b/go.sum index c9acaf11b4..14e0795c43 100644 --- a/go.sum +++ b/go.sum @@ -378,12 +378,14 @@ github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWH github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= -github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= +github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= +github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v1.1.0 h1:pcFh8CdCIt2kmEpK0OIatq67Ln9uGDYY3d5XnE0LJG4= -github.com/cockroachdb/pebble v1.1.0/go.mod h1:sEHm5NOXxyiAoKWhoFxT8xMgd/f3RA6qUqQ1BXKrh2E= +github.com/cockroachdb/pebble v1.1.1 h1:XnKU22oiCLy2Xn8vp1re67cXg4SAasg/WDt1NtcRFaw= +github.com/cockroachdb/pebble v1.1.1/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU= github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= @@ -521,8 +523,8 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.10.17/go.mod h1:Lt5WzjM07XlXc95YzrhosmR4J9Ahd6X2wyEV2SvGhk0= -github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQnfvjpw= -github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= +github.com/ethereum/go-ethereum v1.14.6 h1:ZTxnErSopkDyxdvB8zW/KcK+/AVrdil/TzoWXVKaaC8= +github.com/ethereum/go-ethereum v1.14.6/go.mod h1:hglUZo/5pVIYXNyYjWzsAUDpT/zI+WbWo/Nih7ot+G0= github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= @@ -555,8 +557,8 @@ github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqG github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= -github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= -github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= +github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= +github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= From 1be58c1c94efcc31ca63be39d95b4be41e19125c Mon Sep 17 00:00:00 2001 From: Rootul P Date: Thu, 4 Jul 2024 08:38:50 -0400 Subject: [PATCH 10/40] chore(deps): upgrade to celestia-core v1.38.0 (#3659) --- test/interchain/go.mod | 2 +- test/interchain/go.sum | 4 ++-- test/testground/go.mod | 2 +- test/testground/go.sum | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/test/interchain/go.mod b/test/interchain/go.mod index a176585df7..5cb5dadc03 100644 --- a/test/interchain/go.mod +++ b/test/interchain/go.mod @@ -229,5 +229,5 @@ replace ( github.com/docker/docker => github.com/docker/docker v24.0.1+incompatible github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 - github.com/tendermint/tendermint => github.com/celestiaorg/celestia-core v1.37.0-tm-v0.34.29 + github.com/tendermint/tendermint => github.com/celestiaorg/celestia-core v1.38.0-tm-v0.34.29 ) diff --git a/test/interchain/go.sum b/test/interchain/go.sum index 1a2d3df0af..4b2e1eacf9 100644 --- a/test/interchain/go.sum +++ b/test/interchain/go.sum @@ -249,8 +249,8 @@ github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOF github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce h1:YtWJF7RHm2pYCvA5t0RPmAaLUhREsKuKd+SLhxFbFeQ= github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= -github.com/celestiaorg/celestia-core v1.37.0-tm-v0.34.29 h1:9nJDE37cTg/Cx+f4FS2g7yYeoLrsaNJg36XsQ47sS1A= -github.com/celestiaorg/celestia-core v1.37.0-tm-v0.34.29/go.mod h1:IIdMu9gnDtjUmZkFuBN4Bf11z/rBtlL2rtwbQxdbRAU= +github.com/celestiaorg/celestia-core v1.38.0-tm-v0.34.29 h1:HwbA4OegRvXX0aNchBA7Cmu+oIxnH7xRcOhISuDP0ak= +github.com/celestiaorg/celestia-core v1.38.0-tm-v0.34.29/go.mod h1:MyElURdWAOJkOp84WZnfEUJ+OLvTwOOHG2lbK9E8XRI= github.com/celestiaorg/cosmos-sdk v1.23.0-sdk-v0.46.16 h1:N2uETI13szEKnGAdKhtTR0EsrpcW0AwRKYER74WLnuw= github.com/celestiaorg/cosmos-sdk v1.23.0-sdk-v0.46.16/go.mod h1:Bpl1LSWiDpQumgOhhMTZBMopqa0j7fRasIhvTZB44P0= github.com/celestiaorg/nmt v0.21.0 h1:81MBqxNn3orByoiCtdNVjwi5WsLgMkzHwP02ZMhTBHM= diff --git a/test/testground/go.mod b/test/testground/go.mod index 552c7f872b..06c072a8c6 100644 --- a/test/testground/go.mod +++ b/test/testground/go.mod @@ -223,5 +223,5 @@ replace ( github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 github.com/jhump/protoreflect => github.com/jhump/protoreflect v1.9.0 github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 - github.com/tendermint/tendermint => github.com/celestiaorg/celestia-core v1.37.0-tm-v0.34.29 + github.com/tendermint/tendermint => github.com/celestiaorg/celestia-core v1.38.0-tm-v0.34.29 ) diff --git a/test/testground/go.sum b/test/testground/go.sum index d8d4a7985f..8547d33af9 100644 --- a/test/testground/go.sum +++ b/test/testground/go.sum @@ -335,8 +335,8 @@ github.com/celestiaorg/blobstream-contracts/v3 v3.1.0 h1:h1Y4V3EMQ2mFmNtWt2sIhZI github.com/celestiaorg/blobstream-contracts/v3 v3.1.0/go.mod h1:x4DKyfKOSv1ZJM9NwV+Pw01kH2CD7N5zTFclXIVJ6GQ= github.com/celestiaorg/celestia-app v1.0.0-rc0.0.20240304150808-f0a1f87c0253 h1:qU6+TO11VlTtYoSRWQ5DrKEH4noABBGGgBP0Eg08jr4= github.com/celestiaorg/celestia-app v1.0.0-rc0.0.20240304150808-f0a1f87c0253/go.mod h1:z3gMQZkUUe2MYrQQGnrYy+gDP0QpX0f5EPWtVNM0u/E= -github.com/celestiaorg/celestia-core v1.37.0-tm-v0.34.29 h1:9nJDE37cTg/Cx+f4FS2g7yYeoLrsaNJg36XsQ47sS1A= -github.com/celestiaorg/celestia-core v1.37.0-tm-v0.34.29/go.mod h1:IIdMu9gnDtjUmZkFuBN4Bf11z/rBtlL2rtwbQxdbRAU= +github.com/celestiaorg/celestia-core v1.38.0-tm-v0.34.29 h1:HwbA4OegRvXX0aNchBA7Cmu+oIxnH7xRcOhISuDP0ak= +github.com/celestiaorg/celestia-core v1.38.0-tm-v0.34.29/go.mod h1:MyElURdWAOJkOp84WZnfEUJ+OLvTwOOHG2lbK9E8XRI= github.com/celestiaorg/cosmos-sdk v1.23.0-sdk-v0.46.16 h1:N2uETI13szEKnGAdKhtTR0EsrpcW0AwRKYER74WLnuw= github.com/celestiaorg/cosmos-sdk v1.23.0-sdk-v0.46.16/go.mod h1:Bpl1LSWiDpQumgOhhMTZBMopqa0j7fRasIhvTZB44P0= github.com/celestiaorg/go-square v1.0.1 h1:LEG1zrw4i03VBMElQF8GAbKYgh1bT1uGzWxasU2ePuo= From 3fafc00e0bdb92368b30063addb6639751208641 Mon Sep 17 00:00:00 2001 From: Sanaz Taheri <35961250+staheri14@users.noreply.github.com> Date: Fri, 5 Jul 2024 11:32:35 -0700 Subject: [PATCH 11/40] chore: fixes the link to namespace implementation (#3653) This link was previously fixed, but apparently, the file for namespace implementation has been moved again (the directory name has changed). Hence, here is the new fix. --- specs/src/specs/namespace.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/specs/src/specs/namespace.md b/specs/src/specs/namespace.md index 276af50fe3..7423c91b53 100644 --- a/specs/src/specs/namespace.md +++ b/specs/src/specs/namespace.md @@ -94,7 +94,8 @@ Among the potential consequences is the _Woods Attack_, as elaborated in this fo ## Implementation -See [go-square/namespace](https://github.com/celestiaorg/go-square/blob/main/shares/namespace.go). +See the [namespace implementation in go-square](https://github.com/celestiaorg/go-square/blob/be3c2801e902a0f90f694c062b9c4e6a7e01154e/namespace/namespace.go). +For the most recent version, which may not reflect the current specifications, refer to [the latest namespace code](https://github.com/celestiaorg/go-square/blob/main/share/namespace.go). ## Go Definition From de24826acb73d772b871d2c13b37f4bb9eafd99b Mon Sep 17 00:00:00 2001 From: Evan Forbes <42654277+evan-forbes@users.noreply.github.com> Date: Mon, 8 Jul 2024 12:20:45 -0500 Subject: [PATCH 12/40] chore!: delete testground (#3666) ## Overview removes testground as its no longer useful ![testground is gone](https://github.com/celestiaorg/celestia-app/assets/42654277/15ae5433-8af2-41c7-9f74-bf23bd3a8fee) --- Makefile | 2 - go.work.example | 1 - pkg/appconsts/testground/app_consts.go | 10 - pkg/appconsts/versioned_consts.go | 11 +- pkg/appconsts/versioned_consts_test.go | 9 - test/testground/Dockerfile | 89 - test/testground/README.md | 112 - .../compositions/standard/plan.toml | 56 - .../compositions/unbounded/cat.toml | 56 - .../compositions/unbounded/control.toml | 56 - .../compositions/unbounded/no_mempool.toml | 56 - test/testground/compositions/utils.go | 105 - test/testground/go.mod | 227 -- test/testground/go.sum | 2262 ----------------- test/testground/main.go | 14 - test/testground/manifest.toml | 48 - test/testground/network/command.go | 156 -- test/testground/network/command_test.go | 105 - test/testground/network/configurators.go | 144 -- test/testground/network/consensus_node.go | 335 --- test/testground/network/entry_point.go | 63 - test/testground/network/experiments.go | 94 - test/testground/network/follower.go | 169 -- test/testground/network/leader.go | 299 --- test/testground/network/params.go | 206 -- test/testground/network/role.go | 53 - test/testground/network/sync.go | 223 -- test/util/testnode/config.go | 2 +- 28 files changed, 3 insertions(+), 4960 deletions(-) delete mode 100644 pkg/appconsts/testground/app_consts.go delete mode 100644 test/testground/Dockerfile delete mode 100644 test/testground/README.md delete mode 100644 test/testground/compositions/standard/plan.toml delete mode 100644 test/testground/compositions/unbounded/cat.toml delete mode 100644 test/testground/compositions/unbounded/control.toml delete mode 100644 test/testground/compositions/unbounded/no_mempool.toml delete mode 100644 test/testground/compositions/utils.go delete mode 100644 test/testground/go.mod delete mode 100644 test/testground/go.sum delete mode 100644 test/testground/main.go delete mode 100644 test/testground/manifest.toml delete mode 100644 test/testground/network/command.go delete mode 100644 test/testground/network/command_test.go delete mode 100644 test/testground/network/configurators.go delete mode 100644 test/testground/network/consensus_node.go delete mode 100644 test/testground/network/entry_point.go delete mode 100644 test/testground/network/experiments.go delete mode 100644 test/testground/network/follower.go delete mode 100644 test/testground/network/leader.go delete mode 100644 test/testground/network/params.go delete mode 100644 test/testground/network/role.go delete mode 100644 test/testground/network/sync.go diff --git a/Makefile b/Makefile index e6c07cb244..c7fdcbdc5d 100644 --- a/Makefile +++ b/Makefile @@ -40,8 +40,6 @@ install: go.sum mod: @echo "--> Updating go.mod" @go mod tidy - @echo "--> Updating go.mod in ./test/testground" - @(cd ./test/testground && go mod tidy) @echo "--> Updating go.mod in ./test/interchain" @(cd ./test/interchain && go mod tidy) .PHONY: mod diff --git a/go.work.example b/go.work.example index aa02aa908e..29b8b48de8 100644 --- a/go.work.example +++ b/go.work.example @@ -2,6 +2,5 @@ go 1.22.4 use ( . - ./test/testground ./test/interchain ) diff --git a/pkg/appconsts/testground/app_consts.go b/pkg/appconsts/testground/app_consts.go deleted file mode 100644 index 1ce1e02d17..0000000000 --- a/pkg/appconsts/testground/app_consts.go +++ /dev/null @@ -1,10 +0,0 @@ -package testground - -const ( - // Version is the version of the application that indicates that the - // testground constants should be used. This version is purposely obtuse to - // avoid collisions with other versions. - Version uint64 = 420420420 - SquareSizeUpperBound int = 512 - SubtreeRootThreshold int = 64 -) diff --git a/pkg/appconsts/versioned_consts.go b/pkg/appconsts/versioned_consts.go index d9961875a7..06dbb73ac0 100644 --- a/pkg/appconsts/versioned_consts.go +++ b/pkg/appconsts/versioned_consts.go @@ -1,7 +1,6 @@ package appconsts import ( - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/testground" v1 "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/v1" v2 "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/v2" ) @@ -23,14 +22,8 @@ func SubtreeRootThreshold(_ uint64) int { } // SquareSizeUpperBound imposes an upper bound on the max effective square size. -func SquareSizeUpperBound(v uint64) int { - switch v { - case testground.Version: - return testground.SquareSizeUpperBound - // There is currently only a single square size upper bound. - default: - return v1.SquareSizeUpperBound - } +func SquareSizeUpperBound(_ uint64) int { + return v1.SquareSizeUpperBound } var ( diff --git a/pkg/appconsts/versioned_consts_test.go b/pkg/appconsts/versioned_consts_test.go index 81acb6275f..e3a77a1115 100644 --- a/pkg/appconsts/versioned_consts_test.go +++ b/pkg/appconsts/versioned_consts_test.go @@ -7,7 +7,6 @@ import ( "github.com/stretchr/testify/require" "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/testground" v1 "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/v1" v2 "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/v2" ) @@ -25,10 +24,6 @@ func TestSubtreeRootThreshold(t *testing.T) { version: v2.Version, expected: v2.SubtreeRootThreshold, }, - { - version: testground.Version, - expected: testground.SubtreeRootThreshold, - }, } for _, tc := range testCases { @@ -53,10 +48,6 @@ func TestSquareSizeUpperBound(t *testing.T) { version: v2.Version, expected: v2.SquareSizeUpperBound, }, - { - version: testground.Version, - expected: testground.SquareSizeUpperBound, - }, } for _, tc := range testCases { diff --git a/test/testground/Dockerfile b/test/testground/Dockerfile deleted file mode 100644 index 64ed4830c9..0000000000 --- a/test/testground/Dockerfile +++ /dev/null @@ -1,89 +0,0 @@ -# BUILD_BASE_IMAGE is the base image to use for the build. It contains a rolling -# accumulation of Go build/package caches. -ARG BUILD_BASE_IMAGE=docker.io/golang:1.22.4-alpine3.19 -# This Dockerfile performs a multi-stage build and RUNTIME_IMAGE is the image -# onto which to copy the resulting binary. -# -# Picking a different runtime base image from the build image allows us to -# slim down the deployable considerably. -# -# The user can override the runtime image by passing in the appropriate builder -# configuration option. -ARG RUNTIME_IMAGE=alpine:3.19 - -#::: -#::: BUILD CONTAINER -#::: -FROM ${BUILD_BASE_IMAGE} AS builder - -# PLAN_DIR is the location containing the plan source inside the container. -ENV PLAN_DIR /plan - -ENV INFLUXDB_URL=http://influxdb:8086 - -# SDK_DIR is the location containing the (optional) sdk source inside the container. -ENV SDK_DIR /sdk - -# Delete any prior artifacts, if this is a cached image. -RUN rm -rf ${PLAN_DIR} ${SDK_DIR} /testground_dep_lists - -# TESTPLAN_EXEC_PKG is the executable package of the testplan to build. -# The image will build that package only. -ARG TESTPLAN_EXEC_PKG="." - -# GO_PROXY is the go proxy that will be used, or direct by default. -ARG GO_PROXY=https://proxy.golang.org - -# BUILD_TAGS is either nothing, or when expanded, it expands to "-tags " -ARG BUILD_TAGS - -# TESTPLAN_EXEC_PKG is the executable package within this test plan we want to build. -ENV TESTPLAN_EXEC_PKG ${TESTPLAN_EXEC_PKG} - -# We explicitly set GOCACHE under the /go directory for more tidiness. -ENV GOCACHE /go/cache - - -# Copy only go.mod files and download deps, in order to leverage Docker caching. -COPY /plan/go.mod ${PLAN_DIR}/go.mod - -RUN apk add gcompat - -# Download deps. -RUN echo "Using go proxy: ${GO_PROXY}" \ - && cd ${PLAN_DIR} \ - && go env -w GOPROXY="${GO_PROXY}" \ - && go mod download - - -# Now copy the rest of the source and run the build. -COPY . / - - -RUN cd ${PLAN_DIR} \ - && go env -w GOPROXY="${GO_PROXY}" \ - && CGO_ENABLED=${CgoEnabled} GOOS=linux GOARCH=amd64 go build -o ${PLAN_DIR}/testplan.bin ${BUILD_TAGS} ${TESTPLAN_EXEC_PKG} - -# Store module dependencies -RUN cd ${PLAN_DIR} \ - && go list -m all > /testground_dep_list - -#::: -#::: (OPTIONAL) RUNTIME CONTAINER -#::: - -## The 'AS runtime' token is used to parse Docker stdout to extract the build image ID to cache. -FROM ${RUNTIME_IMAGE} AS runtime -RUN apk add --no-cache bash gcompat curl -# PLAN_DIR is the location containing the plan source inside the build container. -ENV PLAN_DIR /plan - - -# HOME ENV is crucial for app/sdk -> remove at your OWN RISK! -ENV HOME / - -COPY --from=builder /testground_dep_list / -COPY --from=builder ${PLAN_DIR}/testplan.bin /testplan - -EXPOSE 9090 26657 26656 1317 26658 26660 26659 30000 -ENTRYPOINT [ "/testplan"] diff --git a/test/testground/README.md b/test/testground/README.md deleted file mode 100644 index 13316a5d3d..0000000000 --- a/test/testground/README.md +++ /dev/null @@ -1,112 +0,0 @@ -# Testground Experiment Tooling - -## Test Instance Communication and Experiment Flow - -[Context](https://github.com/celestiaorg/celestia-app/blob/d698845db9b28cbacef2e5bde57ef9dc443fc21a/test/testground/network/role.go#L18-L36) - -```mermaid -sequenceDiagram - participant I as Initializer Node - participant L as Leader Node - participant F1 as Follower Node 1 - participant F2 as Follower Node 2 - participant Fn as Follower Node N - - Note over I, Fn: Testground Initialization - I->>L: Create Leader Node Instance - I->>F1: Create Follower Node 1 Instance - I->>F2: Create Follower Node 2 Instance - I->>Fn: Create Follower Node N Instance - - Note over L, Fn: EntryPoint(runenv *runtime.RunEnv, initCtx *run.InitContext) - - Note over L, Fn: Plan(ctx context.Context, runenv *runtime.RunEnv, initCtx *run.InitContext) - F1->>L: Send PeerPacket - F2->>L: Send PeerPacket - Fn->>L: Send PeerPacket - - Note over L: Genesis Creation - L->>L: Collect GenTx - - L->>F1: Send Genesis File - L->>F2: Send Genesis File - L->>Fn: Send Genesis File - - Note over L: Configuration - L->>L: Configurators - - L->>F1: Send Config Files - L->>F2: Send Config Files - L->>Fn: Send Config Files - - Note over L, Fn: Start Network - - Note over L, Fn: Execute(ctx context.Context, runenv *runtime.RunEnv, initCtx *run.InitContext) - - L->>F1: Send Arbitrary Commands - L->>F2: Send Arbitrary Commands - L->>Fn: Send Arbitrary Commands - - L->>F1: Send EndTest Command - L->>F2: Send EndTest Command - L->>Fn: Send EndTest Command - - Note over L, Fn: Retro(ctx context.Context, runenv *runtime.RunEnv, initCtx *run.InitContext) - - Note over L: Process log local data -``` - -## Configuring an Experiment - -### Defining Topologies and Configs - -Per the diagram above, the leader node initializes and modifies the configs used -by each node. This allows for arbitrary network topologies to be created. - -## Implemented Experiments - -### Standard - -The `standard` test runs an experiment that is as close to mainnet as possible. -This is used as a base for other experiments. - -## Running the Experiment - -Testground must be installed, and testground cluster must be setup in a -kubernetes cluster that you have access to via a kubeconfig file. More details -can be found in the [testground](https://github.com/testground/testground) repo. - -```sh -cd ./test/testground -testground plan import --from . --name core-app - -# This command should be executed in the 1st terminal -testground daemon - -# This command should be executed in the 2nd terminal -testground run composition -f compositions/standard/plan.toml --wait - -# After the test has been completed, run this command to cleanup remaining instance resources -testground terminate --runner cluster:k8s -``` - -## Collecting Data - -### Grafana - -All metrics data is logged to a separate testground specific grafana/influx -node. To access that node, forward the ports using kubectl. - -```sh -export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=grafana,app.kubernetes.io/instance=tg-monitoring" -o jsonpath="{.items[0].metadata.name}") - -kubectl --namespace default port-forward $POD_NAME 3000 - -contact members of the devops team or testground admins to get the creds for accessing this node. -``` - -### Tracing - -The tracing infrastructure in celestia-core can be used by using `tracing_nodes` -plan parameter greater than 0, along with specifying the tracing URL and tracing -token as plan parameters in the `plan.toml`. diff --git a/test/testground/compositions/standard/plan.toml b/test/testground/compositions/standard/plan.toml deleted file mode 100644 index 3181677ae2..0000000000 --- a/test/testground/compositions/standard/plan.toml +++ /dev/null @@ -1,56 +0,0 @@ -[metadata] -author = "core-app" - -[global] -plan = "core-app" -case = "entrypoint" -total_instances = 100 -builder = "docker:generic" -runner = "cluster:k8s" -disable_metrics = false - -[global.run.test_params] -chain_id = "standard-100MB" -timeout = "25m" -halt_height = "50" -latency = "0" -random_latency = "false" -bandwidth = "1Gib" -validators = "40" -topology = "seed" -pex = "true" -timeout_propose = "10s" -timeout_commit = "11s" -per_peer_bandwidth = "5Mib" -blob_sequences = "2" -blob_sizes = "100000" -blobs_per_sequence = "10" -inbound_peer_count = "15" -outbound_peer_count = "10" -gov_max_square_size = "512" -max_block_bytes = "99000000" -mempool = "v1" -broadcast_txs = "true" -tracing_nodes = "0" -tracing_token = "" -tracing_url = "" -experiment = "consistent-fill" - -[[groups]] -id = "validators" -builder = "docker:generic" -[groups.resources] -memory = "8Gi" -cpu = "6" -[groups.instances] -count = 100 -percentage = 0.0 -[groups.build_config] -build_base_image = "golang:1.22.4" -enable_go_build_cache = true -enabled = true -go_version = "1.22.4" -[groups.build] -[groups.run] -artifact = "" -name = "standard" diff --git a/test/testground/compositions/unbounded/cat.toml b/test/testground/compositions/unbounded/cat.toml deleted file mode 100644 index 303517010f..0000000000 --- a/test/testground/compositions/unbounded/cat.toml +++ /dev/null @@ -1,56 +0,0 @@ -[metadata] -name = "standard" -author = "core-app" - -[global] -plan = "core-app" -case = "entrypoint" -total_instances = 100 -builder = "docker:generic" -runner = "cluster:k8s" -disable_metrics = false - -[global.run.test_params] -chain_id = "cat-1" -timeout = "59m" -halt_height = "200" -latency = "0" -random_latency = "false" -bandwidth = "1Gib" -validators = "100" -topology = "seed" -pex = "true" -timeout_propose = "120s" -timeout_commit = "10s" -per_peer_bandwidth = "5Mib" -blob_sequences = "5" -blob_sizes = "110000" -blobs_per_sequence = "5" -inbound_peer_count = "40" -outbound_peer_count = "10" -gov_max_square_size = "1024" -max_block_bytes = "2000000" -mempool = "v2" -broadcast_txs = "true" -tracing_nodes = "0" -tracing_token = "" -tracing_url = "" -experiment = "unbounded" - -[[groups]] -id = "validators" -builder = "docker:generic" -[groups.resources] -memory = "8Gi" -cpu = "6" -[groups.instances] -count = 100 -percentage = 0.0 -[groups.build_config] -build_base_image = "golang:1.21.6" -enable_go_build_cache = true -enabled = true -go_version = "1.21" -[groups.build] -[groups.run] -artifact = "" diff --git a/test/testground/compositions/unbounded/control.toml b/test/testground/compositions/unbounded/control.toml deleted file mode 100644 index a2b7459ae5..0000000000 --- a/test/testground/compositions/unbounded/control.toml +++ /dev/null @@ -1,56 +0,0 @@ -[metadata] -name = "standard" -author = "core-app" - -[global] -plan = "core-app" -case = "entrypoint" -total_instances = 100 -builder = "docker:generic" -runner = "cluster:k8s" -disable_metrics = false - -[global.run.test_params] -chain_id = "l-150-fcontrol-11" -timeout = "59m" -halt_height = "200" -latency = "150" -random_latency = "true" -bandwidth = "1Gib" -validators = "100" -topology = "seed" -pex = "true" -timeout_propose = "120s" -timeout_commit = "1s" -per_peer_bandwidth = "5Mib" -blob_sequences = "5" -blob_sizes = "110000" -blobs_per_sequence = "5" -inbound_peer_count = "40" -outbound_peer_count = "10" -gov_max_square_size = "1024" -max_block_bytes = "2000000" -mempool = "v1" -broadcast_txs = "true" -tracing_nodes = "0" -tracing_token = "" -tracing_url = "" -experiment = "unbounded" - -[[groups]] -id = "validators" -builder = "docker:generic" -[groups.resources] -memory = "8Gi" -cpu = "6" -[groups.instances] -count = 100 -percentage = 0.0 -[groups.build_config] -build_base_image = "golang:1.21.6" -enable_go_build_cache = true -enabled = true -go_version = "1.21" -[groups.build] -[groups.run] -artifact = "" diff --git a/test/testground/compositions/unbounded/no_mempool.toml b/test/testground/compositions/unbounded/no_mempool.toml deleted file mode 100644 index 8389f865e8..0000000000 --- a/test/testground/compositions/unbounded/no_mempool.toml +++ /dev/null @@ -1,56 +0,0 @@ -[metadata] -name = "standard" -author = "core-app" - -[global] -plan = "core-app" -case = "entrypoint" -total_instances = 100 -builder = "docker:generic" -runner = "cluster:k8s" -disable_metrics = false - -[global.run.test_params] -chain_id = "l-150-no-mempool-2" -timeout = "59m" -halt_height = "200" -latency = "150" -random_latency = "true" -bandwidth = "1Gib" -validators = "100" -topology = "seed" -pex = "true" -timeout_propose = "120s" -timeout_commit = "10s" -per_peer_bandwidth = "5Mib" -blob_sequences = "52" -blob_sizes = "110000" -blobs_per_sequence = "18" -inbound_peer_count = "40" -outbound_peer_count = "10" -gov_max_square_size = "1024" -max_block_bytes = "2000000" -mempool = "v1" -broadcast_txs = "false" -tracing_nodes = "0" -tracing_token = "" -tracing_url = "" -experiment = "unbounded" - -[[groups]] -id = "validators" -builder = "docker:generic" -[groups.resources] -memory = "8Gi" -cpu = "6" -[groups.instances] -count = 100 -percentage = 0.0 -[groups.build_config] -build_base_image = "golang:1.21.6" -enable_go_build_cache = true -enabled = true -go_version = "1.21" -[groups.build] -[groups.run] -artifact = "" diff --git a/test/testground/compositions/utils.go b/test/testground/compositions/utils.go deleted file mode 100644 index 4553c5fa27..0000000000 --- a/test/testground/compositions/utils.go +++ /dev/null @@ -1,105 +0,0 @@ -package compositions - -import ( - "context" - "fmt" - "strconv" - "strings" - "time" - - tmrand "github.com/tendermint/tendermint/libs/rand" - - "github.com/testground/sdk-go/network" - "github.com/testground/sdk-go/run" - "github.com/testground/sdk-go/runtime" -) - -func InitTest(runenv *runtime.RunEnv, initCtx *run.InitContext) (*run.InitContext, context.Context, context.CancelFunc, error) { - syncclient := initCtx.SyncClient - netclient := network.NewClient(syncclient, runenv) - timeout, err := time.ParseDuration(runenv.TestInstanceParams["timeout"]) - if err != nil { - return nil, nil, nil, err - } - ctx, cancel := context.WithTimeout(context.Background(), timeout) - - netclient.MustWaitNetworkInitialized(ctx) - initCtx.NetClient = netclient - - config, err := CreateNetworkConfig(runenv, initCtx) - if err != nil { - return initCtx, ctx, cancel, err - } - - err = initCtx.NetClient.ConfigureNetwork(ctx, &config) - - return initCtx, ctx, cancel, err -} - -func CreateNetworkConfig(runenv *runtime.RunEnv, initCtx *run.InitContext) (network.Config, error) { - bandwidth, err := parseBandwidth(runenv.StringParam("bandwidth")) - if err != nil { - return network.Config{}, err - } - l := runenv.IntParam("latency") - // rand.Intn will panic if l == 0 - if l == 0 { - l = 1 - } - if runenv.BooleanParam("random_latency") { - l = tmrand.Intn(l) - } - config := network.Config{ - Network: "default", - Enable: true, - Default: network.LinkShape{ - Latency: time.Millisecond * time.Duration(l), - Bandwidth: bandwidth, - }, - CallbackState: "network-configured", - RoutingPolicy: network.AllowAll, - } - - config.IPv4 = runenv.TestSubnet - - // using the assigned `GlobalSequencer` id per each of instance - // to fill in the last 2 octets of the new IP address for the instance - ipC := byte((initCtx.GlobalSeq >> 8) + 1) - ipD := byte(initCtx.GlobalSeq) - config.IPv4.IP = append(config.IPv4.IP[0:2:2], ipC, ipD) - - return config, nil -} - -func parseBandwidth(s string) (uint64, error) { - var multiplier uint64 - - s = strings.TrimSpace(s) - if strings.HasSuffix(s, "Kib") { - multiplier = 1 << 10 - } else if strings.HasSuffix(s, "Mib") { - multiplier = 1 << 20 - } else if strings.HasSuffix(s, "Gib") { - multiplier = 1 << 30 - } else if strings.HasSuffix(s, "Tib") { - multiplier = 1 << 40 - } else if strings.HasSuffix(s, "Kb") { - multiplier = 1000 - } else if strings.HasSuffix(s, "Mb") { - multiplier = 1000 * 1000 - } else if strings.HasSuffix(s, "Gb") { - multiplier = 1000 * 1000 * 1000 - } else if strings.HasSuffix(s, "Tb") { - multiplier = 1000 * 1000 * 1000 * 1000 - } else { - return 0, fmt.Errorf("unknown unit in string: %s", s) - } - - numberStr := strings.TrimRight(s, "KMGTib") - number, err := strconv.ParseFloat(numberStr, 64) - if err != nil { - return 0, err - } - - return uint64(number * float64(multiplier)), nil -} diff --git a/test/testground/go.mod b/test/testground/go.mod deleted file mode 100644 index 06c072a8c6..0000000000 --- a/test/testground/go.mod +++ /dev/null @@ -1,227 +0,0 @@ -module github.com/celestiaorg/celestia-app/test/testground - -go 1.22.4 - -require ( - github.com/celestiaorg/celestia-app v1.0.0-rc0.0.20240304150808-f0a1f87c0253 - github.com/cosmos/cosmos-sdk v0.46.16 - github.com/stretchr/testify v1.9.0 - github.com/tendermint/tendermint v0.34.29 - github.com/testground/sdk-go v0.3.0 -) - -require ( - cloud.google.com/go v0.112.0 // indirect - cloud.google.com/go/compute v1.24.0 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.6 // indirect - cloud.google.com/go/storage v1.37.0 // indirect - cosmossdk.io/errors v1.0.1 // indirect - cosmossdk.io/math v1.3.0 // indirect - filippo.io/edwards25519 v1.0.0-rc.1 // indirect - github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect - github.com/99designs/keyring v1.2.2 // indirect - github.com/ChainSafe/go-schnorrkel v1.0.0 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/StackExchange/wmi v1.2.1 // indirect - github.com/Workiva/go-datastructures v1.0.53 // indirect - github.com/armon/go-metrics v0.4.1 // indirect - github.com/avast/retry-go v2.6.0+incompatible // indirect - github.com/aws/aws-sdk-go v1.44.122 // indirect - github.com/benbjohnson/clock v1.3.0 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect - github.com/bgentry/speakeasy v0.1.0 // indirect - github.com/bits-and-blooms/bitset v1.10.0 // indirect - github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect - github.com/celestiaorg/blobstream-contracts/v3 v3.1.0 // indirect - github.com/celestiaorg/go-square v1.0.1 // indirect - github.com/celestiaorg/go-square/merkle v0.0.0-20240117232118-fd78256df076 // indirect - github.com/celestiaorg/merkletree v0.0.0-20210714075610-a84dc3ddbbe4 // indirect - github.com/celestiaorg/nmt v0.21.0 // indirect - github.com/celestiaorg/rsmt2d v0.13.0 // indirect - github.com/cenkalti/backoff/v4 v4.1.3 // indirect - github.com/cespare/xxhash v1.1.0 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/chzyer/readline v1.5.1 // indirect - github.com/cockroachdb/apd/v2 v2.0.2 // indirect - github.com/coinbase/rosetta-sdk-go v0.7.9 // indirect - github.com/cometbft/cometbft-db v0.7.0 // indirect - github.com/confio/ics23/go v0.9.1 // indirect - github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.12.1 // indirect - github.com/cosmos/btcutil v1.0.5 // indirect - github.com/cosmos/cosmos-proto v1.0.0-beta.5 // indirect - github.com/cosmos/go-bip39 v1.0.0 // indirect - github.com/cosmos/gogoproto v1.4.12 // indirect - github.com/cosmos/gorocksdb v1.2.0 // indirect - github.com/cosmos/iavl v0.19.6 // indirect - github.com/cosmos/ibc-go/v6 v6.2.2 // indirect - github.com/cosmos/ledger-cosmos-go v0.13.2 // indirect - github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect - github.com/creachadair/taskgroup v0.3.2 // indirect - github.com/danieljoos/wincred v1.1.2 // indirect - github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/deckarep/golang-set/v2 v2.1.0 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect - github.com/dgraph-io/badger/v2 v2.2007.4 // indirect - github.com/dgraph-io/ristretto v0.1.1 // indirect - github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect - github.com/dustin/go-humanize v1.0.1 // indirect - github.com/dvsekhvalnov/jose2go v1.6.0 // indirect - github.com/ethereum/c-kzg-4844 v0.4.0 // indirect - github.com/ethereum/go-ethereum v1.13.15 // indirect - github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-kit/kit v0.12.0 // indirect - github.com/go-kit/log v0.2.1 // indirect - github.com/go-logfmt/logfmt v0.6.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect - github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-ole/go-ole v1.3.0 // indirect - github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect - github.com/gogo/gateway v1.1.0 // indirect - github.com/gogo/protobuf v1.3.3 // indirect - github.com/golang/glog v1.2.0 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.4 // indirect - github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect - github.com/google/btree v1.1.2 // indirect - github.com/google/go-cmp v0.6.0 // indirect - github.com/google/orderedcode v0.0.1 // indirect - github.com/google/s2a-go v0.1.7 // indirect - github.com/google/uuid v1.6.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect - github.com/googleapis/gax-go/v2 v2.12.0 // indirect - github.com/gorilla/handlers v1.5.2 // indirect - github.com/gorilla/mux v1.8.1 // indirect - github.com/gorilla/websocket v1.5.0 // indirect - github.com/grafana/otel-profiling-go v0.5.1 // indirect - github.com/grafana/pyroscope-go v1.1.1 // indirect - github.com/grafana/pyroscope-go/godeltaprof v0.1.6 // indirect - github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect - github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect - github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect - github.com/gtank/merlin v0.1.1 // indirect - github.com/gtank/ristretto255 v0.1.2 // indirect - github.com/hashicorp/errwrap v1.1.0 // indirect - github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-getter v1.7.5 // indirect - github.com/hashicorp/go-immutable-radix v1.3.1 // indirect - github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/go-safetemp v1.0.0 // indirect - github.com/hashicorp/go-version v1.6.0 // indirect - github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d // indirect - github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hdevalence/ed25519consensus v0.0.0-20220222234857-c00d1f31bab3 // indirect - github.com/holiman/uint256 v1.2.4 // indirect - github.com/improbable-eng/grpc-web v0.15.0 // indirect - github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c // indirect - github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/jmhodges/levigo v1.0.0 // indirect - github.com/klauspost/compress v1.17.6 // indirect - github.com/klauspost/cpuid/v2 v2.2.6 // indirect - github.com/klauspost/reedsolomon v1.12.1 // indirect - github.com/lib/pq v1.10.7 // indirect - github.com/libp2p/go-buffer-pool v0.1.0 // indirect - github.com/magiconair/properties v1.8.7 // indirect - github.com/manifoldco/promptui v0.9.0 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect - github.com/mattn/go-runewidth v0.0.14 // indirect - github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect - github.com/minio/highwayhash v1.0.2 // indirect - github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/go-testing-interface v1.14.1 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/mmcloughlin/addchain v0.4.0 // indirect - github.com/mtibben/percent v0.2.1 // indirect - github.com/onsi/ginkgo v1.16.5 // indirect - github.com/onsi/gomega v1.29.0 // indirect - github.com/pelletier/go-toml/v2 v2.1.0 // indirect - github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.19.1 // indirect - github.com/prometheus/client_model v0.6.0 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.12.0 // indirect - github.com/rakyll/statik v0.1.7 // indirect - github.com/raulk/clock v1.1.0 // indirect - github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect - github.com/regen-network/cosmos-proto v0.3.1 // indirect - github.com/rs/cors v1.8.3 // indirect - github.com/rs/zerolog v1.32.0 // indirect - github.com/sasha-s/go-deadlock v0.3.1 // indirect - github.com/shirou/gopsutil v3.21.6+incompatible // indirect - github.com/spf13/afero v1.11.0 // indirect - github.com/spf13/cast v1.6.0 // indirect - github.com/spf13/cobra v1.8.0 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.15.0 // indirect - github.com/subosito/gotenv v1.6.0 // indirect - github.com/supranational/blst v0.3.11 // indirect - github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect - github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c // indirect - github.com/tendermint/go-amino v0.16.0 // indirect - github.com/tendermint/tm-db v0.6.7 // indirect - github.com/testground/sync-service v0.1.0 // indirect - github.com/testground/testground v0.5.3 // indirect - github.com/tidwall/btree v1.5.0 // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - github.com/tklauser/numcpus v0.6.1 // indirect - github.com/ulikunitz/xz v0.5.10 // indirect - github.com/zondax/hid v0.9.2 // indirect - github.com/zondax/ledger-go v0.14.3 // indirect - go.etcd.io/bbolt v1.3.6 // indirect - go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect - go.opentelemetry.io/otel v1.24.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.18.0 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/otel/sdk v1.24.0 // indirect - go.opentelemetry.io/otel/trace v1.24.0 // indirect - go.uber.org/atomic v1.11.0 // indirect - go.uber.org/goleak v1.1.12 // indirect - go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.24.0 // indirect - golang.org/x/arch v0.1.0 // indirect - golang.org/x/crypto v0.21.0 // indirect - golang.org/x/exp v0.0.0-20231206192017-f3f8817b8deb // indirect - golang.org/x/mod v0.14.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/oauth2 v0.18.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/term v0.18.0 // indirect - golang.org/x/text v0.14.0 // indirect - golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.17.0 // indirect - google.golang.org/api v0.162.0 // indirect - google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de // indirect - google.golang.org/grpc v1.63.2 // indirect - google.golang.org/protobuf v1.33.0 // indirect - gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - nhooyr.io/websocket v1.8.6 // indirect - rsc.io/tmplfunc v0.0.3 // indirect - sigs.k8s.io/yaml v1.4.0 // indirect -) - -replace ( - github.com/cosmos/cosmos-sdk => github.com/celestiaorg/cosmos-sdk v1.23.0-sdk-v0.46.16 - github.com/dgrijalva/jwt-go => github.com/golang-jwt/jwt/v4 v4.4.2 - github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.9.0 - github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 - github.com/jhump/protoreflect => github.com/jhump/protoreflect v1.9.0 - github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 - github.com/tendermint/tendermint => github.com/celestiaorg/celestia-core v1.38.0-tm-v0.34.29 -) diff --git a/test/testground/go.sum b/test/testground/go.sum deleted file mode 100644 index 8547d33af9..0000000000 --- a/test/testground/go.sum +++ /dev/null @@ -1,2262 +0,0 @@ -bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= -cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= -cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.112.0 h1:tpFCD7hpHFlQ8yPwT3x+QeXqc2T6+n6T+hmABHfDUSM= -cloud.google.com/go v0.112.0/go.mod h1:3jEEVwZ/MHU4djK5t5RHuKOA/GbLddgTdVubX1qnPD4= -cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= -cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= -cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= -cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= -cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= -cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= -cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= -cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= -cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= -cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= -cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= -cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= -cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= -cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= -cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= -cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= -cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= -cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= -cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= -cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= -cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= -cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= -cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= -cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.24.0 h1:phWcR2eWzRJaL/kOiJwfFsPs4BaKq1j6vnpZrc1YlVg= -cloud.google.com/go/compute v1.24.0/go.mod h1:kw1/T+h/+tK2LJK0wiPPx1intgdAM3j/g3hFDlscY40= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= -cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= -cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= -cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= -cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= -cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= -cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= -cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= -cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= -cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= -cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= -cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= -cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= -cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= -cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= -cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= -cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= -cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= -cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= -cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= -cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= -cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= -cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= -cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= -cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= -cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= -cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= -cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= -cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= -cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= -cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= -cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v1.1.6 h1:bEa06k05IO4f4uJonbB5iAgKTPpABy1ayxaIZV/GHVc= -cloud.google.com/go/iam v1.1.6/go.mod h1:O0zxdPeGBoFdWW3HWmBxJsk0pfvNM/p/qa82rWOGTwI= -cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= -cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= -cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= -cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= -cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= -cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= -cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= -cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= -cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= -cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= -cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= -cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= -cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= -cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= -cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= -cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= -cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= -cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= -cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= -cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= -cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= -cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= -cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= -cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= -cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= -cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= -cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= -cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= -cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= -cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= -cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= -cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= -cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= -cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= -cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= -cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= -cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= -cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= -cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= -cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= -cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= -cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= -cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= -cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= -cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= -cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= -cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= -cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storage v1.37.0 h1:WI8CsaFO8Q9KjPVtsZ5Cmi0dXV25zMoX0FklT7c3Jm4= -cloud.google.com/go/storage v1.37.0/go.mod h1:i34TiT2IhiNDmcj65PqwCjcoUX7Z5pLzS8DEmoiFq1k= -cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= -cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= -cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= -cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= -cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= -cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= -cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= -cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= -cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= -cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= -cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= -collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= -cosmossdk.io/errors v1.0.1 h1:bzu+Kcr0kS/1DuPBtUFdWjzLqyUuCiyHjyJB6srBV/0= -cosmossdk.io/errors v1.0.1/go.mod h1:MeelVSZThMi4bEakzhhhE/CKqVv3nOJDA25bIqRDu/U= -cosmossdk.io/math v1.3.0 h1:RC+jryuKeytIiictDslBP9i1fhkVm6ZDmZEoNP316zE= -cosmossdk.io/math v1.3.0/go.mod h1:vnRTxewy+M7BtXBNFybkuhSH4WfedVAAnERHgVFhp3k= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -filippo.io/edwards25519 v1.0.0-rc.1 h1:m0VOOB23frXZvAOK44usCgLWvtsxIoMCTBGJZlpmGfU= -filippo.io/edwards25519 v1.0.0-rc.1/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= -git.sr.ht/~sircmpwn/getopt v0.0.0-20191230200459-23622cc906b3/go.mod h1:wMEGFFFNuPos7vHmWXfszqImLppbc0wEhh6JBfJIUgw= -git.sr.ht/~sircmpwn/go-bare v0.0.0-20210406120253-ab86bc2846d9/go.mod h1:BVJwbDfVjCjoFiKrhkei6NdGcZYpkDkdyCdg1ukytRA= -github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= -github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= -github.com/99designs/keyring v1.2.2 h1:pZd3neh/EmUzWONb35LxQfvuY7kiSXAq3HQd97+XBn0= -github.com/99designs/keyring v1.2.2/go.mod h1:wes/FrByc8j7lFOAGLGSNEg8f/PaI3cgTBqhFkHUrPk= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= -github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v11.1.2+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/ChainSafe/go-schnorrkel v1.0.0 h1:3aDA67lAykLaG1y3AOjs88dMxC88PgUuHRrLeDnvGIM= -github.com/ChainSafe/go-schnorrkel v1.0.0/go.mod h1:dpzHYVxLZcp8pjlV+O+UR8K0Hp/z7vcchBSbMBEhCw4= -github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/DataDog/zstd v1.5.0 h1:+K/VEwIAaPcHiMtQvpLD4lqW7f0Gk3xdYZmI1hD+CXo= -github.com/DataDog/zstd v1.5.0/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= -github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= -github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= -github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= -github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= -github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= -github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= -github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= -github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= -github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= -github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/Workiva/go-datastructures v1.0.53 h1:J6Y/52yX10Xc5JjXmGtWoSSxs3mZnGSaq37xZZh7Yig= -github.com/Workiva/go-datastructures v1.0.53/go.mod h1:1yZL+zfsztete+ePzZz/Zb1/t5BnDuE2Ya2MMGhzP6A= -github.com/Zilliqa/gozilliqa-sdk v1.2.1-0.20201201074141-dd0ecada1be6/go.mod h1:eSYp2T6f0apnuW8TzhV3f6Aff2SE8Dwio++U4ha4yEM= -github.com/adlio/schema v1.3.3 h1:oBJn8I02PyTB466pZO1UZEn1TV5XLlifBSyMrmHl/1I= -github.com/adlio/schema v1.3.3/go.mod h1:1EsRssiv9/Ce2CMzq5DoL7RiMshhuigQxrR4DMV9fHg= -github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= -github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= -github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= -github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= -github.com/avast/retry-go v2.6.0+incompatible h1:FelcMrm7Bxacr1/RM8+/eqkDkmVN7tjlsy51dOzB3LI= -github.com/avast/retry-go v2.6.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY= -github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= -github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.28.9/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.44.122 h1:p6mw01WBaNpbdP2xrisz5tIkcNwzj/HysobNoaAHjgo= -github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= -github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= -github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= -github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4= -github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= -github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= -github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= -github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= -github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= -github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= -github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= -github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= -github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= -github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= -github.com/btcsuite/btcd v0.0.0-20190315201642-aa6e0f35703c/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= -github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= -github.com/btcsuite/btcd v0.21.0-beta.0.20201114000516-e9c7a5ac6401/go.mod h1:Sv4JPQ3/M+teHz9Bo5jBpkNcP0x6r7rdihlNL/7tTAs= -github.com/btcsuite/btcd v0.22.1 h1:CnwP9LM/M9xuRrGSCGeMVs9iv09uMqwsVX7EeIpgV2c= -github.com/btcsuite/btcd v0.22.1/go.mod h1:wqgTSL29+50LRkmOVknEdmt8ZojIzhuWvgu/iptuN7Y= -github.com/btcsuite/btcd/btcec/v2 v2.1.2/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= -github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= -github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= -github.com/btcsuite/btcd/btcutil v1.1.3 h1:xfbtw8lwpp0G6NwSHb+UE67ryTFHJAiNuipusjXSohQ= -github.com/btcsuite/btcd/btcutil v1.1.3/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= -github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/btcutil v1.0.2/go.mod h1:j9HUFwoQRsZL3V4n+qG+CUnEGHOarIxfC3Le2Yhbcts= -github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= -github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= -github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= -github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= -github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= -github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= -github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= -github.com/bytedance/sonic v1.8.0 h1:ea0Xadu+sHlu7x5O3gKhRpQ1IKiMrSiHttPF0ybECuA= -github.com/bytedance/sonic v1.8.0/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= -github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= -github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= -github.com/celestiaorg/blobstream-contracts/v3 v3.1.0 h1:h1Y4V3EMQ2mFmNtWt2sIhZIuyASInj1a9ExI8xOsTOw= -github.com/celestiaorg/blobstream-contracts/v3 v3.1.0/go.mod h1:x4DKyfKOSv1ZJM9NwV+Pw01kH2CD7N5zTFclXIVJ6GQ= -github.com/celestiaorg/celestia-app v1.0.0-rc0.0.20240304150808-f0a1f87c0253 h1:qU6+TO11VlTtYoSRWQ5DrKEH4noABBGGgBP0Eg08jr4= -github.com/celestiaorg/celestia-app v1.0.0-rc0.0.20240304150808-f0a1f87c0253/go.mod h1:z3gMQZkUUe2MYrQQGnrYy+gDP0QpX0f5EPWtVNM0u/E= -github.com/celestiaorg/celestia-core v1.38.0-tm-v0.34.29 h1:HwbA4OegRvXX0aNchBA7Cmu+oIxnH7xRcOhISuDP0ak= -github.com/celestiaorg/celestia-core v1.38.0-tm-v0.34.29/go.mod h1:MyElURdWAOJkOp84WZnfEUJ+OLvTwOOHG2lbK9E8XRI= -github.com/celestiaorg/cosmos-sdk v1.23.0-sdk-v0.46.16 h1:N2uETI13szEKnGAdKhtTR0EsrpcW0AwRKYER74WLnuw= -github.com/celestiaorg/cosmos-sdk v1.23.0-sdk-v0.46.16/go.mod h1:Bpl1LSWiDpQumgOhhMTZBMopqa0j7fRasIhvTZB44P0= -github.com/celestiaorg/go-square v1.0.1 h1:LEG1zrw4i03VBMElQF8GAbKYgh1bT1uGzWxasU2ePuo= -github.com/celestiaorg/go-square v1.0.1/go.mod h1:XMv5SGCeGSkynW2OOsedugaW/rQlvzxGzWGxTKsyYOU= -github.com/celestiaorg/go-square/merkle v0.0.0-20240117232118-fd78256df076 h1:PYInrsYzrDIsZW9Yb86OTi2aEKuPcpgJt6Mc0Jlc/yg= -github.com/celestiaorg/go-square/merkle v0.0.0-20240117232118-fd78256df076/go.mod h1:hlidgivKyvv7m4Yl2Fdf2mSTmazZYxX8+bnr5IQrI98= -github.com/celestiaorg/merkletree v0.0.0-20210714075610-a84dc3ddbbe4 h1:CJdIpo8n5MFP2MwK0gSRcOVlDlFdQJO1p+FqdxYzmvc= -github.com/celestiaorg/merkletree v0.0.0-20210714075610-a84dc3ddbbe4/go.mod h1:fzuHnhzj1pUygGz+1ZkB3uQbEUL4htqCGJ4Qs2LwMZA= -github.com/celestiaorg/nmt v0.21.0 h1:81MBqxNn3orByoiCtdNVjwi5WsLgMkzHwP02ZMhTBHM= -github.com/celestiaorg/nmt v0.21.0/go.mod h1:ia/EpCk0enD5yO5frcxoNoFToz2Ghtk2i+blmCRjIY8= -github.com/celestiaorg/rsmt2d v0.13.0 h1:cea8wg8MtTuUs9OTrP19QccuxvlMh0GFy7VAKc0/M+Q= -github.com/celestiaorg/rsmt2d v0.13.0/go.mod h1:P7t92OATXbBmc/P5uR+GCOBv+PV8wLb0vU32ucrb148= -github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= -github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= -github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= -github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= -github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= -github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= -github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= -github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= -github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= -github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa h1:jQCWAUqqlij9Pgj2i/PB79y4KOPYVyFYdROxgaCwdTQ= -github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= -github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= -github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/errors v1.8.1 h1:A5+txlVZfOqFBDa4mGz2bUWSp0aHElvHX2bKkdbQu+Y= -github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f h1:o/kfcElHqOiXqcou5a3rIlMc7oJbMQkeLk0VQJ7zgqY= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= -github.com/cockroachdb/redact v1.0.8 h1:8QG/764wK+vmEYoOlfobpe12EQcS81ukx/a4hdVMxNw= -github.com/cockroachdb/redact v1.0.8/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 h1:IKgmqgMQlVJIZj19CdocBeSfSaiCbEBZGKODaixqtHM= -github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= -github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= -github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/coinbase/kryptology v1.8.0/go.mod h1:RYXOAPdzOGUe3qlSFkMGn58i3xUA8hmxYHksuq+8ciI= -github.com/coinbase/rosetta-sdk-go v0.7.9 h1:lqllBjMnazTjIqYrOGv8h8jxjg9+hJazIGZr9ZvoCcA= -github.com/coinbase/rosetta-sdk-go v0.7.9/go.mod h1:0/knutI7XGVqXmmH4OQD8OckFrbQ8yMsUZTG7FXCR2M= -github.com/cometbft/cometbft-db v0.7.0 h1:uBjbrBx4QzU0zOEnU8KxoDl18dMNgDh+zZRUE0ucsbo= -github.com/cometbft/cometbft-db v0.7.0/go.mod h1:yiKJIm2WKrt6x8Cyxtq9YTEcIMPcEe4XPxhgX59Fzf0= -github.com/confio/ics23/go v0.9.1 h1:3MV46eeWwO3xCauKyAtuAdJYMyPnnchW4iLr2bTw6/U= -github.com/confio/ics23/go v0.9.1/go.mod h1:4LPZ2NYqnYIVRklaozjNR1FScgDJ2s5Xrp+e/mYVRak= -github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ= -github.com/consensys/bavard v0.1.8-0.20210915155054-088da2f7f54a/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= -github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f/go.mod h1:815PAHg3wvysy0SyIqanF8gZ0Y1wjk/hrDHD/iT88+Q= -github.com/consensys/gnark-crypto v0.5.3/go.mod h1:hOdPlWQV1gDLp7faZVeg8Y0iEPFaOUnCc4XeCCk96p0= -github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= -github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= -github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= -github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.4/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20200413184840-d3ef23f19fbb/go.mod h1:Dq467ZllaHgAtVp4p1xUQWBrFXR9s/wyoTpG8zOJGkY= -github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= -github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= -github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= -github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= -github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= -github.com/cosmos/cosmos-proto v1.0.0-beta.5 h1:eNcayDLpip+zVLRLYafhzLvQlSmyab+RC5W7ZfmxJLA= -github.com/cosmos/cosmos-proto v1.0.0-beta.5/go.mod h1:hQGLpiIUloJBMdQMMWb/4wRApmI9hjHH05nefC0Ojec= -github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= -github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= -github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= -github.com/cosmos/gogoproto v1.4.12 h1:vB6Lbe/rtnYGjQuFxkPiPYiCybqFT8QvLipDZP8JpFE= -github.com/cosmos/gogoproto v1.4.12/go.mod h1:LnZob1bXRdUoqMMtwYlcR3wjiElmlC+FkjaZRv1/eLY= -github.com/cosmos/gorocksdb v1.2.0 h1:d0l3jJG8M4hBouIZq0mDUHZ+zjOx044J3nGRskwTb4Y= -github.com/cosmos/gorocksdb v1.2.0/go.mod h1:aaKvKItm514hKfNJpUJXnnOWeBnk2GL4+Qw9NHizILw= -github.com/cosmos/iavl v0.19.6 h1:XY78yEeNPrEYyNCKlqr9chrwoeSDJ0bV2VjocTk//OU= -github.com/cosmos/iavl v0.19.6/go.mod h1:X9PKD3J0iFxdmgNLa7b2LYWdsGd90ToV5cAONApkEPw= -github.com/cosmos/ibc-go/v6 v6.2.2 h1:xVnlfV+IFPMkAEuWdZpRbky1jfGcob9i+T+xQ2LRf48= -github.com/cosmos/ibc-go/v6 v6.2.2/go.mod h1:XLsARy4Y7+GtAqzMcxNdlQf6lx+ti1e8KcMGv5NIK7A= -github.com/cosmos/ledger-cosmos-go v0.13.2 h1:aY0KZSmUwNKbBm9OvbIjvf7Ozz2YzzpAbgvN2C8x2T0= -github.com/cosmos/ledger-cosmos-go v0.13.2/go.mod h1:HENcEP+VtahZFw38HZ3+LS3Iv5XV6svsnkk9vdJtLr8= -github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= -github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= -github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= -github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= -github.com/creachadair/taskgroup v0.3.2 h1:zlfutDS+5XG40AOxcHDSThxKzns8Tnr9jnr6VqkYlkM= -github.com/creachadair/taskgroup v0.3.2/go.mod h1:wieWwecHVzsidg2CsUnFinW1faVN4+kq+TDlRJQ0Wbk= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= -github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= -github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= -github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= -github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= -github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= -github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= -github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= -github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= -github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= -github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= -github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= -github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= -github.com/dgraph-io/badger/v2 v2.2007.4 h1:TRWBQg8UrlUhaFdco01nO2uXwzKS7zd+HVdwV/GHc4o= -github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= -github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgraph-io/ristretto v0.0.3/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= -github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= -github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= -github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= -github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v1.4.2-0.20200206084213-b5fc6ea92cde/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= -github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/dop251/goja v0.0.0-20211011172007-d99e4b8cbf48/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= -github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= -github.com/dsnet/compress v0.0.1/go.mod h1:Aw8dCMJ7RioblQeTqt88akK31OvO8Dhf5JflhBbQEHo= -github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= -github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/dvsekhvalnov/jose2go v1.6.0 h1:Y9gnSnP4qEI0+/uQkHvFXeD2PLPJeXEL+ySMEA2EjTY= -github.com/dvsekhvalnov/jose2go v1.6.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= -github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= -github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= -github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= -github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= -github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= -github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.10.17/go.mod h1:Lt5WzjM07XlXc95YzrhosmR4J9Ahd6X2wyEV2SvGhk0= -github.com/ethereum/go-ethereum v1.13.15 h1:U7sSGYGo4SPjP6iNIifNoyIAiNjrmQkz6EwQG+/EZWo= -github.com/ethereum/go-ethereum v1.13.15/go.mod h1:TN8ZiHrdJwSe8Cb6x+p0hs5CxhJZPbqB7hHkaUXcmIU= -github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c h1:8ISkoahWXwZR41ois5lSJBSVw4D0OV19Ht/JSTzvSv0= -github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= -github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A= -github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= -github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4 h1:7HZCaLC5+BZpmbhCOZJ293Lz68O7PYrF2EzeiFMwCLk= -github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= -github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= -github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= -github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= -github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= -github.com/frankban/quicktest v1.9.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y= -github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= -github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= -github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= -github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= -github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= -github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.9.0 h1:OjyFBKICoexlu99ctXNR2gg+c5pKrKMuyjgARg9qeY8= -github.com/gin-gonic/gin v1.9.0/go.mod h1:W1Me9+hsUSyj3CePGrd1/QrKJMSJ1Tu/0hFEH89961k= -github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= -github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= -github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= -github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= -github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= -github.com/go-git/go-git-fixtures/v4 v4.0.1/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw= -github.com/go-git/go-git/v5 v5.0.0/go.mod h1:oYD8y9kWsGINPFJoLdaScGCN6dlKg23blmClfZwtUVA= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= -github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= -github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= -github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= -github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= -github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= -github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= -github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= -github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= -github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.3.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-playground/validator/v10 v10.11.2 h1:q3SHpufmypg+erIExEKUmsgmhDTyhcJ38oeKGACXohU= -github.com/go-playground/validator/v10 v10.11.2/go.mod h1:NieE624vt4SCTJtD87arVLvdmjPAeV8BQlHtMnw9D7s= -github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= -github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM= -github.com/gobuffalo/here v0.6.2/go.mod h1:D75Sq0p2BVHdgQu3vCRsXbg85rx943V19urJpqAVWjI= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/goccy/go-json v0.10.0/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= -github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= -github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/gateway v1.1.0 h1:u0SuhL9+Il+UbjM9VIE3ntfRujKbvVpFvNB4HbjeVQ0= -github.com/gogo/gateway v1.1.0/go.mod h1:S7rR8FRQyG3QFESeSv4l2WnsyzlCLG0CzBbUUo/mbic= -github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= -github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= -github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= -github.com/google/btree v0.0.0-20160524151835-7d79101e329e/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= -github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= -github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= -github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= -github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= -github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= -github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= -github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= -github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= -github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= -github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= -github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= -github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= -github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= -github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= -github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grafana/otel-profiling-go v0.5.1 h1:stVPKAFZSa7eGiqbYuG25VcqYksR6iWvF3YH66t4qL8= -github.com/grafana/otel-profiling-go v0.5.1/go.mod h1:ftN/t5A/4gQI19/8MoWurBEtC6gFw8Dns1sJZ9W4Tls= -github.com/grafana/pyroscope-go v1.1.1 h1:PQoUU9oWtO3ve/fgIiklYuGilvsm8qaGhlY4Vw6MAcQ= -github.com/grafana/pyroscope-go v1.1.1/go.mod h1:Mw26jU7jsL/KStNSGGuuVYdUq7Qghem5P8aXYXSXG88= -github.com/grafana/pyroscope-go/godeltaprof v0.1.6 h1:nEdZ8louGAplSvIJi1HVp7kWvFvdiiYg3COLlTwJiFo= -github.com/grafana/pyroscope-go/godeltaprof v0.1.6/go.mod h1:Tk376Nbldo4Cha9RgiU7ik8WKFkNpfds98aUzS8omLE= -github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= -github.com/gregjones/httpcache v0.0.0-20170728041850-787624de3eb7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= -github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= -github.com/gtank/merlin v0.1.1-0.20191105220539-8318aed1a79f/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= -github.com/gtank/merlin v0.1.1 h1:eQ90iG7K9pOhtereWsmyRJ6RAwcP4tHTDBHXNg+u5is= -github.com/gtank/merlin v0.1.1/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= -github.com/gtank/ristretto255 v0.1.2 h1:JEqUCPA1NvLq5DwYtuzigd7ss8fwbYay9fi4/5uMzcc= -github.com/gtank/ristretto255 v0.1.2/go.mod h1:Ph5OpO6c7xKUGROZfWVLiJf9icMDwUeIvY4OmlYW69o= -github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= -github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= -github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= -github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-getter v1.7.5 h1:dT58k9hQ/vbxNMwoI5+xFYAJuv6152UNvdHokfI5wE4= -github.com/hashicorp/go-getter v1.7.5/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo= -github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= -github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= -github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hdevalence/ed25519consensus v0.0.0-20220222234857-c00d1f31bab3 h1:aSVUgRRRtOrZOC1fYmY9gV0e9z/Iu+xNVSASWjsuyGU= -github.com/hdevalence/ed25519consensus v0.0.0-20220222234857-c00d1f31bab3/go.mod h1:5PC6ZNPde8bBqU/ewGZig35+UIZtw9Ytxez8/q5ZyFE= -github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= -github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= -github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= -github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= -github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= -github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= -github.com/huin/goupnp v1.0.3-0.20220313090229-ca81a64b4204/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= -github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= -github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= -github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= -github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= -github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY= -github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI= -github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= -github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/influxdata/influxdb1-client v0.0.0-20200515024757-02f0bf5dbca3/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c h1:qSHzRbhzK8RdXOsAdfDgO49TtqC1oZ+acxPrkfTxcCs= -github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/influxdata/influxql v1.1.1-0.20200828144457-65d3ef77d385/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk= -github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE= -github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8= -github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE= -github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= -github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= -github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= -github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= -github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= -github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jhump/protoreflect v1.9.0 h1:npqHz788dryJiR/l6K/RUQAyh2SwV91+d1dnh4RjO9w= -github.com/jhump/protoreflect v1.9.0/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= -github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= -github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= -github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= -github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= -github.com/klauspost/compress v1.17.3/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= -github.com/klauspost/compress v1.17.6 h1:60eq2E/jlfwQXtvZEeBUYADs+BwKBWURIY+Gj2eRGjI= -github.com/klauspost/compress v1.17.6/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= -github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc= -github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= -github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= -github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= -github.com/klauspost/reedsolomon v1.12.1 h1:NhWgum1efX1x58daOBGCFWcxtEhOhXKKl1HAPQUp03Q= -github.com/klauspost/reedsolomon v1.12.1/go.mod h1:nEi5Kjb6QqtbofI6s+cbG/j1da11c96IBYBSnVGtuBs= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kubernetes/client-go v11.0.0+incompatible/go.mod h1:kszVi2i+FeqECZHhjpkV5h5zM0GnURfJv897YzgoAQ8= -github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= -github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= -github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= -github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= -github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= -github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= -github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= -github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/logrusorgru/aurora v0.0.0-20191017060258-dc85c304c434/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/lucasjones/reggen v0.0.0-20180717132126-cdb49ff09d77/go.mod h1:5ELEyG+X8f+meRWHuqUOewBOhvHkl7M76pdGEansxW4= -github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= -github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= -github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= -github.com/markbates/pkger v0.15.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI= -github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= -github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= -github.com/mattn/go-zglob v0.0.1/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/mholt/archiver v3.1.1+incompatible/go.mod h1:Dh2dOXnSdiLxRiPoVfIr/fI1TwETms9B8CTWfeh7ROU= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= -github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 h1:QRUSJEgZn2Snx0EmT/QLXibWjSUDjKWvXIT19NBVp94= -github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= -github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= -github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= -github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= -github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= -github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= -github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= -github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= -github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= -github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76/go.mod h1:x5OoJHDHqxHS801UIuhqGl6QdSAEJvtausosHSdazIo= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= -github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= -github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/neilotoole/errgroup v0.1.6/go.mod h1:Q2nLGf+594h0CLBs/Mbg6qOr7GtqDK7C2S41udRnToE= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.29.0 h1:KIA/t2t5UBzoirT4H9tsML45GEbo3ouUnBHsCfD2tVg= -github.com/onsi/gomega v1.29.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= -github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= -github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.1.0-rc2 h1:2zx/Stx4Wc5pIPDvIxHXvXtQFW/7XWJGmnM7r3wg034= -github.com/opencontainers/image-spec v1.1.0-rc2/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ= -github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.1.3 h1:vIXrkId+0/J2Ymu2m7VjGvbSlAId9XNRPhn2p4b+d8w= -github.com/opencontainers/runc v1.1.3/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= -github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= -github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= -github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= -github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= -github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= -github.com/otiai10/copy v1.0.2/go.mod h1:c7RpqBkwMom4bYTSkLSym4VSJz/XtncWRAj/J4PEIMY= -github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= -github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= -github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= -github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= -github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= -github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= -github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= -github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= -github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08 h1:hDSdbBuw3Lefr6R18ax0tZ2BJeNB3NehB3trOwYBsdU= -github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= -github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= -github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= -github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pierrec/lz4 v2.5.2+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= -github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= -github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= -github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.6.0 h1:k1v3CzpSRUTrKMppY35TLwPvxHqBu0bYgxZzqGIgaos= -github.com/prometheus/client_model v0.6.0/go.mod h1:NTQHnmxFpouOD0DpvP4XujX3CdOAGQPoaGhyTchlyt8= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= -github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= -github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= -github.com/raulk/clock v1.1.0 h1:dpb29+UKMbLqiU/jqIJptgLR1nn23HLgMY0sTCDza5Y= -github.com/raulk/clock v1.1.0/go.mod h1:3MpVxdZ/ODBQDxbN+kzshf5OSZwPjtMDx6BBXBmOeY0= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= -github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/regen-network/cosmos-proto v0.3.1 h1:rV7iM4SSFAagvy8RiyhiACbWEGotmqzywPxOvwMdxcg= -github.com/regen-network/cosmos-proto v0.3.1/go.mod h1:jO0sVX6a1B36nmE8C9xBFXpNwWejXC7QqCOnH3O0+YM= -github.com/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= -github.com/regen-network/protobuf v1.3.3-alpha.regen.1/go.mod h1:2DjTFR1HhMQhiWC5sZ4OhQ3+NtdbZ6oBDKQwq5Ou+FI= -github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= -github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/cors v1.8.3 h1:O+qNyWn7Z+F9M0ILBHgMVPuB1xTOucVd5gtaYyXBpRo= -github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.32.0 h1:keLypqrlIjaFsbmJOBdB/qvyF8KEtCWHwobLp5l/mQ0= -github.com/rs/zerolog v1.32.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= -github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71efZx0= -github.com/sasha-s/go-deadlock v0.3.1/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY= -github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= -github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shirou/gopsutil v3.21.6+incompatible h1:mmZtAlWSd8U2HeRTjswbnDLPxqsEoK01NK+GZ1P+nEM= -github.com/shirou/gopsutil v3.21.6+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= -github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= -github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= -github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= -github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= -github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= -github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= -github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= -github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= -github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= -github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= -github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= -github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= -github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= -github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= -github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c h1:g+WoO5jjkqGAzHWCjJB1zZfXPIAaDpzXIEJ0eS6B5Ok= -github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= -github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= -github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= -github.com/tendermint/tm-db v0.6.7 h1:fE00Cbl0jayAoqlExN6oyQJ7fR/ZtoVOmvPJ//+shu8= -github.com/tendermint/tm-db v0.6.7/go.mod h1:byQDzFkZV1syXr/ReXS808NxA2xvyuuVgXOJ/088L6I= -github.com/testground/plan-templates/templates v0.0.0-20200429051153-b24fdc73e401/go.mod h1:MT3F6oeXhaO0bwhclY7dbOxKVfuDuWuO9YHy+TZvgNc= -github.com/testground/sdk-go v0.2.4/go.mod h1:3ewI3dydDseP7eCO1MHGh+67simvbkcUnguPYssFqiA= -github.com/testground/sdk-go v0.3.0 h1:tmFRZilWmYW5nHikd4RNN9IBKpvHRsg16MzvWQgYjiE= -github.com/testground/sdk-go v0.3.0/go.mod h1:HsInXM/XsSAquixQBddQDJvLdxlwdZ5fmB5ulCGaLU0= -github.com/testground/sync-service v0.1.0 h1:FmG5F426wyLufcFlBnV/qSDn0BvsqLCOm34wnAL0/Rg= -github.com/testground/sync-service v0.1.0/go.mod h1:UxLxsGjkZPqY1TtlusUu8xO0CS97eQ2PfIVF5O9JETA= -github.com/testground/testground v0.5.3 h1:WSfB6njhk0IGyMKr7Ky4jBa2k1rct4Oen11bio1fHFI= -github.com/testground/testground v0.5.3/go.mod h1:o7jPX2o6B1HmK6UFvPfVcGypNjTZa4yUjfOVsQRtb5s= -github.com/tidwall/btree v1.5.0 h1:iV0yVY/frd7r6qGBXfEYs7DH0gTDgrKTrDjS7xt/IyQ= -github.com/tidwall/btree v1.5.0/go.mod h1:LGm8L/DZjPLmeWGjv5kFrY8dL4uVhMmzmmLYmsObdKE= -github.com/tidwall/gjson v1.12.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/gjson v1.14.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/gjson v1.17.1 h1:wlYEnwqAHgzmhNUFfw7Xalt2JzQvsMx2Se4PcoFCT/U= -github.com/tidwall/gjson v1.17.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= -github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= -github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tidwall/sjson v1.2.4/go.mod h1:098SZ494YoMWPmMO6ct4dcFnqxwj9r/gF0Etp19pSNM= -github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= -github.com/tinylib/msgp v1.1.5/go.mod h1:eQsjooMTnV42mHu917E26IogZ2930nFyBQdofk10Udg= -github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/ttacon/chalk v0.0.0-20160626202418-22c06c80ed31/go.mod h1:onvgF043R+lC5RZ8IT9rBXDaEDnpnw/Cl+HFiw+v/7Q= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= -github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= -github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= -github.com/tyler-smith/go-bip39 v1.0.2/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= -github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= -github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.2.9 h1:rmenucSohSTiyL09Y+l2OCk+FrMxGMzho2+tjr5ticU= -github.com/ugorji/go/codec v1.2.9/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= -github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= -github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/ulikunitz/xz v0.5.10 h1:t92gobL9l3HE202wg3rlk19F6X+JOxl9BBrCCMYEYd8= -github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli/v2 v2.2.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= -github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= -github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= -github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/vishvananda/netlink v1.0.0/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= -github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= -github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= -github.com/whilp/git-urls v0.0.0-20191001220047-6db9661140c0/go.mod h1:2rx5KE5FLD0HRfkkpyn8JwbVLBdhgeiOb2D2D9LLKM4= -github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= -github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= -github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= -github.com/ybbus/jsonrpc v2.1.2+incompatible/go.mod h1:XJrh1eMSzdIYFbM08flv0wp5G35eRniyeGut1z+LSiE= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zondax/hid v0.9.2 h1:WCJFnEDMiqGF64nlZz28E9qLVZ0KSJ7xpc5DLEyma2U= -github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= -github.com/zondax/ledger-go v0.14.3 h1:wEpJt2CEcBJ428md/5MgSLsXLBos98sBOyxNmCjfUCw= -github.com/zondax/ledger-go v0.14.3/go.mod h1:IKKaoxupuB43g4NxeQmbLXv7T9AlQyie1UpHb342ycI= -gitlab.com/NebulousLabs/errors v0.0.0-20171229012116-7ead97ef90b8/go.mod h1:ZkMZ0dpQyWwlENaeZVBiQRjhMEZvk6VTXquzl3FOFP8= -gitlab.com/NebulousLabs/errors v0.0.0-20200929122200-06c536cf6975 h1:L/ENs/Ar1bFzUeKx6m3XjlmBgIUlykX9dzvp5k9NGxc= -gitlab.com/NebulousLabs/errors v0.0.0-20200929122200-06c536cf6975/go.mod h1:ZkMZ0dpQyWwlENaeZVBiQRjhMEZvk6VTXquzl3FOFP8= -gitlab.com/NebulousLabs/fastrand v0.0.0-20181126182046-603482d69e40 h1:dizWJqTWjwyD8KGcMOwgrkqu1JIkofYgKkmDeNE7oAs= -gitlab.com/NebulousLabs/fastrand v0.0.0-20181126182046-603482d69e40/go.mod h1:rOnSnoRyxMI3fe/7KIbVcsHRGxe30OONv8dEgo+vCfA= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0 h1:UNQQKPfTDe1J81ViolILjTKPr9WetKW6uei2hFgJmFs= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0/go.mod h1:r9vWsPS/3AQItv3OSlEJ/E4mbrhUbbw18meOjArPtKQ= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= -go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.18.0 h1:hSWWvDjXHVLq9DkmB+77fl8v7+t+yYiS+eNkiplDK54= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.18.0/go.mod h1:zG7KQql1WjZCaUJd+L/ReSYx4bjbYJxg5ws9ws+mYes= -go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= -go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= -go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= -go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= -go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= -golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/arch v0.1.0 h1:oMxhUYsO9VsR1dcoVUjJjIGhx1LXol3989T/yZ59Xsw= -golang.org/x/arch v0.1.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200109152110-61a87790db17/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/exp v0.0.0-20231206192017-f3f8817b8deb h1:c0vyKkb6yr3KR7jEfJaOSv4lG7xPkbN6r52aJz1d8a8= -golang.org/x/exp v0.0.0-20231206192017-f3f8817b8deb/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= -golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= -golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= -golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.0.0-20161028155119-f51c12702a4d/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= -golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= -gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= -google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= -google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.162.0 h1:Vhs54HkaEpkMBdgGdOT2P6F0csGG/vxDS0hWHJzmmps= -google.golang.org/api v0.162.0/go.mod h1:6SulDkfoBIg4NFmCuZ39XeeAgSHCPecfSUuDyYlAHs0= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200108215221-bd8f9a0ef82f/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200324203455-a04cca1dde73/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= -google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= -google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= -google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY= -google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo= -google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0= -google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de h1:cZGRis4/ot9uVm639a+rHCUaG0JJHEsdyzSQTMX+suY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:H4O17MA/PE9BsGx3w+a+W2VOLLD1Qf7oJneAoU6WktY= -google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= -google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= -gopkg.in/inf.v0 v0.9.0/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= -gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -k8s.io/api v0.0.0-20190703205437-39734b2a72fe/go.mod h1:J5EZ0KSEjvyKOBy5BDHSF3zn82madLLWg7nUKaOHZKU= -k8s.io/api v0.17.0/go.mod h1:npsyOePkeP0CPwyGfXDHxvypiYMJxBWAMpQxCaJ4ZxI= -k8s.io/apimachinery v0.0.0-20190703205208-4cfb76a8bf76/go.mod h1:M2fZgZL9DbLfeJaPBCDqSqNsdsmLN+V29knYJnIXlMA= -k8s.io/apimachinery v0.17.0/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= -k8s.io/client-go v0.0.0-20190706005506-4ed54556a14a/go.mod h1:vn7Y34rpPc8EO7qSbsZ7JCxA3ujt/wnQozW3RfYdT/E= -k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.3.1/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/kube-openapi v0.0.0-20190228160746-b3a7cee44a30/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= -k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= -k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/utils v0.0.0-20190607212802-c55fbcfc754a/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= -nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= -pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= -rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= -sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= -sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= -sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/test/testground/main.go b/test/testground/main.go deleted file mode 100644 index 8d5b593c52..0000000000 --- a/test/testground/main.go +++ /dev/null @@ -1,14 +0,0 @@ -package main - -import ( - "github.com/celestiaorg/celestia-app/test/testground/network" - "github.com/testground/sdk-go/run" -) - -var testcases = map[string]interface{}{ - "entrypoint": network.EntryPoint, -} - -func main() { - run.InvokeMap(testcases) -} diff --git a/test/testground/manifest.toml b/test/testground/manifest.toml deleted file mode 100644 index beaa9fc15d..0000000000 --- a/test/testground/manifest.toml +++ /dev/null @@ -1,48 +0,0 @@ -name = "core-app" - -[defaults] -builder = "docker:generic" -runner = "local:docker" - -[builders."docker:generic"] -enabled = true -build_base_image = "golang:1.22.4" -go_version = "1.22.4" -enable_go_build_cache = true - -[runners."local:docker"] -enabled = true - -[runners."cluster:k8s"] -enabled = true - -[[testcases]] -name = "entrypoint" -instances = { min = 1, max = 200, default = 3 } -[testcases.params] -chain_id = { type = "string", default = "testground" } -timeout = { type = "string", default = "21m" } -latency = { type = "int", default = 0 } -random_latency = { type = "bool", default = false } -bandwidth = { type = "string", default = "420Mib" } -per_peer_bandwidth = { type = "string", default = "5Mib" } -validators = { type = "int", default = 2 } -full_nodes = { type = "int", default = 0 } -timeout_propose = { type = "string", default = "10s" } -timeout_commit = { type = "string", default = "11s" } -halt_height = { type = "int", default = 50 } -pex = { type = "bool", default = true } -topology = { type = "string", default = "seed" } -blob_sequences = { type = "int", default = 10 } -blob_sizes = { type = "int", default = 100000 } -blobs_per_sequence = { type = "int", default = 1 } -inbound_peer_count = { type = "int", default = 40 } -outbound_peer_count = { type = "int", default = 10 } -gov_max_square_size = { type = "int", default = 256 } -max_block_bytes = { type = "int", default = 100000000 } -mempool = { type = "string", default = "v1" } -broadcast_txs = { type = "bool", default = true } -tracing_nodes = { type = "int", default = 0 } -tracing_url = { type = "string", default = "" } -tracing_token = { type = "string", default = "" } -experiment = { type = "experiment", default = "consistent-fill" } diff --git a/test/testground/network/command.go b/test/testground/network/command.go deleted file mode 100644 index 29ddfc5e8a..0000000000 --- a/test/testground/network/command.go +++ /dev/null @@ -1,156 +0,0 @@ -package network - -import ( - "context" - "encoding/json" - "fmt" - "sync" - "time" - - "github.com/testground/sdk-go/run" - "github.com/testground/sdk-go/runtime" -) - -const ( - // CancelCommand is the name of the command to cancel a command if it is - // still running. This is a special command because it is not executed - // normally, instead the Operator executes it directly. - CancelCommand = "cancel" - // TestEndName is the name of the command to signal the end of a test. This - // is a special command because it is not executed normally, instead the - // Operator executes it directly. - TestEndName = "test_end" -) - -// CommandHandler type defines the signature for command handlers -type CommandHandler func(ctx context.Context, runenv *runtime.RunEnv, initCtx *run.InitContext, args json.RawMessage) error - -func DefaultCommandRegistry() map[string]CommandHandler { - return make(map[string]CommandHandler) -} - -// Command is a struct to represent commands from the leader. Each command has -// an associated handler that describes the execution logic for the command. -type Command struct { - ID string `json:"id"` - Name string `json:"name"` - Args json.RawMessage `json:"args"` - Timeout time.Duration `json:"timeout"` - TargetGroup string `json:"target_group"` -} - -// Operator is a struct to manage the execution of commands. This is used to -// orchestrate actions across a network. When a command is received, the -// Operator will spawn a new goroutine to execute the command. The Operator -// will also track the status of each job and cancel any jobs that are still -// running when the Operator is stopped. -type Operator struct { - groupID string - registry map[string]CommandHandler - mut *sync.Mutex - jobs map[string]context.CancelFunc - wg *sync.WaitGroup -} - -// NewOperator initialize a new Operator struct. -func NewOperator() *Operator { - return &Operator{ - registry: DefaultCommandRegistry(), - jobs: make(map[string]context.CancelFunc), - wg: &sync.WaitGroup{}, - mut: &sync.Mutex{}, - } -} - -// Run starts the Operator and waits for commands to be received that target its group. The Operator -// will spawn a new goroutine for each command received. It will also cancel any -// running jobs when the context is canceled or an error is thrown. -func (o *Operator) Run(ctx context.Context, runenv *runtime.RunEnv, initCtx *run.InitContext, cmds <-chan Command) error { - defer o.Stop() - for { - select { - case <-ctx.Done(): - return nil - case cmd, ok := <-cmds: - if !ok { - return nil - } - switch cmd.Name { - case TestEndName: - runenv.RecordMessage("follower: test ended by leader") - return nil - case CancelCommand: - o.StopJob(cmd.ID) - default: - runenv.RecordMessage(fmt.Sprintf("follower: received command %s %+v", cmd.Name, cmd.Args)) - if cmd.TargetGroup != "all" { - if cmd.TargetGroup != o.groupID { - continue - } - } - - o.mut.Lock() - if o.jobs[cmd.ID] != nil { - runenv.RecordMessage(fmt.Sprintf("follower: job with id %s already exists", cmd.ID)) - continue - } - o.mut.Unlock() - - handler, exists := o.registry[cmd.Name] - if !exists { - runenv.RecordMessage(fmt.Sprintf("follower: job %s with id %s isn't registered", cmd.Name, cmd.ID)) - continue - } - - runenv.RecordMessage("handler exists") - - tctx, cancel := context.WithTimeout(ctx, cmd.Timeout) - o.jobs[cmd.ID] = cancel - o.wg.Add(1) - - go func(ctx context.Context, cmd Command) { - defer o.wg.Done() - defer o.StopJob(cmd.ID) - err := handler(ctx, runenv, initCtx, cmd.Args) - if err != nil { - runenv.RecordMessage(fmt.Sprintf("follower: job %s ID %s failed: %s", cmd.Name, cmd.ID, err)) - } - }(tctx, cmd) - - runenv.RecordMessage("follower: goroutine started") - } - } - } -} - -func (o *Operator) StopJob(id string) { - o.mut.Lock() - defer o.mut.Unlock() - if cancel, exists := o.jobs[id]; exists { - cancel() - delete(o.jobs, id) - } -} - -func (o *Operator) RegisterCommand(name string, handler CommandHandler) { - o.mut.Lock() - defer o.mut.Unlock() - o.registry[name] = handler -} - -// Stop will stop the Operator and wait for all jobs to complete -func (o *Operator) Stop() { - for id := range o.jobs { - o.StopJob(id) - } - o.wg.Wait() -} - -func EndTestCommand() Command { - return Command{ - ID: "test_end", - Name: TestEndName, - Timeout: time.Second * 10, - TargetGroup: "all", - } -} diff --git a/test/testground/network/command_test.go b/test/testground/network/command_test.go deleted file mode 100644 index 314b4d18df..0000000000 --- a/test/testground/network/command_test.go +++ /dev/null @@ -1,105 +0,0 @@ -package network - -import ( - "context" - "encoding/json" - "testing" - "time" - - "github.com/celestiaorg/celestia-app/app" - "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/p2p/pex" - "github.com/testground/sdk-go/run" - "github.com/testground/sdk-go/runtime" -) - -func TestOperator_StopJob(t *testing.T) { - op := NewOperator() - - // Add a fake job. - op.jobs["fake_job"] = func() { - t.Log("Fake job stopped") - } - - op.StopJob("fake_job") - - if _, exists := op.jobs["fake_job"]; exists { - t.Errorf("Job should be removed after StopJob") - } -} - -func TestOperator_Run(t *testing.T) { - // can't run this test if the runenv is actually used during the Run call - t.Skip("Skipping TestOperator_Run") - op := NewOperator() - - testDelay := time.Millisecond * 200 - - // Register a command handler. - op.registry["test_cmd"] = func(ctx context.Context, runenv *runtime.RunEnv, initCtx *run.InitContext, args json.RawMessage) error { - time.Sleep(testDelay) - return nil - } - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - runenv := &runtime.RunEnv{} - initCtx := &run.InitContext{} - - cmds := make(chan Command) - - go func() { - cmds <- Command{ - ID: "test1", - Name: "test_cmd", - Args: nil, - Timeout: time.Second, - } - close(cmds) - }() - - start := time.Now() - if err := op.Run(ctx, runenv, initCtx, cmds); err != nil { - t.Errorf("Run returned error: %s", err) - } - end := time.Now() - require.True(t, end.Sub(start) >= testDelay, "Run should block until all jobs are finished") - - require.Equal(t, 0, len(op.jobs), "All jobs should be canceled") -} - -func TestOperator_Stop(t *testing.T) { - op := NewOperator() - _, cancel := context.WithCancel(context.Background()) - - op.jobs["test_job"] = cancel - - op.Stop() - - if len(op.jobs) != 0 { - t.Errorf("All jobs should be canceled") - } -} - -func TestAddrBookLoading(t *testing.T) { - peerPacket := PeerPacket{ - GroupID: "seeds", - GlobalSequence: 4, - PeerID: "ad54e978933b00105c3615e65e6a27c5d27bdb29@192.168.0.15:26656", - } - temp := t.TempDir() - - tmcfg := app.DefaultConsensusConfig() - tmcfg = tmcfg.SetRoot(temp) - - err := addPeersToAddressBook(tmcfg.P2P.AddrBookFile(), []PeerPacket{peerPacket}) - require.NoError(t, err) - - addrBook := pex.NewAddrBook(tmcfg.P2P.AddrBookFile(), false) - err = addrBook.OnStart() - require.NoError(t, err) - - require.False(t, addrBook.Empty()) - require.Equal(t, addrBook.Size(), 1) -} diff --git a/test/testground/network/configurators.go b/test/testground/network/configurators.go deleted file mode 100644 index 36a2e40561..0000000000 --- a/test/testground/network/configurators.go +++ /dev/null @@ -1,144 +0,0 @@ -package network - -import ( - "errors" - "fmt" - "math/rand" - "sort" - "strings" - - "github.com/tendermint/tendermint/pkg/trace/schema" - "github.com/testground/sdk-go/runtime" -) - -const ( - TopologyParam = "topology" - ConnectAllTopology = "connect_all" - ConnectRandomTopology = "connect_random" - SeedTopology = "seed" - SeedGroupID = "seeds" -) - -func DefaultTopologies() []string { - return []string{ - ConnectAllTopology, - } -} - -// GetConfigurators -func GetConfigurators(runenv *runtime.RunEnv) ([]Configurator, error) { - topology := runenv.StringParam(TopologyParam) - if topology == "" { - topology = ConnectAllTopology - } - ops := make([]Configurator, 0) - switch topology { - case ConnectAllTopology: - ops = append(ops, ConnectAll) - case ConnectRandomTopology: - ops = append(ops, ConnectRandom(10)) - case SeedTopology: - // don't do anything since we are manually adding peers to the address book - default: - return nil, fmt.Errorf("unknown topology func: %s", topology) - } - - ops = append(ops, TracingConfigurator(runenv, ParseTracingParams(runenv))) - - return ops, nil -} - -// Configurator is a function that arbitrarily modifies the provided node -// configurations. It is used to generate the topology (which nodes are -// connected to which) of the network, along with making other arbitrary changes -// to the configs. -type Configurator func(nodes []RoleConfig) ([]RoleConfig, error) - -var _ = Configurator(ConnectAll) - -// ConnectAll is a Configurator that connects all nodes to each other via -// persistent peers. -func ConnectAll(nodes []RoleConfig) ([]RoleConfig, error) { - sort.Slice(nodes, func(i, j int) bool { - return nodes[i].GlobalSequence < nodes[j].GlobalSequence - }) - peerIDs := peerIDs(nodes) - - // For each node, generate the string that excludes its own P2PID - for i, nodeConfig := range nodes { - var filteredP2PIDs []string - for _, pid := range peerIDs { - if pid != nodeConfig.PeerID { - filteredP2PIDs = append(filteredP2PIDs, pid) - } - } - - // Here you could put the concatenated string into another field in NodeConfig - // or do whatever you want with it. - nodeConfig.CmtConfig.P2P.PersistentPeers = strings.Join(filteredP2PIDs, ",") - nodes[i] = nodeConfig - } - - return nodes, nil -} - -func ConnectRandom(numPeers int) Configurator { - return func(nodes []RoleConfig) ([]RoleConfig, error) { - if numPeers >= len(nodes) { - return nil, errors.New("numPeers should be less than the total number of nodes") - } - - for i, nodeConfig := range nodes { - // Shuffle the indexes for each nodeConfig - indexes := rand.Perm(len(nodes)) - - var chosenPeers []string - - for _, idx := range indexes { - potentialPeer := nodes[idx] - - if len(chosenPeers) >= numPeers { - break - } - if potentialPeer.PeerID != nodeConfig.PeerID { - chosenPeers = append(chosenPeers, potentialPeer.PeerID) - } - } - - nodeConfig.CmtConfig.P2P.PersistentPeers = strings.Join(chosenPeers, ",") - nodes[i] = nodeConfig - } - - return nodes, nil - } -} - -// TracingConfigurator is a Configurator that configures tracing for the -// network. It will set the nodes to collect only the round state data, and will -// set the nodes specified in the TracingParams to collect all trace data. -func TracingConfigurator(runenv *runtime.RunEnv, tparams TracingParams) Configurator { - return func(nodes []RoleConfig) ([]RoleConfig, error) { - runenv.RecordMessage(fmt.Sprintf("tracing nodes: %+v", tparams)) - - // set all of the nodes to collect the round state data. This allows us - // to measure when exactly each node progresses to the next step of - // consensus, but we are not overloading the influxdb instance with too - // much trace data. - for i := range nodes { - nodes[i].CmtConfig.Instrumentation.InfluxOrg = "celestia" - nodes[i].CmtConfig.Instrumentation.InfluxBucket = "testground" - nodes[i].CmtConfig.Instrumentation.InfluxBatchSize = 200 - nodes[i].CmtConfig.Instrumentation.InfluxURL = tparams.URL - nodes[i].CmtConfig.Instrumentation.InfluxToken = tparams.Token - nodes[i].CmtConfig.Instrumentation.InfluxTables = []string{schema.RoundStateTable} - } - - // Trace all data from these nodes. We might want to make this more - // configurable in the future. - for i := 0; i < tparams.Nodes; i++ { - nodes[i].CmtConfig.Instrumentation.InfluxTables = schema.AllTables() - } - - return nodes, nil - } -} diff --git a/test/testground/network/consensus_node.go b/test/testground/network/consensus_node.go deleted file mode 100644 index 14260c6ea1..0000000000 --- a/test/testground/network/consensus_node.go +++ /dev/null @@ -1,335 +0,0 @@ -package network - -import ( - "context" - "encoding/json" - "errors" - "fmt" - "math" - "net" - "os" - "path/filepath" - "regexp" - "strconv" - "strings" - - "github.com/celestiaorg/celestia-app/app" - "github.com/celestiaorg/celestia-app/app/encoding" - "github.com/celestiaorg/celestia-app/cmd/celestia-appd/cmd" - "github.com/celestiaorg/celestia-app/test/util/genesis" - "github.com/celestiaorg/celestia-app/test/util/testnode" - "github.com/cosmos/cosmos-sdk/crypto/keyring" - srvconfig "github.com/cosmos/cosmos-sdk/server/config" - srvtypes "github.com/cosmos/cosmos-sdk/server/types" - sdk "github.com/cosmos/cosmos-sdk/types" - tmconfig "github.com/tendermint/tendermint/config" - "github.com/tendermint/tendermint/crypto/ed25519" - cmtos "github.com/tendermint/tendermint/libs/os" - "github.com/tendermint/tendermint/node" - "github.com/tendermint/tendermint/p2p" - "github.com/tendermint/tendermint/p2p/pex" - "github.com/tendermint/tendermint/privval" - "github.com/testground/sdk-go/run" - "github.com/testground/sdk-go/runtime" -) - -// ConsensusNode is the node type used by testground instances to run a -// celestia-app full node. It can optionally be configured to be a validator, -// and has methods to bootstrap a network, initialize itself, start, and stop. -type ConsensusNode struct { - Name string - // NetworkKey is the key used for signing gossiped messages. - networkKey ed25519.PrivKey - // ConsensusKey is the key used for signing votes. - consensusKey ed25519.PrivKey - - kr keyring.Keyring - ecfg encoding.Config - - params *Params - CmtConfig *tmconfig.Config - AppConfig *srvconfig.Config - baseDir string - - cctx testnode.Context - - stopFuncs []func() error - // AppOptions are the application options of the test node. - AppOptions *testnode.KVAppOptions - // AppCreator is used to create the application for the testnode. - AppCreator srvtypes.AppCreator - // SuppressLogs in testnode. This should be set to true when running - // testground tests unless debugging. - SuppressLogs bool - - cmtNode *node.Node -} - -// Bootstrap is the first function called in a test by each node. It is -// responsible for initializing the node and creating a gentx if this node is a -// validator. -func (cn *ConsensusNode) Bootstrap(ctx context.Context, runenv *runtime.RunEnv, initCtx *run.InitContext) ([]PeerPacket, error) { - cn.ecfg = encoding.MakeConfig(app.ModuleBasics) - - ip, err := initCtx.NetClient.GetDataNetworkIP() - if err != nil { - return nil, err - } - - params, err := ParseParams(cn.ecfg, runenv) - if err != nil { - return nil, err - } - cn.params = params - - nodeID := NodeID(initCtx.GlobalSeq) - cn.Name = nodeID - - kr, addrs := testnode.NewKeyring(nodeID, TxSimAccountName) - cn.kr = kr - - val := genesis.NewDefaultValidator(nodeID) - ckey, ok := val.ConsensusKey.(ed25519.PrivKey) - if !ok { - return nil, errors.New("invalid consensus key type") - } - cn.consensusKey = ckey - nkey, ok := val.NetworkKey.(ed25519.PrivKey) - if !ok { - return nil, errors.New("invalid network key type") - } - cn.networkKey = nkey - - var bz []byte - if runenv.TestGroupID == ValidatorGroupID { - gentx, err := val.GenTx(cn.ecfg, cn.kr, cn.params.ChainID) - if err != nil { - return nil, err - } - bz, err = cn.ecfg.TxConfig.TxJSONEncoder()(gentx) - if err != nil { - return nil, err - } - } - - pubKs, err := getPublicKeys(cn.kr, nodeID, TxSimAccountName) - if err != nil { - return nil, err - } - - pp := PeerPacket{ - PeerID: peerID(ip.String(), cn.networkKey), - GroupID: runenv.TestGroupID, - GlobalSequence: initCtx.GlobalSeq, - GenesisAccounts: addrsToStrings(addrs...), - GenesisPubKeys: pubKs, - GenTx: json.RawMessage(bz), - } - - _, err = initCtx.SyncClient.Publish(ctx, PeerPacketTopic, pp) - if err != nil { - return nil, err - } - - packets, err := DownloadSync(ctx, initCtx, PeerPacketTopic, PeerPacket{}, runenv.TestInstanceCount) - if err != nil { - return nil, err - } - - return packets, nil -} - -// Init creates the files required by tendermint and celestia-app using the data -// downloaded from the Leader node. -func (cn *ConsensusNode) Init(baseDir string, genesis json.RawMessage, mcfg RoleConfig) error { - cn.CmtConfig = mcfg.CmtConfig - cn.AppConfig = mcfg.AppConfig - cn.AppCreator = cmd.NewAppServer - cn.SuppressLogs = true - - // manually set the protocol version to the one used by the testground - appOpts := testnode.DefaultAppOptions() - cn.AppOptions = appOpts - - baseDir = filepath.Join(baseDir, ".celestia-app") - cn.baseDir = baseDir - - cn.CmtConfig.SetRoot(baseDir) - - // save the genesis file - configPath := filepath.Join(baseDir, "config") - err := os.MkdirAll(configPath, os.ModePerm) - if err != nil { - return err - } - // save the genesis file as configured - err = cmtos.WriteFile(cn.CmtConfig.GenesisFile(), genesis, 0o644) - if err != nil { - return err - } - pvStateFile := cn.CmtConfig.PrivValidatorStateFile() - if err := cmtos.EnsureDir(filepath.Dir(pvStateFile), 0o777); err != nil { - return err - } - pvKeyFile := cn.CmtConfig.PrivValidatorKeyFile() - if err := cmtos.EnsureDir(filepath.Dir(pvKeyFile), 0o777); err != nil { - return err - } - filePV := privval.NewFilePV(cn.consensusKey, pvKeyFile, pvStateFile) - filePV.Save() - - nodeKeyFile := cn.CmtConfig.NodeKeyFile() - if err := cmtos.EnsureDir(filepath.Dir(nodeKeyFile), 0o777); err != nil { - return err - } - nodeKey := &p2p.NodeKey{ - PrivKey: cn.networkKey, - } - if err := nodeKey.SaveAs(nodeKeyFile); err != nil { - return err - } - - return nil -} - -// StartNode uses the testnode package to start a tendermint node with -// celestia-app and the provided configuration. -func (cn *ConsensusNode) StartNode(ctx context.Context, baseDir string) error { - ucfg := cn.UniversalTestingConfig() - tmNode, app, err := testnode.NewCometNode(baseDir, &ucfg) - if err != nil { - return err - } - - cn.cmtNode = tmNode - cctx := testnode.NewContext(ctx, cn.kr, ucfg.TmConfig, cn.params.ChainID, ucfg.AppConfig.API.Address) - - cctx, stopNode, err := testnode.StartNode(tmNode, cctx) - cn.stopFuncs = append(cn.stopFuncs, stopNode) - if err != nil { - return err - } - - cctx, cleanupGRPC, err := testnode.StartGRPCServer(app, ucfg.AppConfig, cctx) - cn.stopFuncs = append(cn.stopFuncs, cleanupGRPC) - - cn.cctx = cctx - - return err -} - -// Stop stops the node and cleans up the data directory by calling the cleanup -// functions. It returns the last error that was not nil if any of the cleanup -// functions returned an error. -func (cn *ConsensusNode) Stop() error { - var err error - for _, stop := range cn.stopFuncs { - if sterr := stop(); sterr != nil { - err = sterr - } - } - return err -} - -// UniversalTestingConfig returns the configuration used by the testnode package. -func (cn *ConsensusNode) UniversalTestingConfig() testnode.UniversalTestingConfig { - return testnode.UniversalTestingConfig{ - TmConfig: cn.CmtConfig, - AppConfig: cn.AppConfig, - AppOptions: cn.AppOptions, - AppCreator: cn.AppCreator, - SuppressLogs: cn.SuppressLogs, - } -} - -func addrsToStrings(addrs ...sdk.AccAddress) []string { - strs := make([]string, len(addrs)) - for i, addr := range addrs { - strs[i] = addr.String() - } - return strs -} - -func getPublicKeys(kr keyring.Keyring, accounts ...string) ([]string, error) { - keys := make([]string, 0, len(accounts)) - for _, acc := range accounts { - rec, err := kr.Key(acc) - if err != nil { - return nil, err - } - pubK, err := rec.GetPubKey() - if err != nil { - return nil, err - } - keys = append(keys, SerializePublicKey(pubK)) - } - return keys, nil -} - -func addPeersToAddressBook(path string, peers []PeerPacket) error { - err := os.MkdirAll(strings.Replace(path, "addrbook.json", "", -1), os.ModePerm) - if err != nil { - return err - } - - addrBook := pex.NewAddrBook(path, false) - err = addrBook.OnStart() - if err != nil { - return err - } - - for _, peer := range peers { - id, ip, peerPort, err := parsePeerID(peer.PeerID) - if err != nil { - return err - } - port, err := safeConvertIntToUint16(peerPort) - if err != nil { - return err - } - - netAddr := p2p.NetAddress{ - ID: p2p.ID(id), - IP: ip, - Port: port, - } - - err = addrBook.AddAddress(&netAddr, &netAddr) - if err != nil { - return err - } - } - - addrBook.Save() - return nil -} - -func parsePeerID(input string) (string, net.IP, int, error) { - // Define a regular expression to capture the address, IP, and port. - re := regexp.MustCompile(`^(.*?)@([\d.]+):(\d+)$`) - match := re.FindStringSubmatch(input) - - if len(match) != 4 { - return "", nil, 0, fmt.Errorf("invalid input format") - } - - // Extract the components from the regex match. - address := match[1] - ip := net.ParseIP(match[2]) - port := match[3] - - // Convert the port to an integer. - portInt, err := strconv.Atoi(port) - if err != nil { - return "", nil, 0, err - } - - return address, ip, portInt, nil -} - -func safeConvertIntToUint16(x int) (uint16, error) { - if x >= 0 && x <= math.MaxUint16 { - return uint16(x), nil - } - return 0, fmt.Errorf("%v is negative or too large to convert to uint16", x) -} diff --git a/test/testground/network/entry_point.go b/test/testground/network/entry_point.go deleted file mode 100644 index dd4c8bcf79..0000000000 --- a/test/testground/network/entry_point.go +++ /dev/null @@ -1,63 +0,0 @@ -package network - -import ( - "github.com/celestiaorg/celestia-app/test/testground/compositions" - "github.com/testground/sdk-go/run" - "github.com/testground/sdk-go/runtime" -) - -const FailedState = "failed" - -// EntryPoint is the universal entry point for all role based tests. -func EntryPoint(runenv *runtime.RunEnv, initCtx *run.InitContext) error { - initCtx, ctx, cancel, err := compositions.InitTest(runenv, initCtx) - if err != nil { - runenv.RecordFailure(err) - initCtx.SyncClient.MustSignalAndWait(ctx, FailedState, runenv.TestInstanceCount) - return err - } - defer cancel() - - // determine roles based only on the global sequence number. This allows for - // us to deterministically calculate the IP addresses of each node. - role, err := NewRole(runenv, initCtx) - if err != nil { - runenv.RecordFailure(err) - initCtx.SyncClient.MustSignalAndWait(ctx, FailedState, runenv.TestInstanceCount) - return err - } - - // The plan step is responsible for creating and distributing all network - // configurations including the genesis, keys, node types, topology, etc - // using the parameters defined in the manifest and plan toml files. The - // single "leader" role performs creation and publishing of the configs, - // while the "follower" roles download the configs from the leader. - err = role.Plan(ctx, runenv, initCtx) - if err != nil { - runenv.RecordFailure(err) - initCtx.SyncClient.MustSignalAndWait(ctx, FailedState, runenv.TestInstanceCount) - return err - } - - // The execute step is responsible for starting the node and/or running any - // tests. - err = role.Execute(ctx, runenv, initCtx) - if err != nil { - runenv.RecordFailure(err) - initCtx.SyncClient.MustSignalAndWait(ctx, FailedState, runenv.TestInstanceCount) - return err - } - - // The retro step is responsible for collecting any data from the node and/or - // running any retrospective tests or benchmarks. - err = role.Retro(ctx, runenv, initCtx) - if err != nil { - runenv.RecordFailure(err) - initCtx.SyncClient.MustSignalAndWait(ctx, FailedState, runenv.TestInstanceCount) - return err - } - - // signal that the test has completed successfully - runenv.RecordSuccess() - return nil -} diff --git a/test/testground/network/experiments.go b/test/testground/network/experiments.go deleted file mode 100644 index b7beb15772..0000000000 --- a/test/testground/network/experiments.go +++ /dev/null @@ -1,94 +0,0 @@ -package network - -import ( - "context" - "fmt" - "time" - - "github.com/celestiaorg/celestia-app/test/util/sdkutil" - "github.com/cosmos/cosmos-sdk/codec" - coretypes "github.com/tendermint/tendermint/types" - "github.com/testground/sdk-go/run" - "github.com/testground/sdk-go/runtime" -) - -const ( - UnboundedBlockSize = "unbounded" - ConsistentFill = "consistent-fill" -) - -func fillBlocks(ctx context.Context, runenv *runtime.RunEnv, initCtx *run.InitContext, timeout time.Duration) error { - seqs := runenv.IntParam(BlobSequencesParam) - size := runenv.IntParam(BlobSizesParam) - count := runenv.IntParam(BlobsPerSeqParam) - - cmd := NewRunTxSimCommand("txsim-0", timeout, RunTxSimCommandArgs{ - BlobSequences: seqs, - BlobSize: size, - BlobCount: count, - }) - - runenv.RecordMessage("leader: sending txsim command") - - _, err := initCtx.SyncClient.Publish(ctx, CommandTopic, cmd) - return err -} - -// unboundedBlockSize increases the block size until either the test times out -// (1h by default) or the ability to reach consensus is lost. -func (l *Leader) unboundedBlockSize( - ctx context.Context, - runenv *runtime.RunEnv, - initCtx *run.InitContext, - cdc codec.Codec, - heightStepSize int64, -) error { - err := fillBlocks(ctx, runenv, initCtx, time.Minute*59) - if err != nil { - return err - } - - query := "tm.event = 'NewBlockHeader'" - events, err := l.cctx.Client.Subscribe(ctx, "leader", query, 10) - if err != nil { - return err - } - - go func() { - // blockSize is the starting block size limit in bytes. This is - // incremented by blockIncrement each loop. - blockSize := 2000000 - // blockIncrement is the amount the block size limit is increased in - // bytes by each loop. This is incremented by 5000000 each loop. - blockIncrement := 5000000 - proposalCount := uint64(1) - for { - select { - case <-ctx.Done(): - return - case ev := <-events: - newHeader, ok := ev.Data.(coretypes.EventDataNewBlockHeader) - if !ok { - panic(fmt.Sprintf("unexpected event type: %T", ev.Data)) - } - - if newHeader.Header.Height%heightStepSize != 0 { - continue - } - - err = l.changeParams(ctx, runenv, proposalCount, sdkutil.MaxBlockBytesParamChange(cdc, blockSize)) - if err != nil { - runenv.RecordMessage("leader: failure to increase the blocksize %d, %v", blockSize, err) - runenv.RecordFailure(err) - return - } - runenv.RecordMessage("leader: changed max block size to %d", blockSize) - blockSize += blockIncrement - blockIncrement += 5000000 - proposalCount++ - } - } - }() - - return nil -} diff --git a/test/testground/network/follower.go b/test/testground/network/follower.go deleted file mode 100644 index ee5ecaf6f4..0000000000 --- a/test/testground/network/follower.go +++ /dev/null @@ -1,169 +0,0 @@ -package network - -import ( - "context" - "encoding/json" - "errors" - "time" - - "github.com/celestiaorg/celestia-app/test/txsim" - "github.com/testground/sdk-go/run" - "github.com/testground/sdk-go/runtime" -) - -// Follower is the role for all nodes in a test except for the leader. It is -// responsible for downloading the genesis block and any other configuration -// data from the leader node. -type Follower struct { - *ConsensusNode - op *Operator -} - -// NewFollower creates a new follower role. -func NewFollower() *Follower { - f := &Follower{&ConsensusNode{}, nil} - // all of the commands that the follower can receive have to be registered - // at some point. This is currently done here. - op := NewOperator() - op.RegisterCommand( - RunTxSimCommandID, - func(ctx context.Context, runenv *runtime.RunEnv, _ *run.InitContext, args json.RawMessage) error { - var a RunTxSimCommandArgs - err := json.Unmarshal(args, &a) - if err != nil { - return err - } - runenv.RecordMessage("running txsim") - return f.RunTxSim(ctx, a) - }, - ) - - f.op = op - return f -} - -// Plan is the method that downloads the genesis, configurations, and keys for -// all of the other nodes in the network. -func (f *Follower) Plan(ctx context.Context, runenv *runtime.RunEnv, initCtx *run.InitContext) error { - runenv.RecordMessage("follower bootstrapping") - packets, err := f.Bootstrap(ctx, runenv, initCtx) - if err != nil { - return err - } - - runenv.RecordMessage("follower Downloading Genesis") - - genBz, err := DownloadGenesis(ctx, initCtx) - if err != nil { - return err - } - - runenv.RecordMessage("follower downloading node configs") - - nodes, err := DownloadNodeConfigs(ctx, runenv, initCtx) - if err != nil { - return err - } - - node, has := searchNodes(nodes, initCtx.GlobalSeq) - if !has { - return errors.New("node not found") - } - - err = f.Init(homeDir, genBz, node) - if err != nil { - return err - } - - err = addPeersToAddressBook(f.CmtConfig.P2P.AddrBookFile(), packets) - if err != nil { - return err - } - - err = f.ConsensusNode.StartNode(ctx, f.baseDir) - if err != nil { - return err - } - - runenv.RecordMessage("follower waiting for start height") - - _, err = f.cctx.WaitForHeightWithTimeout(int64(5), time.Minute*7) - if err != nil { - return err - } - - return err -} - -func (f *Follower) Execute(ctx context.Context, runenv *runtime.RunEnv, initCtx *run.InitContext) error { - runenv.RecordMessage("follower waiting for commands") - return f.ListenForCommands(ctx, runenv, initCtx) -} - -// Retro collects standard data from the follower node and saves it as a file. -// This data includes the block times, rounds required to reach consensus, and -// the block sizes. -func (f *Follower) Retro(ctx context.Context, runenv *runtime.RunEnv, _ *run.InitContext) error { - //nolint:errcheck - defer f.ConsensusNode.Stop() - - res, err := f.cctx.Client.Status(ctx) - if err != nil { - return err - } - runenv.RecordMessage("follower retro", res) - return nil -} - -func (f *Follower) ListenForCommands(ctx context.Context, runenv *runtime.RunEnv, initCtx *run.InitContext) error { - cmds := make(chan Command) - defer close(cmds) - _, err := initCtx.SyncClient.Subscribe(ctx, CommandTopic, cmds) - if err != nil { - return err - } - // run will block until the context is canceled or the leader sends a - // command to stop. - return f.op.Run(ctx, runenv, initCtx, cmds) -} - -const ( - RunTxSimCommandID = "run_txsim" - RunSubmitRandomPFBs = "submit-random-pfbs" -) - -func NewRunTxSimCommand(id string, timeout time.Duration, args RunTxSimCommandArgs) Command { - bz, err := json.Marshal(args) - if err != nil { - panic(err) - } - cmd := Command{ - ID: id, - Name: RunTxSimCommandID, - Args: bz, - Timeout: timeout, - TargetGroup: "all", - } - return cmd -} - -type RunTxSimCommandArgs struct { - // BlobSequences is the number of blob sequences to run - BlobSequences int `json:"blob_sequences"` - BlobSize int `json:"blob_size"` - BlobCount int `json:"blob_count"` -} - -func (c *RunTxSimCommandArgs) Sequences() []txsim.Sequence { - return txsim.NewBlobSequence( - txsim.NewRange(c.BlobSize, c.BlobSize), - txsim.NewRange(c.BlobCount, c.BlobCount)). - Clone(c.BlobSequences) -} - -// RunTxSim runs the txsim tool on the follower node. -func (f *Follower) RunTxSim(ctx context.Context, c RunTxSimCommandArgs) error { - grpcEndpoint := "127.0.0.1:9090" - opts := txsim.DefaultOptions().UseFeeGrant().SuppressLogs() - return txsim.Run(ctx, grpcEndpoint, f.kr, f.ecfg, opts, c.Sequences()...) -} diff --git a/test/testground/network/leader.go b/test/testground/network/leader.go deleted file mode 100644 index 13b974fea6..0000000000 --- a/test/testground/network/leader.go +++ /dev/null @@ -1,299 +0,0 @@ -package network - -import ( - "context" - "encoding/hex" - "encoding/json" - "errors" - "fmt" - "time" - - "github.com/celestiaorg/celestia-app/app" - "github.com/celestiaorg/celestia-app/pkg/user" - "github.com/celestiaorg/celestia-app/test/util/genesis" - "github.com/celestiaorg/celestia-app/test/util/testfactory" - "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" - cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" - sdk "github.com/cosmos/cosmos-sdk/types" - v1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" - oldgov "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - "github.com/cosmos/cosmos-sdk/x/params/types/proposal" - cmtjson "github.com/tendermint/tendermint/libs/json" - coretypes "github.com/tendermint/tendermint/types" - "github.com/testground/sdk-go/run" - "github.com/testground/sdk-go/runtime" -) - -// Leader is the role for the leader node in a test. It is responsible for -// creating the genesis block and distributing it to all nodes. -type Leader struct { - *ConsensusNode - signer *user.Signer -} - -// Plan is the method that creates and distributes the genesis, configurations, -// and keys for all of the other nodes in the network. -func (l *Leader) Plan(ctx context.Context, runenv *runtime.RunEnv, initCtx *run.InitContext) error { - runenv.RecordMessage("Bootstrapping") - packets, err := l.Bootstrap(ctx, runenv, initCtx) - if err != nil { - return err - } - - runenv.RecordMessage("got packets, using parts for the genesis") - - // create Genesis and distribute it to all nodes - genesis, err := l.GenesisEvent(l.params, packets) - if err != nil { - return err - } - - err = PublishGenesis(ctx, initCtx, genesis) - if err != nil { - runenv.RecordMessage("it is the genesis publications") - return err - } - - runenv.RecordMessage("published genesis") - - nodes := NewConfigSet(l.params, packets) - - // apply the configurator functions to the testground config. This step is - // responsible for hardcoding any topolgy - for _, configurator := range l.params.Configurators { - nodes, err = configurator(nodes) - if err != nil { - return err - } - } - - runenv.RecordMessage("applied configurators") - - err = PublishNodeConfigs(ctx, initCtx, nodes) - if err != nil { - return err - } - - node, has := searchNodes(nodes, initCtx.GlobalSeq) - if !has { - return errors.New("node not found") - } - - genBytes, err := cmtjson.MarshalIndent(genesis, "", " ") - if err != nil { - return err - } - - err = l.Init(homeDir, genBytes, node) - if err != nil { - return err - } - - err = addPeersToAddressBook(l.CmtConfig.P2P.AddrBookFile(), packets) - if err != nil { - return err - } - - err = l.ConsensusNode.StartNode(ctx, l.baseDir) - if err != nil { - return err - } - - runenv.RecordMessage("waiting for initial height") - - _, err = l.cctx.WaitForHeightWithTimeout(int64(5), time.Minute*7) - if err != nil { - return err - } - - addr := testfactory.GetAddress(l.cctx.Keyring, l.Name) - - signer, err := user.SetupSigner(ctx, l.cctx.Keyring, l.cctx.GRPCClient, addr, l.ecfg) - if err != nil { - runenv.RecordMessage(fmt.Sprintf("leader: failed to setup signer %+v", err)) - return err - } - l.signer = signer - - // this is a helpful sanity check that logs the blocks from the POV of the - // leader in a testground viewable way. - //nolint:errcheck - go l.subscribeAndRecordBlocks(ctx, runenv) - - return nil -} - -func (l *Leader) Execute(ctx context.Context, runenv *runtime.RunEnv, initCtx *run.InitContext) error { - defer func() { - _, err := initCtx.SyncClient.Publish(ctx, CommandTopic, EndTestCommand()) - if err != nil { - runenv.RecordMessage(fmt.Sprintf("error publishing end test command: %v", err)) - } - }() - - switch l.params.Experiment { - case UnboundedBlockSize: - runenv.RecordMessage(fmt.Sprintf("leader running experiment %s", l.params.Experiment)) - err := l.unboundedBlockSize(ctx, runenv, initCtx, l.ecfg.Codec, 10) - if err != nil { - runenv.RecordMessage(fmt.Sprintf("error unbounded block size test: %v", err)) - } - case ConsistentFill: - runenv.RecordMessage(fmt.Sprintf("leader running experiment %s", l.params.Experiment)) - err := fillBlocks(ctx, runenv, initCtx, time.Minute*20) - if err != nil { - runenv.RecordMessage(fmt.Sprintf("error consistent fill block size test: %v", err)) - } - default: - return fmt.Errorf("unknown experiment %s", l.params.Experiment) - } - - runenv.RecordMessage(fmt.Sprintf("leader waiting for halt height %d", l.params.HaltHeight)) - - _, err := l.cctx.WaitForHeightWithTimeout(int64(l.params.HaltHeight), time.Minute*50) - if err != nil { - return err - } - - return err -} - -// Retro collects standard data from the leader node and saves it as a file. -// This data includes the block times, rounds required to reach consensus, and -// the block sizes. -func (l *Leader) Retro(ctx context.Context, runenv *runtime.RunEnv, _ *run.InitContext) error { - //nolint:errcheck - defer l.ConsensusNode.Stop() - - blockRes, err := l.cctx.Client.Header(ctx, nil) - if err != nil { - return err - } - - maxBlockSize := 0 - for i := int64(1); i < blockRes.Header.Height; i++ { - blockRes, err := l.cctx.Client.Block(ctx, nil) - if err != nil { - return err - } - size := blockRes.Block.Size() - if size > maxBlockSize { - maxBlockSize = size - } - } - - runenv.RecordMessage(fmt.Sprintf("leader retro: height %d max block size bytes %d", blockRes.Header.Height, maxBlockSize)) - - return nil -} - -func (l *Leader) GenesisEvent(params *Params, packets []PeerPacket) (*coretypes.GenesisDoc, error) { - pubKeys := make([]cryptotypes.PubKey, 0) - addrs := make([]string, 0) - gentxs := make([]json.RawMessage, 0, len(packets)) - - for _, packet := range packets { - pks, err := packet.GetPubKeys() - if err != nil { - return nil, err - } - pubKeys = append(pubKeys, pks...) - addrs = append(addrs, packet.GenesisAccounts...) - - if packet.GroupID == ValidatorGroupID { - gentxs = append(gentxs, packet.GenTx) - } - } - - return genesis.Document( - l.ecfg, - TestgroundConsensusParams(params), - l.params.ChainID, - gentxs, - addrs, - pubKeys, - params.GenesisModifiers..., - ) -} - -func SerializePublicKey(pubKey cryptotypes.PubKey) string { - return hex.EncodeToString(pubKey.Bytes()) -} - -func DeserializeAccountPublicKey(hexPubKey string) (cryptotypes.PubKey, error) { - bz, err := hex.DecodeString(hexPubKey) - if err != nil { - return nil, err - } - - var pubKey secp256k1.PubKey - if len(bz) != secp256k1.PubKeySize { - return nil, errors.New("incorrect pubkey size") - } - - pubKey.Key = bz - - return &pubKey, nil -} - -// changeParams submits a parameter change proposal to the network. Errors are -// thrown if the proposal is not submitted successfully. -func (l *Leader) changeParams(ctx context.Context, runenv *runtime.RunEnv, propID uint64, changes ...proposal.ParamChange) error { - content := proposal.NewParameterChangeProposal("title", "description", changes) - addr := testfactory.GetAddress(l.cctx.Keyring, l.Name) - - propMsg, err := oldgov.NewMsgSubmitProposal( - content, - sdk.NewCoins( - sdk.NewCoin(app.BondDenom, sdk.NewInt(1000000000))), - addr, - ) - if err != nil { - runenv.RecordMessage(fmt.Sprintf("leader: failed to create proposal msg %+v", err)) - return err - } - - voteMsg := v1.NewMsgVote(addr, propID, v1.VoteOption_VOTE_OPTION_YES, "") - - resp, err := l.signer.SubmitTx(ctx, []sdk.Msg{propMsg, voteMsg}, user.SetGasLimitAndFee(1000000, 0.2)) - if err != nil { - runenv.RecordMessage(fmt.Sprintf("leader: failed to submit tx %+v, %v", changes, err)) - return err - } - - if resp.Code != 0 { - runenv.RecordMessage(fmt.Sprintf("leader: failed to submit tx %+v, %v %v", changes, resp.Code, resp.Codespace)) - return fmt.Errorf("proposal failed with code %d: %s", resp.Code, resp.RawLog) - } - - runenv.RecordMessage(fmt.Sprintf("leader: submitted successful proposal %+v", changes)) - - return nil -} - -// subscribeAndRecordBlocks subscribes to the block event stream and records -// the block times and sizes. -func (l *Leader) subscribeAndRecordBlocks(ctx context.Context, runenv *runtime.RunEnv) error { - query := "tm.event = 'NewBlock'" - events, err := l.cctx.Client.Subscribe(ctx, "leader", query, 10) - if err != nil { - return err - } - - lastBlockTime := time.Now() - - for { - select { - case ev := <-events: - newBlock, ok := ev.Data.(coretypes.EventDataNewBlock) - if !ok { - return fmt.Errorf("unexpected event type: %T", ev.Data) - } - blockTime := newBlock.Block.Time.Sub(lastBlockTime) - runenv.RecordMessage(fmt.Sprintf("leader height %d time %v size bytes %d app version %v", newBlock.Block.Height, blockTime, newBlock.Block.Size(), newBlock.Block.Version.App)) - lastBlockTime = newBlock.Block.Time - case <-ctx.Done(): - return nil - } - } -} diff --git a/test/testground/network/params.go b/test/testground/network/params.go deleted file mode 100644 index fcdf2c7306..0000000000 --- a/test/testground/network/params.go +++ /dev/null @@ -1,206 +0,0 @@ -package network - -import ( - "errors" - "fmt" - "time" - - "github.com/celestiaorg/celestia-app/app" - "github.com/celestiaorg/celestia-app/app/encoding" - testgroundconsts "github.com/celestiaorg/celestia-app/pkg/appconsts/testground" - "github.com/celestiaorg/celestia-app/test/util/genesis" - blobtypes "github.com/celestiaorg/celestia-app/x/blob/types" - srvconfig "github.com/cosmos/cosmos-sdk/server/config" - tmconfig "github.com/tendermint/tendermint/config" - "github.com/tendermint/tendermint/crypto/ed25519" - "github.com/tendermint/tendermint/p2p" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - "github.com/testground/sdk-go/runtime" -) - -const ( - TimeoutParam = "timeout" - ChainIDParam = "chain_id" - ValidatorsParam = "validators" - FullNodesParam = "full_nodes" - HaltHeightParam = "halt_height" - PexParam = "pex" - SeedNodeParam = "seed_node" - BlobSequencesParam = "blob_sequences" - BlobSizesParam = "blob_sizes" - BlobsPerSeqParam = "blobs_per_sequence" - TimeoutCommitParam = "timeout_commit" - TimeoutProposeParam = "timeout_propose" - InboundPeerCountParam = "inbound_peer_count" - OutboundPeerCountParam = "outbound_peer_count" - GovMaxSquareSizeParam = "gov_max_square_size" - MaxBlockBytesParam = "max_block_bytes" - MempoolParam = "mempool" - BroadcastTxsParam = "broadcast_txs" - TracingTokenParam = "tracing_token" - TracingURLParam = "tracing_url" - TracingNodesParam = "tracing_nodes" - ExperimentParam = "experiment" -) - -type Params struct { - ChainID string - Validators int - FullNodes int - HaltHeight int - Timeout time.Duration - Pex bool - Configurators []Configurator - GenesisModifiers []genesis.Modifier - PerPeerBandwidth int - BlobsPerSeq int - BlobSequences int - BlobSizes int - InboundPeerCount int - OutboundPeerCount int - GovMaxSquareSize int - MaxBlockBytes int - TimeoutCommit time.Duration - TimeoutPropose time.Duration - Mempool string - BroadcastTxs bool - TracingParams - Experiment string -} - -type TracingParams struct { - Nodes int - URL string - Token string -} - -func ParseTracingParams(runenv *runtime.RunEnv) TracingParams { - return TracingParams{ - Nodes: runenv.IntParam(TracingNodesParam), - URL: runenv.StringParam(TracingURLParam), - Token: runenv.StringParam(TracingTokenParam), - } -} - -func ParseParams(ecfg encoding.Config, runenv *runtime.RunEnv) (*Params, error) { - var err error - p := &Params{} - - p.ChainID = runenv.StringParam(ChainIDParam) - - p.Validators = runenv.IntParam(ValidatorsParam) - - p.FullNodes = runenv.IntParam(FullNodesParam) - - p.HaltHeight = runenv.IntParam(HaltHeightParam) - - p.BlobSequences = runenv.IntParam(BlobSequencesParam) - - p.BlobSizes = runenv.IntParam(BlobSizesParam) - - p.BlobsPerSeq = runenv.IntParam(BlobsPerSeqParam) - - p.InboundPeerCount = runenv.IntParam(InboundPeerCountParam) - - p.OutboundPeerCount = runenv.IntParam(OutboundPeerCountParam) - - p.GovMaxSquareSize = runenv.IntParam(GovMaxSquareSizeParam) - - p.MaxBlockBytes = runenv.IntParam(MaxBlockBytesParam) - - p.Timeout, err = time.ParseDuration(runenv.StringParam(TimeoutParam)) - if err != nil { - return nil, err - } - - p.TimeoutCommit, err = time.ParseDuration(runenv.StringParam(TimeoutCommitParam)) - if err != nil { - return nil, err - } - - p.TimeoutPropose, err = time.ParseDuration(runenv.StringParam(TimeoutProposeParam)) - if err != nil { - return nil, err - } - - p.Configurators, err = GetConfigurators(runenv) - if err != nil { - return nil, err - } - - p.GenesisModifiers = p.getGenesisModifiers(ecfg) - - p.Pex = runenv.BooleanParam(PexParam) - - p.Mempool = runenv.StringParam(MempoolParam) - - p.BroadcastTxs = runenv.BooleanParam(BroadcastTxsParam) - - p.TracingParams = ParseTracingParams(runenv) - - p.Experiment = runenv.StringParam(ExperimentParam) - - return p, p.ValidateBasic() -} - -func (p *Params) ValidateBasic() error { - if p.Validators < 1 { - return errors.New("invalid number of validators") - } - if p.FullNodes < 0 { - return errors.New("invalid number of full nodes") - } - - return nil -} - -func (p *Params) NodeCount() int { - return p.FullNodes + p.Validators -} - -func StandardCometConfig(params *Params) *tmconfig.Config { - cmtcfg := app.DefaultConsensusConfig() - cmtcfg.Instrumentation.PrometheusListenAddr = "0.0.0.0:26660" - cmtcfg.Instrumentation.Prometheus = false - cmtcfg.P2P.PexReactor = params.Pex - cmtcfg.P2P.SendRate = int64(params.PerPeerBandwidth) - cmtcfg.P2P.RecvRate = int64(params.PerPeerBandwidth) - cmtcfg.P2P.AddrBookStrict = false - cmtcfg.Consensus.TimeoutCommit = params.TimeoutCommit - cmtcfg.Consensus.TimeoutPropose = params.TimeoutPropose - cmtcfg.TxIndex.Indexer = "kv" - cmtcfg.Mempool.Version = params.Mempool - cmtcfg.Mempool.MaxTxsBytes = 1_000_000_000 - cmtcfg.Mempool.MaxTxBytes = 100_000_000 - cmtcfg.Mempool.TTLNumBlocks = 100 - cmtcfg.Mempool.TTLDuration = 40 * time.Minute - return cmtcfg -} - -func StandardAppConfig(_ *Params) *srvconfig.Config { - return app.DefaultAppConfig() -} - -func TestgroundConsensusParams(params *Params) *tmproto.ConsensusParams { - cp := app.DefaultConsensusParams() - cp.Block.MaxBytes = int64(params.MaxBlockBytes) - cp.Version.AppVersion = testgroundconsts.Version - return cp -} - -func peerID(ip string, networkKey ed25519.PrivKey) string { - nodeID := string(p2p.PubKeyToID(networkKey.PubKey())) - return fmt.Sprintf("%s@%s:26656", nodeID, ip) -} - -func (p *Params) getGenesisModifiers(ecfg encoding.Config) []genesis.Modifier { - var modifiers []genesis.Modifier - - blobParams := blobtypes.DefaultParams() - blobParams.GovMaxSquareSize = uint64(p.GovMaxSquareSize) - modifiers = append(modifiers, genesis.SetBlobParams(ecfg.Codec, blobParams)) - - modifiers = append(modifiers, genesis.ImmediateProposals(ecfg.Codec)) - - return modifiers -} diff --git a/test/testground/network/role.go b/test/testground/network/role.go deleted file mode 100644 index f330af386c..0000000000 --- a/test/testground/network/role.go +++ /dev/null @@ -1,53 +0,0 @@ -package network - -import ( - "context" - "fmt" - - "github.com/testground/sdk-go/run" - "github.com/testground/sdk-go/runtime" -) - -const ( - homeDir = "/.celestia-app" - TxSimAccountName = "txsim" - ValidatorGroupID = "validators" - LeaderGlobalSequence = 1 -) - -// Role is the interface between a testground test entrypoint and the actual -// test logic. Testground creates many instances and passes each instance a -// configuration from the plan and manifest toml files. From those -// configurations a Role is created for each node, and the three methods below -// are ran in order. -type Role interface { - // Plan is the first function called in a test by each node. It is - // responsible for creating the genesis block, configuring nodes, and - // starting the network. - Plan(ctx context.Context, runenv *runtime.RunEnv, initCtx *run.InitContext) error - // Execute is the second function called in a test by each node. It is - // responsible for running any experiments. This is phase where commands are - // sent and received. - Execute(ctx context.Context, runenv *runtime.RunEnv, initCtx *run.InitContext) error - // Retro is the last function called in a test by each node. It is - // responsible for collecting any data from the node and/or running any - // retrospective tests or benchmarks. - Retro(ctx context.Context, runenv *runtime.RunEnv, initCtx *run.InitContext) error -} - -var _ Role = (*Leader)(nil) - -var _ Role = (*Follower)(nil) - -// NewRole creates a new role based on the role name. -func NewRole(runenv *runtime.RunEnv, initCtx *run.InitContext) (Role, error) { - seq := initCtx.GlobalSeq - switch seq { - case 1: - runenv.RecordMessage("leader standing by: group %s", runenv.TestGroupID) - return &Leader{ConsensusNode: &ConsensusNode{}}, nil - default: - runenv.RecordMessage(fmt.Sprintf("follower %d standing by: group %s", seq, runenv.TestGroupID)) - return NewFollower(), nil - } -} diff --git a/test/testground/network/sync.go b/test/testground/network/sync.go deleted file mode 100644 index d5e725f54f..0000000000 --- a/test/testground/network/sync.go +++ /dev/null @@ -1,223 +0,0 @@ -package network - -import ( - "context" - "encoding/hex" - "encoding/json" - "errors" - "fmt" - "sort" - - cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" - srvconfig "github.com/cosmos/cosmos-sdk/server/config" - tmconfig "github.com/tendermint/tendermint/config" - cmtjson "github.com/tendermint/tendermint/libs/json" - coretypes "github.com/tendermint/tendermint/types" - "github.com/testground/sdk-go/run" - "github.com/testground/sdk-go/runtime" - "github.com/testground/sdk-go/sync" -) - -const ( - FinishedConfigState = sync.State("finished-config") - wrapperParts = 20 -) - -var ( - // PeerPacketTopic is the topic that the peer packets are published to. This - // is the first piece of information that is published. - PeerPacketTopic = sync.NewTopic("peer_packet", PeerPacket{}) - // GenesisTopic is the topic that the genesis is published to. - GenesisTopic = sync.NewTopic("genesis", GenesisWrapper{}) - // MetaConfigTopic is the topic where each node's app and tendermint configs - // are puslished to. These are published before the any node starts. - MetaConfigTopic = sync.NewTopic("meta_config", RoleConfig{}) - // CommandTopic is the topic that commands are published to. These commands - // are published by the leader and subscribed to by all followers. - CommandTopic = sync.NewTopic("command", Command{}) -) - -// PeerPacket is the message that is sent to other nodes upon network -// initialization. It contains the necessary info from this node to start the -// network. -type PeerPacket struct { - PeerID string `json:"peer_id"` - GroupID string `json:"group_id"` - GlobalSequence int64 `json:"global_sequence"` - GenesisAccounts []string `json:"genesis_accounts"` - GenesisPubKeys []string `json:"pub_keys"` - GenTx json.RawMessage `json:"gen_tx"` -} - -func (pp *PeerPacket) IsValidator() bool { - return pp.GroupID == ValidatorGroupID -} - -func (pp *PeerPacket) IsLeader() bool { - return pp.GlobalSequence == LeaderGlobalSequence -} - -func (pp *PeerPacket) Name() string { - return NodeID(pp.GlobalSequence) -} - -func (pp *PeerPacket) GetPubKeys() ([]cryptotypes.PubKey, error) { - pks := make([]cryptotypes.PubKey, 0, len(pp.GenesisPubKeys)) - for _, pk := range pp.GenesisPubKeys { - sdkpk, err := DeserializeAccountPublicKey(pk) - if err != nil { - return nil, err - } - pks = append(pks, sdkpk) - } - return pks, nil -} - -func NewConfigSet(params *Params, pps []PeerPacket) []RoleConfig { - nodeConfigs := make([]RoleConfig, 0, len(pps)) - - for _, pp := range pps { - nodeConfigs = append(nodeConfigs, RoleConfig{ - CmtConfig: StandardCometConfig(params), - AppConfig: StandardAppConfig(params), - PeerID: pp.PeerID, - GroupID: pp.GroupID, - GlobalSequence: pp.GlobalSequence, - }) - } - - return nodeConfigs -} - -type RoleConfig struct { - PeerID string `json:"peer_id"` - GroupID string `json:"group_id"` - GlobalSequence int64 `json:"global_sequence"` - CmtConfig *tmconfig.Config `json:"cmt_config"` - AppConfig *srvconfig.Config `json:"app_config"` -} - -func peerIDs(nodes []RoleConfig) []string { - peerIDs := make([]string, 0, len(nodes)) - for _, nodeCfg := range nodes { - peerIDs = append(peerIDs, nodeCfg.PeerID) - } - return peerIDs -} - -func searchNodes(nodes []RoleConfig, globalSeq int64) (RoleConfig, bool) { - for _, node := range nodes { - if node.GlobalSequence == globalSeq { - return node, true - } - } - return RoleConfig{}, false -} - -func PublishNodeConfigs(ctx context.Context, initCtx *run.InitContext, nodes []RoleConfig) error { - for _, node := range nodes { - _, err := initCtx.SyncClient.Publish(ctx, MetaConfigTopic, node) - if err != nil { - return err - } - } - - return nil -} - -func DownloadNodeConfigs(ctx context.Context, runenv *runtime.RunEnv, initCtx *run.InitContext) ([]RoleConfig, error) { - return DownloadSync(ctx, initCtx, MetaConfigTopic, RoleConfig{}, runenv.TestInstanceCount) -} - -// GenesisWrapper is a simple struct wrapper that makes it easier testground to -// properly serialize and distribute the genesis file. -type GenesisWrapper struct { - // Part is the index of the part of the genesis file. This is used to bypass - // testground's 32Kb limit on messages. - Part int `json:"part"` - Genesis string `json:"genesis"` -} - -// PublishGenesis publishes the genesis to the sync service. It splits the -// genesis into 10 parts and publishes each part separately. This gets around the -// 32Kb limit the underlying websocket has -func PublishGenesis(ctx context.Context, initCtx *run.InitContext, gen *coretypes.GenesisDoc) error { - genBytes, err := cmtjson.Marshal(gen) - if err != nil { - return err - } - - wrappers := make([]GenesisWrapper, 0, wrapperParts) - partSize := len(genBytes) / wrapperParts - - for i := 0; i < wrapperParts; i++ { - start := i * partSize - end := start + partSize - if i == wrapperParts-1 { - end = len(genBytes) - } - - wrappers = append(wrappers, GenesisWrapper{ - Part: i, - Genesis: hex.EncodeToString(genBytes[start:end]), - }) - } - - for _, wrapper := range wrappers { - _, err = initCtx.SyncClient.Publish(ctx, GenesisTopic, wrapper) - if err != nil { - return err - } - } - - return nil -} - -func DownloadGenesis(ctx context.Context, initCtx *run.InitContext) (json.RawMessage, error) { - rawGens, err := DownloadSync(ctx, initCtx, GenesisTopic, GenesisWrapper{}, wrapperParts) - if err != nil { - return nil, err - } - // sort the genesis parts by their part number - sort.Slice(rawGens, func(i, j int) bool { - return rawGens[i].Part < rawGens[j].Part - }) - var genesis []byte - for _, rawGen := range rawGens { - bz, err := hex.DecodeString(rawGen.Genesis) - if err != nil { - return nil, err - } - genesis = append(genesis, bz...) - } - return genesis, nil -} - -// DownloadSync downloads the given topic from the sync service. It will -// download the given number of messages from the topic. If the topic is closed -// before the expected number of messages are received, an error is returned. -func DownloadSync[T any](ctx context.Context, initCtx *run.InitContext, topic *sync.Topic, _ T, count int) ([]T, error) { - ch := make(chan T) - sub, err := initCtx.SyncClient.Subscribe(ctx, topic, ch) - if err != nil { - return nil, err - } - - output := make([]T, 0, count) - for i := 0; i < count; i++ { - select { - case err := <-sub.Done(): - if err != nil { - return nil, err - } - return output, errors.New("subscription was closed before receiving the expected number of messages") - case o := <-ch: - output = append(output, o) - } - } - return output, nil -} - -func NodeID(globalSeq int64) string { - return fmt.Sprintf("%d", globalSeq) -} diff --git a/test/util/testnode/config.go b/test/util/testnode/config.go index 18990d7c16..8891f3d75e 100644 --- a/test/util/testnode/config.go +++ b/test/util/testnode/config.go @@ -31,7 +31,7 @@ type UniversalTestingConfig struct { // AppCreator is used to create the application for the testnode. AppCreator srvtypes.AppCreator // SuppressLogs in testnode. This should be set to true when running - // testground tests. + // network tests. SuppressLogs bool } From 34cd4b34d99e27c5e8611abab6aaecc550499045 Mon Sep 17 00:00:00 2001 From: Sanaz Taheri <35961250+staheri14@users.noreply.github.com> Date: Mon, 8 Jul 2024 11:51:56 -0700 Subject: [PATCH 13/40] test: adding big block tests to the main branch (#3612) Part of #3557 Closes https://github.com/celestiaorg/celestia-app/issues/3614 Closes #3638 Closes https://github.com/celestiaorg/celestia-app/issues/3371 --- test/e2e/benchmark/benchmark.go | 56 +++++++++++ test/e2e/benchmark/main.go | 7 ++ test/e2e/benchmark/manifest.go | 19 ++++ test/e2e/benchmark/throughput.go | 163 +++++++++++++++++++++++-------- test/e2e/testnet/defaults.go | 8 +- test/e2e/testnet/node.go | 14 +++ test/e2e/testnet/setup.go | 9 +- test/e2e/testnet/testnet.go | 13 ++- test/txsim/run.go | 5 +- 9 files changed, 243 insertions(+), 51 deletions(-) diff --git a/test/e2e/benchmark/benchmark.go b/test/e2e/benchmark/benchmark.go index 9268fe677b..cb1a678e5e 100644 --- a/test/e2e/benchmark/benchmark.go +++ b/test/e2e/benchmark/benchmark.go @@ -2,11 +2,14 @@ package main import ( + "context" "fmt" "log" "time" + "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" "github.com/celestiaorg/celestia-app/v2/test/e2e/testnet" + "github.com/celestiaorg/celestia-app/v2/test/util/testnode" "github.com/tendermint/tendermint/pkg/trace" ) @@ -118,3 +121,56 @@ func (b *BenchmarkTest) Run() error { return nil } + +func (b *BenchmarkTest) CheckResults(expectedBlockSizeBytes int64) error { + log.Println("Checking results") + + // if local tracing was enabled, + // pull block summary table from one of the nodes to confirm tracing + // has worked properly. + if b.manifest.LocalTracingType == "local" { + if _, err := b.Node(0).PullBlockSummaryTraces("."); err != nil { + return fmt.Errorf("failed to pull traces: %w", err) + } + } + + // download traces from S3, if enabled + if b.manifest.PushTrace && b.manifest.DownloadTraces { + // download traces from S3 + pushConfig, err := trace.GetPushConfigFromEnv() + if err != nil { + return fmt.Errorf("failed to get push config: %w", err) + } + err = trace.S3Download("./traces/", b.manifest.ChainID, + pushConfig) + if err != nil { + return fmt.Errorf("failed to download traces from S3: %w", err) + } + } + + log.Println("Reading blockchain") + blockchain, err := testnode.ReadBlockchain(context.Background(), + b.Node(0).AddressRPC()) + testnet.NoError("failed to read blockchain", err) + + targetSizeReached := false + maxBlockSize := int64(0) + for _, block := range blockchain { + if appconsts.LatestVersion != block.Version.App { + return fmt.Errorf("expected app version %d, got %d", appconsts.LatestVersion, block.Version.App) + } + size := int64(block.Size()) + if size >= expectedBlockSizeBytes { + targetSizeReached = true + break + } + if size > maxBlockSize { + maxBlockSize = size + } + } + if !targetSizeReached { + return fmt.Errorf("max reached block size is %d byte and is not within the expected range of %d and %d bytes", maxBlockSize, expectedBlockSizeBytes, b.manifest.MaxBlockBytes) + } + + return nil +} diff --git a/test/e2e/benchmark/main.go b/test/e2e/benchmark/main.go index 3a411e1bcd..be4eb1e126 100644 --- a/test/e2e/benchmark/main.go +++ b/test/e2e/benchmark/main.go @@ -11,6 +11,13 @@ func main() { tests := []Test{ {"TwoNodeSimple", TwoNodeSimple}, + {"TwoNodeBigBlock8MB", TwoNodeBigBlock8MB}, + {"TwoNodeBigBlock32MB", TwoNodeBigBlock32MB}, + {"TwoNodeBigBlock8MBLatency", TwoNodeBigBlock8MBLatency}, + {"TwoNodeBigBlock64MB", TwoNodeBigBlock64MB}, + {"LargeNetworkBigBlock8MB", LargeNetworkBigBlock8MB}, + {"LargeNetworkBigBlock32MB", LargeNetworkBigBlock32MB}, + {"LargeNetworkBigBlock64MB", LargeNetworkBigBlock64MB}, } // check the test name passed as an argument and run it diff --git a/test/e2e/benchmark/manifest.go b/test/e2e/benchmark/manifest.go index cbc740084d..979d009e98 100644 --- a/test/e2e/benchmark/manifest.go +++ b/test/e2e/benchmark/manifest.go @@ -1,6 +1,7 @@ package main import ( + "fmt" "time" "github.com/celestiaorg/celestia-app/v2/app" @@ -95,3 +96,21 @@ func (m *Manifest) GetConsensusParams() *tmproto.ConsensusParams { cparams.Block.MaxBytes = m.MaxBlockBytes return cparams } + +// summary generates a summary of the Manifest struct to be used as chain id. +func (m *Manifest) summary() string { + latency := 0 + if m.EnableLatency { + latency = 1 + } + maxBlockMB := m.MaxBlockBytes / testnet.MB + summary := fmt.Sprintf("v%d-t%d-b%d-bw%dmb-tc%d-tp%d-l%d-%s-%dmb", + m.Validators, m.TxClients, + m.BlobSequences, m.PerPeerBandwidth/testnet.MB, + m.TimeoutCommit/time.Second, m.TimeoutPropose/time.Second, + latency, m.Mempool, maxBlockMB) + if len(summary) > 50 { + return summary[:50] + } + return summary +} diff --git a/test/e2e/benchmark/throughput.go b/test/e2e/benchmark/throughput.go index ae283b8804..ef0080029e 100644 --- a/test/e2e/benchmark/throughput.go +++ b/test/e2e/benchmark/throughput.go @@ -1,26 +1,65 @@ package main import ( - "context" - "fmt" "log" "time" "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" "github.com/celestiaorg/celestia-app/v2/test/e2e/testnet" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" - "github.com/tendermint/tendermint/pkg/trace" ) const ( seed = 42 ) +var bigBlockManifest = Manifest{ + ChainID: "test", + Validators: 2, + TxClients: 2, + ValidatorResource: testnet.Resources{ + MemoryRequest: "12Gi", + MemoryLimit: "12Gi", + CPU: "8", + Volume: "20Gi", + }, + TxClientsResource: testnet.Resources{ + MemoryRequest: "1Gi", + MemoryLimit: "3Gi", + CPU: "2", + Volume: "1Gi", + }, + SelfDelegation: 10000000, + // @TODO Update the CelestiaAppVersion and TxClientVersion to the latest + // version of the main branch once the PR#3261 is merged by addressing this + // issue https://github.com/celestiaorg/celestia-app/issues/3603. + CelestiaAppVersion: "pr-3261", + TxClientVersion: "pr-3261", + EnableLatency: false, + LatencyParams: LatencyParams{70, 0}, // in milliseconds + BlobSequences: 60, + BlobsPerSeq: 6, + BlobSizes: "200000", + PerPeerBandwidth: 5 * testnet.MB, + UpgradeHeight: 0, + TimeoutCommit: 11 * time.Second, + TimeoutPropose: 80 * time.Second, + Mempool: "v1", // ineffective as it always defaults to v1 + BroadcastTxs: true, + Prometheus: false, + GovMaxSquareSize: 512, + MaxBlockBytes: 7800000, + TestDuration: 5 * time.Minute, + LocalTracingType: "local", + PushTrace: true, +} + func TwoNodeSimple(logger *log.Logger) error { latestVersion, err := testnet.GetLatestVersion() testnet.NoError("failed to get latest version", err) - logger.Println("=== RUN TwoNodeSimple", "version:", latestVersion) + testName := "TwoNodeSimple" + logger.Printf("Running %s\n", testName) + logger.Println("version", latestVersion) manifest := Manifest{ ChainID: "test-e2e-two-node-simple", @@ -31,11 +70,11 @@ func TwoNodeSimple(logger *log.Logger) error { CelestiaAppVersion: latestVersion, TxClientVersion: testnet.TxsimVersion, EnableLatency: false, - LatencyParams: LatencyParams{100, 10}, // in milliseconds + LatencyParams: LatencyParams{70, 0}, // in milliseconds BlobsPerSeq: 6, - BlobSequences: 50, + BlobSequences: 60, BlobSizes: "200000", - PerPeerBandwidth: 5 * 1024 * 1024, + PerPeerBandwidth: 5 * testnet.MB, UpgradeHeight: 0, TimeoutCommit: 1 * time.Second, TimeoutPropose: 1 * time.Second, @@ -47,11 +86,11 @@ func TwoNodeSimple(logger *log.Logger) error { LocalTracingType: "local", PushTrace: false, DownloadTraces: false, - TestDuration: 2 * time.Minute, + TestDuration: 3 * time.Minute, TxClients: 2, } - benchTest, err := NewBenchmarkTest("E2EThroughput", &manifest) + benchTest, err := NewBenchmarkTest(testName, &manifest) testnet.NoError("failed to create benchmark test", err) defer func() { @@ -63,42 +102,80 @@ func TwoNodeSimple(logger *log.Logger) error { testnet.NoError("failed to run the benchmark test", benchTest.Run()) - // post test data collection and validation + testnet.NoError("failed to check results", benchTest.CheckResults(1*testnet.MB)) - // if local tracing is enabled, - // pull round state traces to confirm tracing is working as expected. - if benchTest.manifest.LocalTracingType == "local" { - if _, err := benchTest.Node(0).PullRoundStateTraces("."); err != nil { - return fmt.Errorf("failed to pull round state traces: %w", err) - } - } + return nil +} - // download traces from S3, if enabled - if benchTest.manifest.PushTrace && benchTest.manifest.DownloadTraces { - // download traces from S3 - pushConfig, _ := trace.GetPushConfigFromEnv() - err := trace.S3Download("./traces/", benchTest.manifest.ChainID, - pushConfig) - if err != nil { - return fmt.Errorf("failed to download traces from S3: %w", err) - } - } +func runBenchmarkTest(logger *log.Logger, testName string, manifest Manifest) error { + logger.Printf("Running %s\n", testName) + manifest.ChainID = manifest.summary() + log.Println("ChainID: ", manifest.ChainID) + benchTest, err := NewBenchmarkTest(testName, &manifest) + testnet.NoError("failed to create benchmark test", err) - log.Println("Reading blockchain") - blockchain, err := testnode.ReadBlockchain(context.Background(), - benchTest.Node(0).AddressRPC()) - testnet.NoError("failed to read blockchain", err) - - totalTxs := 0 - for _, block := range blockchain { - if appconsts.LatestVersion != block.Version.App { - return fmt.Errorf("expected app version %d, got %d", appconsts.LatestVersion, block.Version.App) - } - totalTxs += len(block.Data.Txs) - } - if totalTxs < 10 { - return fmt.Errorf("expected at least 10 transactions, got %d", totalTxs) - } + defer func() { + log.Print("Cleaning up testnet") + benchTest.Cleanup() + }() + + testnet.NoError("failed to setup nodes", benchTest.SetupNodes()) + testnet.NoError("failed to run the benchmark test", benchTest.Run()) + expectedBlockSize := int64(0.90 * float64(manifest.MaxBlockBytes)) + testnet.NoError("failed to check results", benchTest.CheckResults(expectedBlockSize)) return nil } + +func TwoNodeBigBlock8MB(logger *log.Logger) error { + manifest := bigBlockManifest + manifest.MaxBlockBytes = 8 * testnet.MB + return runBenchmarkTest(logger, "TwoNodeBigBlock8MB", manifest) +} + +func TwoNodeBigBlock8MBLatency(logger *log.Logger) error { + manifest := bigBlockManifest + manifest.MaxBlockBytes = 8 * testnet.MB + manifest.EnableLatency = true + manifest.LatencyParams = LatencyParams{70, 0} + return runBenchmarkTest(logger, "TwoNodeBigBlock8MBLatency", manifest) +} + +func TwoNodeBigBlock32MB(logger *log.Logger) error { + manifest := bigBlockManifest + manifest.MaxBlockBytes = 32 * testnet.MB + return runBenchmarkTest(logger, "TwoNodeBigBlock32MB", manifest) +} + +func TwoNodeBigBlock64MB(logger *log.Logger) error { + manifest := bigBlockManifest + manifest.MaxBlockBytes = 64 * testnet.MB + return runBenchmarkTest(logger, "TwoNodeBigBlock64MB", manifest) +} + +func LargeNetworkBigBlock8MB(logger *log.Logger) error { + manifest := bigBlockManifest + manifest.MaxBlockBytes = 8 * testnet.MB + manifest.Validators = 50 + manifest.TxClients = 50 + manifest.BlobSequences = 2 + return runBenchmarkTest(logger, "LargeNetworkBigBlock8MB", manifest) +} + +func LargeNetworkBigBlock32MB(logger *log.Logger) error { + manifest := bigBlockManifest + manifest.MaxBlockBytes = 32 * testnet.MB + manifest.Validators = 50 + manifest.TxClients = 50 + manifest.BlobSequences = 2 + return runBenchmarkTest(logger, "LargeNetworkBigBlock32MB", manifest) +} + +func LargeNetworkBigBlock64MB(logger *log.Logger) error { + manifest := bigBlockManifest + manifest.MaxBlockBytes = 64 * testnet.MB + manifest.Validators = 50 + manifest.TxClients = 50 + manifest.BlobSequences = 2 + return runBenchmarkTest(logger, "LargeNetworkBigBlock64MB", manifest) +} diff --git a/test/e2e/testnet/defaults.go b/test/e2e/testnet/defaults.go index 841c599751..1ea4bbb585 100644 --- a/test/e2e/testnet/defaults.go +++ b/test/e2e/testnet/defaults.go @@ -7,4 +7,10 @@ var DefaultResources = Resources{ Volume: "1Gi", } -const TxsimVersion = "pr-3541" +const ( + TxsimVersion = "pr-3541" + MB = 1000 * 1000 + GB = 1000 * MB + MiB = 1024 * 1024 + GiB = 1024 * MiB +) diff --git a/test/e2e/testnet/node.go b/test/e2e/testnet/node.go index c47f5007ff..b505eca2dc 100644 --- a/test/e2e/testnet/node.go +++ b/test/e2e/testnet/node.go @@ -63,6 +63,20 @@ func (n *Node) PullRoundStateTraces(path string) ([]trace.Event[schema.RoundStat return nil, nil } +// PullBlockSummaryTraces retrieves the block summary traces from a node. +// It will save them to the provided path. +func (n *Node) PullBlockSummaryTraces(path string) ([]trace.Event[schema.BlockSummary], error, +) { + addr := n.AddressTracing() + log.Info().Str("Address", addr).Msg("Pulling block summary traces") + + err := trace.GetTable(addr, schema.BlockSummary{}.Table(), path) + if err != nil { + return nil, fmt.Errorf("getting table: %w", err) + } + return nil, nil +} + // Resources defines the resource requirements for a Node. type Resources struct { // MemoryRequest specifies the initial memory allocation for the Node. diff --git a/test/e2e/testnet/setup.go b/test/e2e/testnet/setup.go index 2f76976b08..ffdd3ffd50 100644 --- a/test/e2e/testnet/setup.go +++ b/test/e2e/testnet/setup.go @@ -13,7 +13,10 @@ import ( ) func MakeConfig(node *Node, opts ...Option) (*config.Config, error) { - cfg := config.DefaultConfig() + cfg := app.DefaultConsensusConfig() + cfg.TxIndex.Indexer = "kv" + cfg.Mempool.MaxTxsBytes = 1 * GiB + cfg.Mempool.MaxTxBytes = 8 * MiB cfg.Moniker = node.Name cfg.RPC.ListenAddress = "tcp://0.0.0.0:26657" cfg.P2P.ExternalAddress = fmt.Sprintf("tcp://%v", node.AddressP2P(false)) @@ -95,7 +98,7 @@ func MakeAppConfig(_ *Node) (*serverconfig.Config, error) { srvCfg.MinGasPrices = fmt.Sprintf("0.001%s", app.BondDenom) // updating MaxRecvMsgSize and MaxSendMsgSize allows submission of 128MiB worth of // transactions simultaneously which is useful for big block tests. - srvCfg.GRPC.MaxRecvMsgSize = 128 * 1024 * 1024 - srvCfg.GRPC.MaxSendMsgSize = 128 * 1024 * 1024 + srvCfg.GRPC.MaxRecvMsgSize = 128 * MiB + srvCfg.GRPC.MaxSendMsgSize = 128 * MiB return srvCfg, srvCfg.ValidateBasic() } diff --git a/test/e2e/testnet/testnet.go b/test/e2e/testnet/testnet.go index 71f076c8df..e300a77288 100644 --- a/test/e2e/testnet/testnet.go +++ b/test/e2e/testnet/testnet.go @@ -181,8 +181,9 @@ func (t *Testnet) StartTxClients() error { for _, txsim := range t.txClients { err := txsim.Instance.WaitInstanceIsRunning() if err != nil { - return fmt.Errorf("txsim %s failed to start: %w", txsim.Name, err) + return fmt.Errorf("txsim %s failed to run: %w", txsim.Name, err) } + } return nil } @@ -338,6 +339,7 @@ func (t *Testnet) Start() error { if err != nil { return err } + log.Info().Msg("forwarding ports for genesis nodes") // wait for instances to be running for _, node := range genesisNodes { err := node.WaitUntilStartedAndForwardPorts() @@ -346,7 +348,10 @@ func (t *Testnet) Start() error { } } // wait for nodes to sync - for _, node := range genesisNodes { + log.Info().Msg("waiting for genesis nodes to sync") + for i, node := range genesisNodes { + log.Info().Int("Index", i).Str("name", node.Name).Msg( + "waiting for node to sync") client, err := node.Client() if err != nil { return fmt.Errorf("failed to initialized node %s: %w", node.Name, err) @@ -361,8 +366,12 @@ func (t *Testnet) Start() error { continue } if resp.SyncInfo.LatestBlockHeight > 0 { + log.Info().Int("Index", i).Str("name", node.Name).Msg( + "node has synced") break } + log.Info().Int64("height", resp.SyncInfo.LatestBlockHeight).Msg( + "height is 0, waiting...") if i == 9 { return fmt.Errorf("failed to start node %s", node.Name) } diff --git a/test/txsim/run.go b/test/txsim/run.go index cbc609db7c..00390b2ee2 100644 --- a/test/txsim/run.go +++ b/test/txsim/run.go @@ -19,8 +19,9 @@ import ( const DefaultSeed = 900183116 const ( - grpcMaxRecvMsgSize = 128 * 1024 * 1024 - grpcMaxSendMsgSize = 128 * 1024 * 1024 + MiB = 1024 * 1024 + grpcMaxRecvMsgSize = 128 * MiB + grpcMaxSendMsgSize = 128 * MiB ) // Run is the entrypoint function for starting the txsim client. The lifecycle of the client is managed From 80517d32de877304d57b38c5aaa02883d1ff2d67 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 13 Jul 2024 11:33:29 +0200 Subject: [PATCH 14/40] chore(deps): Bump github.com/ethereum/go-ethereum from 1.14.6 to 1.14.7 (#3677) Bumps [github.com/ethereum/go-ethereum](https://github.com/ethereum/go-ethereum) from 1.14.6 to 1.14.7.
Release notes

Sourced from github.com/ethereum/go-ethereum's releases.

Trident (v1.14.7)

This is a hot-fix release for a bug (#30139) which affects only the previous release. Users of v1.14.6 are kindly requested to update.

For a full rundown of the changes please consult the Geth 1.14.7 release milestone.


As with all our previous releases, you can find the:

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/ethereum/go-ethereum&package-manager=go_modules&previous-version=1.14.6&new-version=1.14.7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 8d5bdff8da..3621ad8ec9 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,7 @@ require ( github.com/cosmos/gogoproto v1.5.0 github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v6 v6.1.2 github.com/cosmos/ibc-go/v6 v6.2.2 - github.com/ethereum/go-ethereum v1.14.6 + github.com/ethereum/go-ethereum v1.14.7 github.com/gogo/protobuf v1.3.3 github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.4 @@ -137,7 +137,7 @@ require ( github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/hdevalence/ed25519consensus v0.0.0-20220222234857-c00d1f31bab3 // indirect - github.com/holiman/uint256 v1.2.4 // indirect + github.com/holiman/uint256 v1.3.0 // indirect github.com/iancoleman/orderedmap v0.2.0 // indirect github.com/imdario/mergo v0.3.16 // indirect github.com/improbable-eng/grpc-web v0.15.0 // indirect diff --git a/go.sum b/go.sum index 14e0795c43..eac6a7f66f 100644 --- a/go.sum +++ b/go.sum @@ -523,8 +523,8 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.10.17/go.mod h1:Lt5WzjM07XlXc95YzrhosmR4J9Ahd6X2wyEV2SvGhk0= -github.com/ethereum/go-ethereum v1.14.6 h1:ZTxnErSopkDyxdvB8zW/KcK+/AVrdil/TzoWXVKaaC8= -github.com/ethereum/go-ethereum v1.14.6/go.mod h1:hglUZo/5pVIYXNyYjWzsAUDpT/zI+WbWo/Nih7ot+G0= +github.com/ethereum/go-ethereum v1.14.7 h1:EHpv3dE8evQmpVEQ/Ne2ahB06n2mQptdwqaMNhAT29g= +github.com/ethereum/go-ethereum v1.14.7/go.mod h1:Mq0biU2jbdmKSZoqOj29017ygFrMnB5/Rifwp980W4o= github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= @@ -853,8 +853,8 @@ github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8 github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= -github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= -github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= +github.com/holiman/uint256 v1.3.0 h1:4wdcm/tnd0xXdu7iS3ruNvxkWwrb4aeBQv19ayYn8F4= +github.com/holiman/uint256 v1.3.0/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/huin/goupnp v1.0.3-0.20220313090229-ca81a64b4204/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= From 6116a2e2881e6518a547b49bc46acd7b17e2808b Mon Sep 17 00:00:00 2001 From: Elias Rad <146735585+nnsW3@users.noreply.github.com> Date: Sat, 13 Jul 2024 13:18:04 +0300 Subject: [PATCH 15/40] docs: Rectify typographical inaccuracies (#3675) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR addresses several typographical errors across various files in the project. The changes improve readability and maintain the professional standard of the documentation and code comments. Justification Typographical errors, while minor, can detract from the overall quality of the project. Correcting these errors ensures clarity and professionalism, making the project more accessible and understandable for current and future contributors. Hope it helps. --------- Co-authored-by: CHAMI Rachid Co-authored-by: nina / ნინა --- docs/architecture/adr-001-abci++-adoption.md | 2 +- docs/architecture/adr-002-qgb-valset.md | 2 +- docs/architecture/adr-006-non-interactive-defaults.md | 2 +- docs/architecture/adr-018-network-upgrades.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/architecture/adr-001-abci++-adoption.md b/docs/architecture/adr-001-abci++-adoption.md index 5c3f89e48a..1f31c63dd5 100644 --- a/docs/architecture/adr-001-abci++-adoption.md +++ b/docs/architecture/adr-001-abci++-adoption.md @@ -127,7 +127,7 @@ func (cs *State) defaultDoPrevote(height int64, round int32) { cs.Logger.Error("state machine returned an error when trying to process proposal block", "err", err) } - // Vote nil if application invalidated the block + // Vote nil if the application invalidated the block if !stateMachineValidBlock { // Consensus says we must vote nil logger.Error("prevote step: consensus deems this block to be mustVoteNil", "err", err) diff --git a/docs/architecture/adr-002-qgb-valset.md b/docs/architecture/adr-002-qgb-valset.md index b307f9fe30..f446941246 100644 --- a/docs/architecture/adr-002-qgb-valset.md +++ b/docs/architecture/adr-002-qgb-valset.md @@ -16,7 +16,7 @@ PS: The `ValsetConfirm` have been updated in `adr-005-qgb-reduce-state-usage`. P ## Detailed Design -Since the QGB is only a one-way bridge and is not transferring assets, it doesn't require the portions of the gravity module that recreate the state from the bridged chain. We only need to keep things relating to signing over the validator set (such as`MsgSetOrchestratorAddress` and `MsgValsetConfirm`) and relayer queries (such as `ValsetConfirm` and `GetDelegateKeyByOrchestrator`). +Since the QGB is only a one-way bridge and does not transfer assets, it doesn't require the portions of the gravity module that recreate the state from the bridged chain. We only need to keep things relating to signing over the validator set (such as`MsgSetOrchestratorAddress` and `MsgValsetConfirm`) and relayer queries (such as `ValsetConfirm` and `GetDelegateKeyByOrchestrator`). It works by relying on a set of signers to attest to some event on Celestia: the Celestia validator set. diff --git a/docs/architecture/adr-006-non-interactive-defaults.md b/docs/architecture/adr-006-non-interactive-defaults.md index 7e24f0e739..d57e4fbaa3 100644 --- a/docs/architecture/adr-006-non-interactive-defaults.md +++ b/docs/architecture/adr-006-non-interactive-defaults.md @@ -242,7 +242,7 @@ func (app *App) PrepareProposal(req abci.RequestPrepareProposal) abci.ResponsePr // squares but can only return values within the min and max square size. squareSize, totalSharesUsed := estimateSquareSize(parsedTxs, req.BlockData.Evidence) - // the totalSharesUsed can be larger that the max number of shares if we + // the totalSharesUsed can be larger than the max number of shares if we // reach the max square size. In this case, we must prune the deprioritized // txs (and their messages if they're pfb txs). if totalSharesUsed > int(squareSize*squareSize) { diff --git a/docs/architecture/adr-018-network-upgrades.md b/docs/architecture/adr-018-network-upgrades.md index 60403cab69..2ff4e19a34 100644 --- a/docs/architecture/adr-018-network-upgrades.md +++ b/docs/architecture/adr-018-network-upgrades.md @@ -50,7 +50,7 @@ The height of the the v1 -> v2 upgrade will initially be supplied via CLI flag ( - Upgrading needs to support state migrations. These must happen to all nodes at the same moment between heights. Ideally all migrations that affect state would correspond at the height of the new app version i.e. after `Commit` and before processing of the transactions at that height. `BeginBlock` seems like an ideal area to perform these upgrades however these might affect the way that `PrepareProposal` and `ProcessProposal` is conducted thus they must be performed even prior to these ABCI calls. A simpler implementation would have been for the proposer to immediately propose a block with the next version i.e. v2. However that would require the proposer to first migrate state (taking an unknown length of time) and for the validators receiving that proposal to first migrate before validating and given that the upgrade is not certain, there would need to be a mechanism to migrate back to v1 (NOTE: this remains the case if we wish to support downgrading which is discussed later). To overcome these requirements, the proposer must signal in the prior height the intention to upgrade to a new version. This is done with a new message type, `MsgVersionChange`, which must be put as the first transaction in the block. Validators read this and if they are in agreement to supporting the version change they vote on the block accordingly. If the block reaches consensus then all validators will update the app version at `EndBlock`. CometBFT will then propose the next block using that version. Nodes that have not upgraded and don't support the binary will error and exit. Given that the previous block was approved by more than 2/3 of the network we have a strong guarantee that this block will be accepted by the network. However, it's worth noting that given a security model that must withstand 1/3 byzantine nodes, even a single byzantine node that voted for the upgrade yet doesn't vote for the following block can stall the network until > 2/3 nodes upgrade and vote on the following block. - Given uncertainty in scheduling, the system must be able to handle changes to the upgrade height that most commonly would come in the form of delays. Embedding the upgrade schedule in the binary is convenient for node operators and avoids the possibility for user errors. However, binaries are static. If the community wished to push back the upgrade by two weeks there is the possibility that some nodes would not rerun the new binary thus we'd get a split between nodes running the old schedule and nodes running the new schedule. To overcome this, proposers will only propose a version change in the first round of each height, thus allowing transactions to still be committed even under circumstances where there is no consensus on upgrading. Secondly, we define a range in which nodes will attempt to upgrade the app version and failing this will continue to run the current version. Lastly, the binary will have the ability to manually specify the app version height mapping and override the built-in values either through a flag or in the `app.toml` config. This is expected to be used in testing and in emergency situations only. Another example to keep in mind is if a quorum outright rejects an upgrade. If some of the validators are for the change they should have some way to continue participating in the network. Therefore we employ a range that nodes will attempt to upgrade and afterwards will continue on normally with the new binary however running the older version. - The system needs to be tolerant of unexpected faults in the upgrade process. This can be: - - The community/contributors realise there is a bug in the new version after the binary has been released. Node operators will need to downgrade back to the previous version and restart their node. + - The community/contributors realize there is a bug in the new version after the binary has been released. Node operators will need to downgrade back to the previous version and restart their node. - There is a halting bug in the migration or in processing of the first transactions. This most likely would be in the form of an apphash mismatch. This becomes more problematic with delayed execution as the block (with v2 transactions) has already been committed. Immediate execution has the advantage of the apphash mismatch being realised before the data is committed. It's still however feasible to over come this but it involves nodes rolling back the previous state and re-exectuing the transactions using the v1 state machine (which will skip over the v2 transactions). This means node operators should be able to manually override the app version that the proposer will propose with. Lastly, if state migrations occurred between v2 and v1, a reverse migration would need to be performed which would make things especially difficult. If we are unable to fallback to the previous version and continue then the other option is to remain halted until the bug is patched and the network can update and continue - There is a bug that is detected that could halt the chain but hasn't yet. There are other things we can develop to combat such scenarios. One thing we can do is develop a circuit breaker similar to the designs proposed in [Cosmos SDK](https://github.com/cosmos/cosmos-sdk/tree/main/x/circuit). This can disable certain message types or modules either in `CheckTx` or `ProcessProposal`. This violates the consistency property between `PrepareProposal` and `ProcessProposal` but so long as a quorum are the same, will still allow the chain to progress (inconsistency here can be interpreted as byzantine). From 1bd0f133222f60c0f89779db1374c23a36eea213 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 13 Jul 2024 12:18:40 +0200 Subject: [PATCH 16/40] chore(deps): Bump google.golang.org/grpc from 1.64.0 to 1.65.0 (#3655) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.64.0 to 1.65.0.
Release notes

Sourced from google.golang.org/grpc's releases.

Release 1.65.0

Dependencies

  • Change support policy to cover only the latest TWO releases of Go, matching the policy for Go itself. See #7249 for more information. (#7250)
  • Update x/net/http2 to address CVE-2023-45288 (#7282)

Behavior Changes

  • credentials/tls: clients and servers will now reject connections that don't support ALPN when environment variable GRPC_ENFORCE_ALPN_ENABLED is set to "true" (case insensitive). (#7184)
    • NOTE: this behavior will become the default in a future release.
  • metadata: remove String method from MD to make printing more consistent (#7373)

New Features

  • grpc: add WithMaxCallAttempts to configure gRPC's retry behavior per-channel. (#7229)

Bug Fixes

  • ringhash: properly apply endpoint weights instead of ignoring them (#7156)
  • xds: fix a bug that could cause xds-enabled servers to stop accepting new connections after handshaking errors (#7128)
Commits
  • 2da9769 Change version to 1.65.0 (#7306)
  • ede96b7 metadata: remove String method (#7373)
  • 64be203 grpc: Readd pick first name (#7336) (#7341)
  • 25e33a6 examples: Add CSM Observability example (#7302) (#7318)
  • 04a5f46 xds/internal/xdsclient: Emit unknown for CSM Labels if not present in CDS (#7...
  • cff5c3e stats/opentelemetry: Add e2e testing for CSM Observability (#7279) (#7316)
  • 9b970fd dns: fix constant 30s backoff for re-resolution (#7262) (#7311)
  • 6d23620 documentation: on server, use FromIncomingContext for retrieving context and...
  • 7e5898e xds: unify xDS client creation APIs meant for testing (#7268)
  • 5d7bd7a interop/xds: Interop client and server changes for CSM Observability (#7280)
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=google.golang.org/grpc&package-manager=go_modules&previous-version=1.64.0&new-version=1.65.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 14 ++++++-------- go.sum | 29 ++++++++++++----------------- 2 files changed, 18 insertions(+), 25 deletions(-) diff --git a/go.mod b/go.mod index 3621ad8ec9..334e470c88 100644 --- a/go.mod +++ b/go.mod @@ -30,16 +30,15 @@ require ( github.com/tendermint/tendermint v0.34.29 github.com/tendermint/tm-db v0.6.7 golang.org/x/exp v0.0.0-20240213143201-ec583247a57a - google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237 - google.golang.org/grpc v1.64.0 + google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 + google.golang.org/grpc v1.65.0 google.golang.org/protobuf v1.34.2 gopkg.in/yaml.v2 v2.4.0 ) require ( cloud.google.com/go v0.112.1 // indirect - cloud.google.com/go/compute v1.25.1 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect + cloud.google.com/go/compute/metadata v0.3.0 // indirect cloud.google.com/go/iam v1.1.6 // indirect cloud.google.com/go/storage v1.38.0 // indirect filippo.io/edwards25519 v1.0.0-rc.1 // indirect @@ -107,7 +106,7 @@ require ( github.com/goccy/go-json v0.10.2 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/gogo/gateway v1.1.0 // indirect - github.com/golang/glog v1.2.0 // indirect + github.com/golang/glog v1.2.1 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/btree v1.1.2 // indirect @@ -222,16 +221,15 @@ require ( go.uber.org/zap v1.27.0 // indirect golang.org/x/crypto v0.23.0 // indirect golang.org/x/net v0.25.0 // indirect - golang.org/x/oauth2 v0.18.0 // indirect + golang.org/x/oauth2 v0.20.0 // indirect golang.org/x/sync v0.7.0 // indirect golang.org/x/sys v0.20.0 // indirect golang.org/x/term v0.20.0 // indirect golang.org/x/text v0.15.0 // indirect golang.org/x/time v0.5.0 // indirect google.golang.org/api v0.169.0 // indirect - google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index eac6a7f66f..e5b1057755 100644 --- a/go.sum +++ b/go.sum @@ -71,10 +71,8 @@ cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.25.1 h1:ZRpHJedLtTpKgr3RV1Fx23NuaAEN1Zfx9hw1u4aJdjU= -cloud.google.com/go/compute v1.25.1/go.mod h1:oopOIR53ly6viBYxaDhBfJwzUAxf1zE//uf3IB011ls= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= +cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= @@ -641,8 +639,8 @@ github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= -github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4= +github.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -1573,8 +1571,8 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= -golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= -golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= +golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= +golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1720,7 +1718,6 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= @@ -1873,8 +1870,6 @@ google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1985,10 +1980,10 @@ google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY= google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo= -google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237 h1:RFiFrvy37/mpSpdySBDrUdipW/dHwsRwh3J3+A9VgT4= -google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237/go.mod h1:Z5Iiy3jtmioajWHDGFk7CeugTyHtPvMHA4UTmUkyalE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 h1:7whR9kGa5LUwFtpLm2ArCEejtnxlGeLbAyjFY8sGNFw= +google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157/go.mod h1:99sLkeliLXfdj2J75X3Ho+rrVCaJze0uwN7zDDkjPVU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 h1:Zy9XzmMEflZ/MAaA7vNcoebnRAld7FsPW1EeBB7V0m8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -2031,8 +2026,8 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= +google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= +google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= From 8669da3ecb9543f7b64584cf4d623ddff3f76601 Mon Sep 17 00:00:00 2001 From: Sanaz Taheri <35961250+staheri14@users.noreply.github.com> Date: Mon, 15 Jul 2024 03:53:17 -0700 Subject: [PATCH 17/40] chore: improves code readability of e2e benchmark tests (#3670) Closes https://github.com/celestiaorg/celestia-app/issues/3669 --- test/e2e/benchmark/benchmark.go | 8 ++++---- test/e2e/benchmark/throughput.go | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/test/e2e/benchmark/benchmark.go b/test/e2e/benchmark/benchmark.go index cb1a678e5e..baee5a2881 100644 --- a/test/e2e/benchmark/benchmark.go +++ b/test/e2e/benchmark/benchmark.go @@ -160,13 +160,13 @@ func (b *BenchmarkTest) CheckResults(expectedBlockSizeBytes int64) error { return fmt.Errorf("expected app version %d, got %d", appconsts.LatestVersion, block.Version.App) } size := int64(block.Size()) - if size >= expectedBlockSizeBytes { - targetSizeReached = true - break - } if size > maxBlockSize { maxBlockSize = size } + if maxBlockSize >= expectedBlockSizeBytes { + targetSizeReached = true + break + } } if !targetSizeReached { return fmt.Errorf("max reached block size is %d byte and is not within the expected range of %d and %d bytes", maxBlockSize, expectedBlockSizeBytes, b.manifest.MaxBlockBytes) diff --git a/test/e2e/benchmark/throughput.go b/test/e2e/benchmark/throughput.go index ef0080029e..4fe0d84250 100644 --- a/test/e2e/benchmark/throughput.go +++ b/test/e2e/benchmark/throughput.go @@ -58,7 +58,7 @@ func TwoNodeSimple(logger *log.Logger) error { testnet.NoError("failed to get latest version", err) testName := "TwoNodeSimple" - logger.Printf("Running %s\n", testName) + logger.Println("Running", testName) logger.Println("version", latestVersion) manifest := Manifest{ @@ -108,7 +108,7 @@ func TwoNodeSimple(logger *log.Logger) error { } func runBenchmarkTest(logger *log.Logger, testName string, manifest Manifest) error { - logger.Printf("Running %s\n", testName) + logger.Println("Running", testName) manifest.ChainID = manifest.summary() log.Println("ChainID: ", manifest.ChainID) benchTest, err := NewBenchmarkTest(testName, &manifest) From 1703fe2c2b2e7b9302be5e9638144b953c15ff23 Mon Sep 17 00:00:00 2001 From: Rootul P Date: Mon, 15 Jul 2024 16:46:57 +0200 Subject: [PATCH 18/40] refactor(testnode): create genTx on `Export` (#3673) Closes https://github.com/celestiaorg/celestia-app/issues/3662 Before, genTx transactions were created prematurely via [`WithValidators`](https://github.com/rootulp/celestia-app/blob/34cd4b34d99e27c5e8611abab6aaecc550499045/test/util/testnode/config.go#L123) which was problematic if a user tried to later override the chainID via `WithChainID` because the genTx transactions would use the default chain ID but the state machine would be created with a custom chain ID. This PR refactors the genTx creation to happen only when `genesis.Export` is invoked which is _after_ a user configures a custom chain ID. --- app/test/testnode_test.go | 18 ++++++++++++++++++ test/util/genesis/genesis.go | 15 ++++++--------- test/util/testnode/config.go | 4 ++-- 3 files changed, 26 insertions(+), 11 deletions(-) create mode 100644 app/test/testnode_test.go diff --git a/app/test/testnode_test.go b/app/test/testnode_test.go new file mode 100644 index 0000000000..b33a87eaec --- /dev/null +++ b/app/test/testnode_test.go @@ -0,0 +1,18 @@ +package app_test + +import ( + "testing" + + "github.com/celestiaorg/celestia-app/v2/test/util/testnode" +) + +func Test_testnode(t *testing.T) { + t.Run("testnode can start a network with default chain ID", func(t *testing.T) { + testnode.NewNetwork(t, testnode.DefaultConfig()) + }) + t.Run("testnode can start a network with a custom chain ID", func(t *testing.T) { + chainID := "custom-chain-id" + config := testnode.DefaultConfig().WithChainID(chainID) + testnode.NewNetwork(t, config) + }) +} diff --git a/test/util/genesis/genesis.go b/test/util/genesis/genesis.go index ab2e8a93eb..228997f88b 100644 --- a/test/util/genesis/genesis.go +++ b/test/util/genesis/genesis.go @@ -167,14 +167,6 @@ func (g *Genesis) AddValidator(val Validator) error { return err } - // Add the validator's genesis transaction - gentx, err := val.GenTx(g.ecfg, g.kr, g.ChainID) - if err != nil { - return err - } - - // install the validator - g.genTxs = append(g.genTxs, gentx) g.validators = append(g.validators, val) return nil } @@ -192,7 +184,12 @@ func (g *Genesis) NewValidator(val Validator) error { // Export returns the genesis document of the network. func (g *Genesis) Export() (*coretypes.GenesisDoc, error) { gentxs := make([]json.RawMessage, 0, len(g.genTxs)) - for _, genTx := range g.genTxs { + for _, val := range g.validators { + genTx, err := val.GenTx(g.ecfg, g.kr, g.ChainID) + if err != nil { + return nil, err + } + bz, err := g.ecfg.TxConfig.TxJSONEncoder()(genTx) if err != nil { return nil, err diff --git a/test/util/testnode/config.go b/test/util/testnode/config.go index 8891f3d75e..975a4ddc3c 100644 --- a/test/util/testnode/config.go +++ b/test/util/testnode/config.go @@ -128,8 +128,8 @@ func DefaultConfig() *Config { WithAppOptions(DefaultAppOptions()). WithAppCreator(cmd.NewAppServer). WithSuppressLogs(true). - WithConsensusParams(DefaultConsensusParams()). - WithSuppressLogs(true) + // TODO: consider removing this line because default consensus params is invoked above. + WithConsensusParams(DefaultConsensusParams()) } func DefaultConsensusParams() *tmproto.ConsensusParams { From fda6934ba8ce08425cc3e793bccbb53d1bbe509c Mon Sep 17 00:00:00 2001 From: Rootul P Date: Mon, 15 Jul 2024 21:32:17 +0200 Subject: [PATCH 19/40] docs: update specs for v2 (#3661) Closes https://github.com/celestiaorg/celestia-app/issues/3273 by adding pages that are specific to v2 --- app/ante/ante.go | 1 + specs/src/README.md | 19 ----- specs/src/SUMMARY.md | 10 ++- specs/src/specs/ante_handler.md | 25 ++----- specs/src/specs/ante_handler_v1.md | 23 ++++++ specs/src/specs/ante_handler_v2.md | 25 +++++++ specs/src/specs/consensus.md | 43 +++++------ specs/src/specs/data_structures.md | 2 +- specs/src/specs/index.md | 7 ++ specs/src/specs/multisig.md | 2 +- specs/src/specs/networking.md | 2 +- specs/src/specs/parameters.md | 6 ++ .../src/specs/{params.md => parameters_v1.md} | 16 ++--- specs/src/specs/parameters_v2.md | 71 +++++++++++++++++++ specs/src/specs/shares.md | 2 +- specs/src/specs/state_machine_modules.md | 33 +-------- specs/src/specs/state_machine_modules_v1.md | 30 ++++++++ specs/src/specs/state_machine_modules_v2.md | 33 +++++++++ x/paramfilter/test/gov_params_test.go | 41 ++++++++--- 19 files changed, 277 insertions(+), 114 deletions(-) delete mode 100644 specs/src/README.md create mode 100644 specs/src/specs/ante_handler_v1.md create mode 100644 specs/src/specs/ante_handler_v2.md create mode 100644 specs/src/specs/parameters.md rename specs/src/specs/{params.md => parameters_v1.md} (95%) create mode 100644 specs/src/specs/parameters_v2.md create mode 100644 specs/src/specs/state_machine_modules_v1.md create mode 100644 specs/src/specs/state_machine_modules_v2.md diff --git a/app/ante/ante.go b/app/ante/ante.go index 5437c5fc4e..dfacee7afd 100644 --- a/app/ante/ante.go +++ b/app/ante/ante.go @@ -44,6 +44,7 @@ func NewAnteHandler( // Side effect: consumes gas from the gas meter. ante.NewConsumeGasForTxSizeDecorator(accountKeeper), // Ensure the feepayer (fee granter or first signer) has enough funds to pay for the tx. + // Ensure the gas price >= network min gas price if app version >= 2. // Side effect: deducts fees from the fee payer. Sets the tx priority in context. ante.NewDeductFeeDecorator(accountKeeper, bankKeeper, feegrantKeeper, ValidateTxFeeWrapper(paramKeeper)), // Set public keys in the context for fee-payer and all signers. diff --git a/specs/src/README.md b/specs/src/README.md deleted file mode 100644 index a01301d357..0000000000 --- a/specs/src/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# Celestia App Specifications - -- [Specification](./specs/index.md) - - [Data Structures](./specs/data_structures.md) - - [Namespace](./specs/namespace.md) - - [Shares](./specs/shares.md) - - [Consensus](./specs/consensus.md) - - [CAT Pool](./specs/cat_pool.md) - - [Block Proposer](./specs/block_proposer.md) - - [Block Validity Rules](./specs/block_validity_rules.md) - - [AnteHandler](./specs/ante_handler.md) - - [Fraud Proofs](./specs/fraud_proofs.md) - - [Networking](./specs/networking.md) - - [Public-Key Cryptography](./specs/public_key_cryptography.md) - - [Data Square Layout](./specs/data_square_layout.md) - - [Resource Pricing](./specs/resource_pricing.md) - - [Multisig](./specs/multisig.md) -- [State Machine Modules](./specs/state_machine_modules.md) -- [Mainnet Parameters](./specs/params.md) diff --git a/specs/src/SUMMARY.md b/specs/src/SUMMARY.md index dffcbffad4..9f27074a92 100644 --- a/specs/src/SUMMARY.md +++ b/specs/src/SUMMARY.md @@ -1,6 +1,6 @@ # Summary -[Celestia App Specifications](./README.md) +Celestia App Specifications - [Specification](./specs/index.md) - [Data Structures](./specs/data_structures.md) @@ -11,6 +11,8 @@ - [Block Proposer](./specs/block_proposer.md) - [Block Validity Rules](./specs/block_validity_rules.md) - [AnteHandler](./specs/ante_handler.md) + - [AnteHandler v1](./specs/ante_handler_v1.md) + - [AnteHandler v2](./specs/ante_handler_v2.md) - [Fraud Proofs](./specs/fraud_proofs.md) - [Networking](./specs/networking.md) - [Public-Key Cryptography](./specs/public_key_cryptography.md) @@ -18,4 +20,8 @@ - [Resource Pricing](./specs/resource_pricing.md) - [Multisig](./specs/multisig.md) - [State Machine Modules](./specs/state_machine_modules.md) -- [Mainnet Parameters](./specs/params.md) + - [State Machine Modules v1](./specs/state_machine_modules_v1.md) + - [State Machine Modules v2](./specs/state_machine_modules_v2.md) +- [Parameters](./specs/parameters.md) + - [Parameters v1](./specs/parameters_v1.md) + - [Parameters v2](./specs/parameters_v2.md) diff --git a/specs/src/specs/ante_handler.md b/specs/src/specs/ante_handler.md index 25df1d4aac..2ebe759a79 100644 --- a/specs/src/specs/ante_handler.md +++ b/specs/src/specs/ante_handler.md @@ -1,30 +1,13 @@ # AnteHandler -Celestia makes use of a Cosmos SDK [AnteHandler](https://github.com/cosmos/cosmos-sdk/blob/v0.46.15/x/auth/spec/03_antehandlers.md) in order to reject decodable sdk.Txs that do not meet certain criteria. The AnteHandler is defined in [app/ante/ante.go](https://github.com/celestiaorg/celestia-app/blob/7f97788a64af7fe0fce00959753d6dd81663e98f/app/ante/ante.go) and is invoked at multiple times during the transaction lifecycle: +Celestia makes use of a Cosmos SDK [AnteHandler](https://github.com/cosmos/cosmos-sdk/blob/v0.46.15/x/auth/spec/03_antehandlers.md) in order to reject decodable sdk.Txs that do not meet certain criteria. The AnteHandler is invoked at multiple times during the transaction lifecycle: 1. `CheckTx` prior to the transaction entering the mempool 1. `PrepareProposal` when the block proposer includes the transaction in a block proposal 1. `ProcessProposal` when validators validate the transaction in a block proposal 1. `DeliverTx` when full nodes execute the transaction in a decided block -The AnteHandler chains together several decorators to ensure the following criteria are met: +The AnteHandler is defined in `app/ante/ante.go`. The app version impacts AnteHandler behavior. See: -- The tx does not contain any [extension options](https://github.com/cosmos/cosmos-sdk/blob/22c28366466e64ebf0df1ce5bec8b1130523552c/proto/cosmos/tx/v1beta1/tx.proto#L119-L122). -- The tx passes `ValidateBasic()`. -- The tx's [timeout_height](https://github.com/cosmos/cosmos-sdk/blob/22c28366466e64ebf0df1ce5bec8b1130523552c/proto/cosmos/tx/v1beta1/tx.proto#L115-L117) has not been reached if one is specified. -- The tx's [memo](https://github.com/cosmos/cosmos-sdk/blob/22c28366466e64ebf0df1ce5bec8b1130523552c/proto/cosmos/tx/v1beta1/tx.proto#L110-L113) is <= the max memo characters where [`MaxMemoCharacters = 256`](). -- The tx's [gas_limit](https://github.com/cosmos/cosmos-sdk/blob/22c28366466e64ebf0df1ce5bec8b1130523552c/proto/cosmos/tx/v1beta1/tx.proto#L211-L213) is > the gas consumed based on the tx's size where [`TxSizeCostPerByte = 10`](https://github.com/cosmos/cosmos-sdk/blob/a429238fc267da88a8548bfebe0ba7fb28b82a13/x/auth/README.md?plain=1#L232). -- The tx's feepayer has enough funds to pay fees for the tx. The tx's feepayer is the feegranter (if specified) or the tx's first signer. Note the [feegrant](https://github.com/cosmos/cosmos-sdk/blob/v0.46.15/x/feegrant/README.md) module is enabled. -- The tx's count of signatures <= the max number of signatures. The max number of signatures is [`TxSigLimit = 7`](https://github.com/cosmos/cosmos-sdk/blob/a429238fc267da88a8548bfebe0ba7fb28b82a13/x/auth/README.md?plain=1#L231). -- The tx's [gas_limit](https://github.com/cosmos/cosmos-sdk/blob/22c28366466e64ebf0df1ce5bec8b1130523552c/proto/cosmos/tx/v1beta1/tx.proto#L211-L213) is > the gas consumed based on the tx's signatures. -- The tx's [signatures](https://github.com/cosmos/cosmos-sdk/blob/22c28366466e64ebf0df1ce5bec8b1130523552c/types/tx/signing/signature.go#L10-L26) are valid. For each signature, ensure that the signature's sequence number (a.k.a nonce) matches the account sequence number of the signer. -- The tx's [gas_limit](https://github.com/cosmos/cosmos-sdk/blob/22c28366466e64ebf0df1ce5bec8b1130523552c/proto/cosmos/tx/v1beta1/tx.proto#L211-L213) is > the gas consumed based on the blob size(s). Since blobs are charged based on the number of shares they occupy, the gas consumed is calculated as follows: `gasToConsume = sharesNeeded(blob) * bytesPerShare * gasPerBlobByte`. Where `bytesPerShare` is a global constant (an alias for [`ShareSize = 512`](https://github.com/celestiaorg/celestia-app/blob/c90e61d5a2d0c0bd0e123df4ab416f6f0d141b7f/pkg/appconsts/global_consts.go#L27-L28)) and `gasPerBlobByte` is a governance parameter that can be modified (the [`DefaultGasPerBlobByte = 8`](https://github.com/celestiaorg/celestia-app/blob/c90e61d5a2d0c0bd0e123df4ab416f6f0d141b7f/pkg/appconsts/initial_consts.go#L16-L18)). -- The tx's total blob size is <= the max blob size. The max blob size is derived from the maximum valid square size. The max valid square size is the minimum of: `GovMaxSquareSize` and `SquareSizeUpperBound`. -- The tx does not contain a message of type [MsgSubmitProposal](https://github.com/cosmos/cosmos-sdk/blob/d6d929843bbd331b885467475bcb3050788e30ca/proto/cosmos/gov/v1/tx.proto#L33-L43) with zero proposal messages. -- The tx is not an IBC packet or update message that has already been processed. - -In addition to the above criteria, the AnteHandler also has a number of side-effects: - -- Tx fees are deducted from the tx's feepayer and added to the fee collector module account. -- Tx priority is calculated based on the smallest denomination of gas price in the tx and set in context. -- The nonce of all tx signers is incremented by 1. +- [AnteHandler v1](./ante_handler_v1.md) +- [AnteHandler v2](./ante_handler_v2.md) diff --git a/specs/src/specs/ante_handler_v1.md b/specs/src/specs/ante_handler_v1.md new file mode 100644 index 0000000000..52109f67f8 --- /dev/null +++ b/specs/src/specs/ante_handler_v1.md @@ -0,0 +1,23 @@ +# AnteHandler v1 + +The AnteHandler chains together several decorators to ensure the following criteria are met for app version 1: + +- The tx does not contain any [extension options](https://github.com/cosmos/cosmos-sdk/blob/22c28366466e64ebf0df1ce5bec8b1130523552c/proto/cosmos/tx/v1beta1/tx.proto#L119-L122). +- The tx passes `ValidateBasic()`. +- The tx's [timeout_height](https://github.com/cosmos/cosmos-sdk/blob/22c28366466e64ebf0df1ce5bec8b1130523552c/proto/cosmos/tx/v1beta1/tx.proto#L115-L117) has not been reached if one is specified. +- The tx's [memo](https://github.com/cosmos/cosmos-sdk/blob/22c28366466e64ebf0df1ce5bec8b1130523552c/proto/cosmos/tx/v1beta1/tx.proto#L110-L113) is <= the max memo characters where [`MaxMemoCharacters = 256`](). +- The tx's [gas_limit](https://github.com/cosmos/cosmos-sdk/blob/22c28366466e64ebf0df1ce5bec8b1130523552c/proto/cosmos/tx/v1beta1/tx.proto#L211-L213) is > the gas consumed based on the tx's size where [`TxSizeCostPerByte = 10`](https://github.com/cosmos/cosmos-sdk/blob/a429238fc267da88a8548bfebe0ba7fb28b82a13/x/auth/README.md?plain=1#L232). +- The tx's feepayer has enough funds to pay fees for the tx. The tx's feepayer is the feegranter (if specified) or the tx's first signer. Note the [feegrant](https://github.com/cosmos/cosmos-sdk/blob/v0.46.15/x/feegrant/README.md) module is enabled. +- The tx's count of signatures <= the max number of signatures. The max number of signatures is [`TxSigLimit = 7`](https://github.com/cosmos/cosmos-sdk/blob/a429238fc267da88a8548bfebe0ba7fb28b82a13/x/auth/README.md?plain=1#L231). +- The tx's [gas_limit](https://github.com/cosmos/cosmos-sdk/blob/22c28366466e64ebf0df1ce5bec8b1130523552c/proto/cosmos/tx/v1beta1/tx.proto#L211-L213) is > the gas consumed based on the tx's signatures. +- The tx's [signatures](https://github.com/cosmos/cosmos-sdk/blob/22c28366466e64ebf0df1ce5bec8b1130523552c/types/tx/signing/signature.go#L10-L26) are valid. For each signature, ensure that the signature's sequence number (a.k.a nonce) matches the account sequence number of the signer. +- The tx's [gas_limit](https://github.com/cosmos/cosmos-sdk/blob/22c28366466e64ebf0df1ce5bec8b1130523552c/proto/cosmos/tx/v1beta1/tx.proto#L211-L213) is > the gas consumed based on the blob size(s). Since blobs are charged based on the number of shares they occupy, the gas consumed is calculated as follows: `gasToConsume = sharesNeeded(blob) * bytesPerShare * gasPerBlobByte`. Where `bytesPerShare` is a global constant (an alias for [`ShareSize = 512`](https://github.com/celestiaorg/celestia-app/blob/c90e61d5a2d0c0bd0e123df4ab416f6f0d141b7f/pkg/appconsts/global_consts.go#L27-L28)) and `gasPerBlobByte` is a governance parameter that can be modified (the [`DefaultGasPerBlobByte = 8`](https://github.com/celestiaorg/celestia-app/blob/c90e61d5a2d0c0bd0e123df4ab416f6f0d141b7f/pkg/appconsts/initial_consts.go#L16-L18)). +- The tx's total blob size is <= the max blob size. The max blob size is derived from the maximum valid square size. The max valid square size is the minimum of: `GovMaxSquareSize` and `SquareSizeUpperBound`. +- The tx does not contain a message of type [MsgSubmitProposal](https://github.com/cosmos/cosmos-sdk/blob/d6d929843bbd331b885467475bcb3050788e30ca/proto/cosmos/gov/v1/tx.proto#L33-L43) with zero proposal messages. +- The tx is not an IBC packet or update message that has already been processed. + +In addition to the above criteria, the AnteHandler also has a number of side-effects: + +- Tx fees are deducted from the tx's feepayer and added to the fee collector module account. +- Tx priority is calculated based on the smallest denomination of gas price in the tx and set in context. +- The nonce of all tx signers is incremented by 1. diff --git a/specs/src/specs/ante_handler_v2.md b/specs/src/specs/ante_handler_v2.md new file mode 100644 index 0000000000..a752654cd3 --- /dev/null +++ b/specs/src/specs/ante_handler_v2.md @@ -0,0 +1,25 @@ +# AnteHandler v2 + +The AnteHandler chains together several decorators to ensure the following criteria are met for app version 2: + +- The tx does not contain any messages that are unsupported by the current app version. See `MsgVersioningGateKeeper`. +- The tx does not contain any [extension options](https://github.com/cosmos/cosmos-sdk/blob/22c28366466e64ebf0df1ce5bec8b1130523552c/proto/cosmos/tx/v1beta1/tx.proto#L119-L122). +- The tx passes `ValidateBasic()`. +- The tx's [timeout_height](https://github.com/cosmos/cosmos-sdk/blob/22c28366466e64ebf0df1ce5bec8b1130523552c/proto/cosmos/tx/v1beta1/tx.proto#L115-L117) has not been reached if one is specified. +- The tx's [memo](https://github.com/cosmos/cosmos-sdk/blob/22c28366466e64ebf0df1ce5bec8b1130523552c/proto/cosmos/tx/v1beta1/tx.proto#L110-L113) is <= the max memo characters where [`MaxMemoCharacters = 256`](). +- The tx's [gas_limit](https://github.com/cosmos/cosmos-sdk/blob/22c28366466e64ebf0df1ce5bec8b1130523552c/proto/cosmos/tx/v1beta1/tx.proto#L211-L213) is > the gas consumed based on the tx's size where [`TxSizeCostPerByte = 10`](https://github.com/cosmos/cosmos-sdk/blob/a429238fc267da88a8548bfebe0ba7fb28b82a13/x/auth/README.md?plain=1#L232). +- The tx's feepayer has enough funds to pay fees for the tx. The tx's feepayer is the feegranter (if specified) or the tx's first signer. Note the [feegrant](https://github.com/cosmos/cosmos-sdk/blob/v0.46.15/x/feegrant/README.md) module is enabled. +- The tx's gas price is >= the network minimum gas price where [`NetworkMinGasPrice = 0.000001` utia](https://github.com/celestiaorg/celestia-app/blob/8caa5807df8d15477554eba953bd056ae72d4503/pkg/appconsts/v2/app_consts.go#L9). +- The tx's count of signatures <= the max number of signatures. The max number of signatures is [`TxSigLimit = 7`](https://github.com/cosmos/cosmos-sdk/blob/a429238fc267da88a8548bfebe0ba7fb28b82a13/x/auth/README.md?plain=1#L231). +- The tx's [gas_limit](https://github.com/cosmos/cosmos-sdk/blob/22c28366466e64ebf0df1ce5bec8b1130523552c/proto/cosmos/tx/v1beta1/tx.proto#L211-L213) is > the gas consumed based on the tx's signatures. +- The tx's [signatures](https://github.com/cosmos/cosmos-sdk/blob/22c28366466e64ebf0df1ce5bec8b1130523552c/types/tx/signing/signature.go#L10-L26) are valid. For each signature, ensure that the signature's sequence number (a.k.a nonce) matches the account sequence number of the signer. +- The tx's [gas_limit](https://github.com/cosmos/cosmos-sdk/blob/22c28366466e64ebf0df1ce5bec8b1130523552c/proto/cosmos/tx/v1beta1/tx.proto#L211-L213) is > the gas consumed based on the blob size(s). Since blobs are charged based on the number of shares they occupy, the gas consumed is calculated as follows: `gasToConsume = sharesNeeded(blob) * bytesPerShare * gasPerBlobByte`. Where `bytesPerShare` is a global constant (an alias for [`ShareSize = 512`](https://github.com/celestiaorg/celestia-app/blob/c90e61d5a2d0c0bd0e123df4ab416f6f0d141b7f/pkg/appconsts/global_consts.go#L27-L28)) and `gasPerBlobByte` is a governance parameter that can be modified (the [`DefaultGasPerBlobByte = 8`](https://github.com/celestiaorg/celestia-app/blob/c90e61d5a2d0c0bd0e123df4ab416f6f0d141b7f/pkg/appconsts/initial_consts.go#L16-L18)). +- The tx's total blob share count is <= the max blob share count. The max blob share count is derived from the maximum valid square size. The max valid square size is the minimum of: `GovMaxSquareSize` and `SquareSizeUpperBound`. +- The tx does not contain a message of type [MsgSubmitProposal](https://github.com/cosmos/cosmos-sdk/blob/d6d929843bbd331b885467475bcb3050788e30ca/proto/cosmos/gov/v1/tx.proto#L33-L43) with zero proposal messages. +- The tx is not an IBC packet or update message that has already been processed. + +In addition to the above criteria, the AnteHandler also has a number of side-effects: + +- Tx fees are deducted from the tx's feepayer and added to the fee collector module account. +- Tx priority is calculated based on the smallest denomination of gas price in the tx and set in context. +- The nonce of all tx signers is incremented by 1. diff --git a/specs/src/specs/consensus.md b/specs/src/specs/consensus.md index 5d7e908b21..69dc17f136 100644 --- a/specs/src/specs/consensus.md +++ b/specs/src/specs/consensus.md @@ -15,27 +15,28 @@ ### Constants -| name | type | value | unit | description | -|-----------------------------------------|----------|--------------|---------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `AVAILABLE_DATA_ORIGINAL_SQUARE_MAX` | `uint64` | | `share` | Maximum number of rows/columns of the original data [shares](data_structures.md#share) in [square layout](data_structures.md#arranging-available-data-into-shares). | -| `AVAILABLE_DATA_ORIGINAL_SQUARE_TARGET` | `uint64` | | `share` | Target number of rows/columns of the original data [shares](data_structures.md#share) in [square layout](data_structures.md#arranging-available-data-into-shares). | -| `BLOCK_TIME` | `uint64` | | second | Block time, in seconds. | -| `CHAIN_ID` | `string` | `"Celestia"` | | Chain ID. Each chain assigns itself a (unique) ID. | -| `GENESIS_COIN_COUNT` | `uint64` | `10**8` | `4u` | `(= 100000000)` Number of coins at genesis. | -| `MAX_GRAFFITI_BYTES` | `uint64` | `32` | `byte` | Maximum size of transaction graffiti, in bytes. | -| `MAX_VALIDATORS` | `uint16` | `64` | | Maximum number of active validators. | -| `NAMESPACE_VERSION_SIZE` | `int` | `1` | `byte` | Size of namespace version in bytes. | -| `NAMESPACE_ID_SIZE` | `int` | `28` | `byte` | Size of namespace ID in bytes. | -| `NAMESPACE_SIZE` | `int` | `29` | `byte` | Size of namespace in bytes. | -| `NAMESPACE_ID_MAX_RESERVED` | `uint64` | `255` | | Value of maximum reserved namespace (inclusive). 1 byte worth of IDs. | -| `SEQUENCE_BYTES` | `uint64` | `4` | `byte` | The number of bytes used to store the sequence length in the first share of a sequence | -| `SHARE_INFO_BYTES` | `uint64` | `1` | `byte` | The number of bytes used for [share](data_structures.md#share) information | -| `SHARE_RESERVED_BYTES` | `uint64` | `4` | `byte` | The number of bytes used to store the index of the first transaction in a transaction share. Must be able to represent any integer up to and including `SHARE_SIZE - 1`. | -| `SHARE_SIZE` | `uint64` | `512` | `byte` | Size of transaction and blob [shares](data_structures.md#share), in bytes. | -| `STATE_SUBTREE_RESERVED_BYTES` | `uint64` | `1` | `byte` | Number of bytes reserved to identify state subtrees. | -| `UNBONDING_DURATION` | `uint32` | | `block` | Duration, in blocks, for unbonding a validator or delegation. | -| `VERSION_APP` | `uint64` | `1` | | Version of the Celestia application. Breaking changes (hard forks) must update this parameter. | -| `VERSION_BLOCK` | `uint64` | `1` | | Version of the Celestia chain. Breaking changes (hard forks) must update this parameter. | +| name | type | value | unit | description | +|-----------------------------------------|----------|--------------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `AVAILABLE_DATA_ORIGINAL_SQUARE_MAX` | `uint64` | | `share` | Maximum number of rows/columns of the original data [shares](data_structures.md#share) in [square layout](data_structures.md#arranging-available-data-into-shares). | +| `AVAILABLE_DATA_ORIGINAL_SQUARE_TARGET` | `uint64` | | `share` | Target number of rows/columns of the original data [shares](data_structures.md#share) in [square layout](data_structures.md#arranging-available-data-into-shares). | +| `BLOCK_TIME` | `uint64` | | second | Block time, in seconds. | +| `CHAIN_ID` | `string` | `"Celestia"` | | Chain ID. Each chain assigns itself a (unique) ID. | +| `GENESIS_COIN_COUNT` | `uint64` | `10**8` | `4u` | `(= 100000000)` Number of coins at genesis. | +| `MAX_GRAFFITI_BYTES` | `uint64` | `32` | `byte` | Maximum size of transaction graffiti, in bytes. | +| `MAX_VALIDATORS` | `uint16` | `64` | | Maximum number of active validators. | +| `NAMESPACE_VERSION_SIZE` | `int` | `1` | `byte` | Size of namespace version in bytes. | +| `NAMESPACE_ID_SIZE` | `int` | `28` | `byte` | Size of namespace ID in bytes. | +| `NAMESPACE_SIZE` | `int` | `29` | `byte` | Size of namespace in bytes. | +| `NAMESPACE_ID_MAX_RESERVED` | `uint64` | `255` | | Value of maximum reserved namespace (inclusive). 1 byte worth of IDs. | +| `SEQUENCE_BYTES` | `uint64` | `4` | `byte` | The number of bytes used to store the sequence length in the first share of a sequence | +| `SHARE_INFO_BYTES` | `uint64` | `1` | `byte` | The number of bytes used for [share](data_structures.md#share) information | +| `SHARE_RESERVED_BYTES` | `uint64` | `4` | `byte` | The number of bytes used to store the index of the first transaction in a transaction share. Must be able to represent any integer up to and including `SHARE_SIZE - 1`. | +| `SHARE_SIZE` | `uint64` | `512` | `byte` | Size of transaction and blob [shares](data_structures.md#share), in bytes. | +| `STATE_SUBTREE_RESERVED_BYTES` | `uint64` | `1` | `byte` | Number of bytes reserved to identify state subtrees. | +| `UNBONDING_DURATION` | `uint32` | | `block` | Duration, in blocks, for unbonding a validator or delegation. | +| `v1.Version` | `uint64` | `1` | | First version of the application. Breaking changes (hard forks) must update this parameter. | +| `v2.Version` | `uint64` | `2` | | Second version of the application. Breaking changes (hard forks) must update this parameter. | +| `VERSION_BLOCK` | `uint64` | `1` | | Version of the Celestia chain. Breaking changes (hard forks) must update this parameter. | ### Rewards and Penalties diff --git a/specs/src/specs/data_structures.md b/specs/src/specs/data_structures.md index 5e3785f875..745e06f8cb 100644 --- a/specs/src/specs/data_structures.md +++ b/specs/src/specs/data_structures.md @@ -144,7 +144,7 @@ enum CommitFlag : uint8_t { | name | type | description | |---------|----------|----------------------| | `block` | `uint64` | The `VERSION_BLOCK`. | -| `app` | `uint64` | The `VERSION_APP`. | +| `app` | `uint64` | The app version. | ## Serialization diff --git a/specs/src/specs/index.md b/specs/src/specs/index.md index 71df7df2bc..d7bda658a9 100644 --- a/specs/src/specs/index.md +++ b/specs/src/specs/index.md @@ -7,5 +7,12 @@ - [CAT Pool](./cat_pool.md) - [Block Proposer](./block_proposer.md) - [Block Validity Rules](./block_validity_rules.md) +- [AnteHandler](./ante_handler.md) + - [AnteHandler v1](./ante_handler_v1.md) + - [AnteHandler v2](./ante_handler_v2.md) +- [Fraud Proofs](./fraud_proofs.md) - [Networking](./networking.md) - [Public-Key Cryptography](./public_key_cryptography.md) +- [Data Square Layout](./data_square_layout.md) +- [Resource Pricing](./resource_pricing.md) +- [Multisig](./multisig.md) diff --git a/specs/src/specs/multisig.md b/specs/src/specs/multisig.md index b1b0ee9c58..55ecf7f7b8 100644 --- a/specs/src/specs/multisig.md +++ b/specs/src/specs/multisig.md @@ -2,7 +2,7 @@ Celestia inherits support for Multisig accounts from the Cosmos SDK. Multisig accounts behave similarly to regular accounts with the added requirement that a threshold of signatures is needed to authorize a transaction. -The maximum number of signatures allowed for a multisig account is determined by the [param](./params.md) `auth.TxSigLimit`. The threshold and list of signers for a multisig account are set at the time of creation and can be viewed in the `pubkey` field of a key. For example: +The maximum number of signatures allowed for a multisig account is determined by the parameter `auth.TxSigLimit` (see [parameters](./parameters.md)). The threshold and list of signers for a multisig account are set at the time of creation and can be viewed in the `pubkey` field of a key. For example: ```shell $ celestia-appd keys show multisig diff --git a/specs/src/specs/networking.md b/specs/src/specs/networking.md index 4a3fb0698e..454b56c197 100644 --- a/specs/src/specs/networking.md +++ b/specs/src/specs/networking.md @@ -31,7 +31,7 @@ When receiving a new block proposal `proposal` from the network, the following s 1. `proposal.pol_round` is processed identically to Tendermint. 1. `proposal.header` must be well-formed. 1. `proposal.header.version.block` must be [`VERSION_BLOCK`](./consensus.md#constants). -1. `proposal.header.version.app` must be [`VERSION_APP`](./consensus.md#constants). +1. `proposal.header.version.app` must be a supported app version. 1. `proposal.header.height` should be previous known height + 1. 1. `proposal.header.chain_id` must be [`CHAIN_ID`](./consensus.md#constants). 1. `proposal.header.time` is processed identically to Tendermint. diff --git a/specs/src/specs/parameters.md b/specs/src/specs/parameters.md new file mode 100644 index 0000000000..4dcecce93d --- /dev/null +++ b/specs/src/specs/parameters.md @@ -0,0 +1,6 @@ +# Parameters + +The parameters in the application depend on the app version: + +- [Parameters v1](./parameters_v1.md) +- [Parameters v2](./parameters_v2.md) diff --git a/specs/src/specs/params.md b/specs/src/specs/parameters_v1.md similarity index 95% rename from specs/src/specs/params.md rename to specs/src/specs/parameters_v1.md index a4928d79de..436b8cb471 100644 --- a/specs/src/specs/params.md +++ b/specs/src/specs/parameters_v1.md @@ -1,20 +1,19 @@ -# Celestia Governance Params +# Parameters v1 -These are the parameters for mainnet. Note that not all of these parameters are -changeable via governance. This list also includes parameter that require a -hardfork to change due to being manually hardcoded in the application or they -are blocked by the `x/paramfilter` module. +The parameters below represent the parameters for app version 1. -## Parameters +Note that not all of these parameters are changeable via governance. This list +also includes parameter that require a hardfork to change due to being manually +hardcoded in the application or they are blocked by the `x/paramfilter` module. -### Global parameters +## Global parameters | Parameter | Default | Summary | Changeable via Governance | |-------------------|---------|------------------------------------------------------------------------------------------------------------------------|---------------------------| | MaxBlockSizeBytes | 100MiB | Hardcoded value in CometBFT for the protobuf encoded block. | False | | MaxSquareSize | 128 | Hardcoded maximum square size determined per shares per row or column for the original data square (not yet extended). | False | -### Module parameters +## Module parameters | Module.Parameter | Default | Summary | Changeable via Governance | |-----------------------------------------------|---------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------| @@ -49,7 +48,6 @@ are blocked by the `x/paramfilter` module. | ibc.ConnectionGenesis.MaxExpectedTimePerBlock | 7500000000000 (75 seconds) | Maximum expected time per block in nanoseconds under normal operation. | True | | ibc.Transfer.ReceiveEnabled | true | Enable receiving tokens via IBC. | True | | ibc.Transfer.SendEnabled | true | Enable sending tokens via IBC. | True | -| minfee.NetworkMinGasPrice | 0.000001 utia | All transactions must have a gas price greater than or equal to this value. | True | | mint.BondDenom | utia | Denomination that is inflated and sent to the distribution module account. | False | | mint.DisinflationRate | 0.10 (10%) | The rate at which the inflation rate decreases each year. | False | | mint.InitialInflationRate | 0.08 (8%) | The inflation rate the network starts at. | False | diff --git a/specs/src/specs/parameters_v2.md b/specs/src/specs/parameters_v2.md new file mode 100644 index 0000000000..7555dd8761 --- /dev/null +++ b/specs/src/specs/parameters_v2.md @@ -0,0 +1,71 @@ +# Parameters v2 + +The parameters below represent the parameters for app version 2. + +Note that not all of these parameters are changeable via governance. This list +also includes parameter that require a hardfork to change due to being manually +hardcoded in the application or they are blocked by the `x/paramfilter` module. + +## Global parameters + +| Parameter | Default | Summary | Changeable via Governance | +|-------------------|---------|------------------------------------------------------------------------------------------------------------------------|---------------------------| +| MaxBlockSizeBytes | 100MiB | Hardcoded value in CometBFT for the protobuf encoded block. | False | +| MaxSquareSize | 128 | Hardcoded maximum square size determined per shares per row or column for the original data square (not yet extended). | False | + +## Module parameters + +| Module.Parameter | Default | Summary | Changeable via Governance | +|-----------------------------------------------|---------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------|---------------------------| +| auth.MaxMemoCharacters | 256 | Largest allowed size for a memo in bytes. | True | +| auth.SigVerifyCostED25519 | 590 | Gas used to verify Ed25519 signature. | True | +| auth.SigVerifyCostSecp256k1 | 1000 | Gas used to verify secp256k1 signature. | True | +| auth.TxSigLimit | 7 | Max number of signatures allowed in a multisig transaction. | True | +| auth.TxSizeCostPerByte | 10 | Gas used per transaction byte. | True | +| bank.SendEnabled | true | Allow transfers. | False | +| blob.GasPerBlobByte | 8 | Gas used per blob byte. | True | +| blob.GovMaxSquareSize | 64 | Governance parameter for the maximum square size of the original data square. | True | +| consensus.block.MaxBytes | 1974272 bytes (~1.88 MiB) | Governance parameter for the maximum size of the protobuf encoded block. | True | +| consensus.block.MaxGas | -1 | Maximum gas allowed per block (-1 is infinite). | True | +| consensus.block.TimeIotaMs | 1000 | Minimum time added to the time in the header each block. | False | +| consensus.evidence.MaxAgeDuration | 1814400000000000 (21 days) | The maximum age of evidence before it is considered invalid in nanoseconds. This value should be identical to the unbonding period. | True | +| consensus.evidence.MaxAgeNumBlocks | 120960 | The maximum number of blocks before evidence is considered invalid. This value will stop CometBFT from pruning block data. | True | +| consensus.evidence.MaxBytes | 1MiB | Maximum size in bytes used by evidence in a given block. | True | +| consensus.validator.PubKeyTypes | Ed25519 | The type of public key used by validators. | False | +| consensus.Version.AppVersion | 2 | Determines protocol rules used for a given height. Incremented by the application upon an upgrade. | True | +| distribution.BaseProposerReward | 0 | Reward in the mint denomination for proposing a block. | True | +| distribution.BonusProposerReward | 0 | Extra reward in the mint denomination for proposers based on the voting power included in the commit. | True | +| distribution.CommunityTax | 0.02 (2%) | Percentage of the inflation sent to the community pool. | True | +| distribution.WithdrawAddrEnabled | true | Enables delegators to withdraw funds to a different address. | True | +| gov.DepositParams.MaxDepositPeriod | 604800000000000 (1 week) | Maximum period for token holders to deposit on a proposal in nanoseconds. | True | +| gov.DepositParams.MinDeposit | 10_000_000_000 utia (10,000 TIA) | Minimum deposit for a proposal to enter voting period. | True | +| gov.TallyParams.Quorum | 0.334 (33.4%) | Minimum percentage of total stake needed to vote for a result to be considered valid. | True | +| gov.TallyParams.Threshold | 0.50 (50%) | Minimum proportion of Yes votes for proposal to pass. | True | +| gov.TallyParams.VetoThreshold | 0.334 (33.4%) | Minimum value of Veto votes to Total votes ratio for proposal to be vetoed. | True | +| gov.VotingParams.VotingPeriod | 604800000000000 (1 week) | Duration of the voting period in nanoseconds. | True | +| ibc.ClientGenesis.AllowedClients | []string{"06-solomachine", "07-tendermint"} | List of allowed IBC light clients. | True | +| ibc.ConnectionGenesis.MaxExpectedTimePerBlock | 7500000000000 (75 seconds) | Maximum expected time per block in nanoseconds under normal operation. | True | +| ibc.Transfer.ReceiveEnabled | true | Enable receiving tokens via IBC. | True | +| ibc.Transfer.SendEnabled | true | Enable sending tokens via IBC. | True | +| icahost.HostEnabled | True | Enables or disables the Inter-Chain Accounts host module. | True | +| icahost.AllowMessages | [icaAllowMessages] | Defines a list of sdk message typeURLs allowed to be executed on a host chain. | True | +| minfee.NetworkMinGasPrice | 0.000001 utia | All transactions must have a gas price greater than or equal to this value. | True | +| mint.BondDenom | utia | Denomination that is inflated and sent to the distribution module account. | False | +| mint.DisinflationRate | 0.10 (10%) | The rate at which the inflation rate decreases each year. | False | +| mint.InitialInflationRate | 0.08 (8%) | The inflation rate the network starts at. | False | +| mint.TargetInflationRate | 0.015 (1.5%) | The inflation rate that the network aims to stabilize at. | False | +| slashing.DowntimeJailDuration | 1 min | Duration of time a validator must stay jailed. | True | +| slashing.MinSignedPerWindow | 0.75 (75%) | The percentage of SignedBlocksWindow that must be signed not to get jailed. | True | +| slashing.SignedBlocksWindow | 5000 | The range of blocks used to count for downtime. | True | +| slashing.SlashFractionDoubleSign | 0.02 (2%) | Percentage slashed after a validator is jailed for double signing. | True | +| slashing.SlashFractionDowntime | 0.00 (0%) | Percentage slashed after a validator is jailed for downtime. | True | +| staking.BondDenom | utia | Bondable coin denomination. | False | +| staking.HistoricalEntries | 10000 | Number of historical entries to persist in store. | True | +| staking.MaxEntries | 7 | Maximum number of entries in the redelegation queue. | True | +| staking.MaxValidators | 100 | Maximum number of validators. | True | +| staking.MinCommissionRate | 0.05 (5%) | Minimum commission rate used by all validators. | True | +| staking.UnbondingTime | 1814400 (21 days) | Duration of time for unbonding in seconds. | False | + +Note: none of the mint module parameters are governance modifiable because they have been converted into hardcoded constants. See the x/mint README.md for more details. + +[icaAllowMessages]: https://github.com/rootulp/celestia-app/blob/8caa5807df8d15477554eba953bd056ae72d4503/app/ica_host.go#L3-L18 diff --git a/specs/src/specs/shares.md b/specs/src/specs/shares.md index 30447d6a98..ee469f25f7 100644 --- a/specs/src/specs/shares.md +++ b/specs/src/specs/shares.md @@ -112,7 +112,7 @@ Share splitting is the process of converting a blob into a share sequence. The p ## Implementation -See [go-square/shares](https://github.com/celestiaorg/go-square/tree/main/shares). +See [go-square/shares](https://github.com/celestiaorg/go-square/tree/be3c2801e902a0f90f694c062b9c4e6a7e01154e/shares). ## References diff --git a/specs/src/specs/state_machine_modules.md b/specs/src/specs/state_machine_modules.md index 1ac2d47b56..3889c42472 100644 --- a/specs/src/specs/state_machine_modules.md +++ b/specs/src/specs/state_machine_modules.md @@ -1,33 +1,6 @@ # State Machine Modules -Celestia app is built using the cosmos-sdk, and follows standard cosmos-sdk module structure. +Celestia app is built using the cosmos-sdk, and follows standard cosmos-sdk module structure. The modules used in the application vary based on app version: -## `celestia-app` Specific Modules - -- [blob](https://github.com/celestiaorg/celestia-app/blob/main/x/blob/README.md) -- [minfee](https://github.com/celestiaorg/celestia-app/blob/main/x/minfee/README.md) -- [mint](https://github.com/celestiaorg/celestia-app/blob/main/x/mint/README.md) -- [paramfilter](https://github.com/celestiaorg/celestia-app/blob/main/x/paramfilter/README.md) -- [signal](https://github.com/celestiaorg/celestia-app/blob/main/x/signal/README.md) -- [tokenfilter](https://github.com/celestiaorg/celestia-app/blob/main/x/tokenfilter/README.md) - -## Standard `cosmos-sdk` Modules - -- [auth](https://github.com/celestiaorg/cosmos-sdk/blob/v1.14.0-sdk-v0.46.11/x/auth/spec/README.md) -- [authz](https://github.com/celestiaorg/cosmos-sdk/blob/v1.14.0-sdk-v0.46.11/x/authz/spec/README.md) -- [bank](https://github.com/celestiaorg/cosmos-sdk/blob/v1.14.0-sdk-v0.46.11/x/bank/spec/README.md) -- [capability](https://github.com/celestiaorg/cosmos-sdk/blob/v1.14.0-sdk-v0.46.11/x/capability/spec/README.md) -- [crisis](https://github.com/celestiaorg/cosmos-sdk/blob/v1.14.0-sdk-v0.46.11/x/crisis/spec/README.md) -- [distribution](https://github.com/celestiaorg/cosmos-sdk/blob/v1.14.0-sdk-v0.46.11/x/distribution/spec/README.md) -- [evidence](https://github.com/celestiaorg/cosmos-sdk/blob/v1.14.0-sdk-v0.46.11/x/evidence/spec/README.md) -- [feegrant](https://github.com/celestiaorg/cosmos-sdk/blob/v1.14.0-sdk-v0.46.11/x/feegrant/spec/README.md) -- [genutil](https://github.com/celestiaorg/cosmos-sdk/tree/v1.14.0-sdk-v0.46.11/x/genutil) (no spec) -- [gov](https://github.com/celestiaorg/cosmos-sdk/blob/v1.14.0-sdk-v0.46.11/x/gov/spec/README.md) -- [ibc](https://github.com/cosmos/ibc/blob/f990a7f96eb7753c2fabbd49ed50b64d3a807629/README.md) -- [interchain accounts](https://github.com/cosmos/ibc/blob/2921c5cec7b18e4ef77677e16a6b693051ae3b35/spec/app/ics-027-interchain-accounts/README.md) -- [packetforwardmiddleware](https://github.com/cosmos/ibc-apps/blob/main/middleware/packet-forward-middleware/README.md) -- [params](https://github.com/celestiaorg/cosmos-sdk/blob/v1.14.0-sdk-v0.46.11/x/params/spec/README.md) -- [slashing](https://github.com/celestiaorg/cosmos-sdk/blob/v1.14.0-sdk-v0.46.11/x/slashing/spec/README.md) -- [staking](https://github.com/celestiaorg/cosmos-sdk/blob/v1.14.0-sdk-v0.46.11/x/staking/spec/README.md) -- [transfer](https://github.com/cosmos/ibc/blob/f990a7f96eb7753c2fabbd49ed50b64d3a807629/spec/app/ics-020-fungible-token-transfer/README.md) -- [vesting](https://github.com/celestiaorg/cosmos-sdk/tree/v1.14.0-sdk-v0.46.11/x/auth/vesting) (no spec) +- [State Machine Modules v1](state_machine_modules_v1.md) +- [State Machine Modules v2](state_machine_modules_v2.md) diff --git a/specs/src/specs/state_machine_modules_v1.md b/specs/src/specs/state_machine_modules_v1.md new file mode 100644 index 0000000000..eef6d4df54 --- /dev/null +++ b/specs/src/specs/state_machine_modules_v1.md @@ -0,0 +1,30 @@ +# State Machine Modules v1 + +The modules used in app version 1 are: + +## `celestia-app` modules + +- [blob](https://github.com/celestiaorg/celestia-app/blob/main/x/blob/README.md) +- [blobstream](https://github.com/celestiaorg/celestia-app/blob/main/x/blobstream/README.md) +- [mint](https://github.com/celestiaorg/celestia-app/blob/main/x/mint/README.md) +- [paramfilter](https://github.com/celestiaorg/celestia-app/blob/main/x/paramfilter/README.md) +- [tokenfilter](https://github.com/celestiaorg/celestia-app/blob/main/x/tokenfilter/README.md) + +## `cosmos-sdk` modules + +- [auth](https://github.com/celestiaorg/cosmos-sdk/blob/v1.14.0-sdk-v0.46.11/x/auth/spec/README.md) +- [authz](https://github.com/celestiaorg/cosmos-sdk/blob/v1.14.0-sdk-v0.46.11/x/authz/spec/README.md) +- [bank](https://github.com/celestiaorg/cosmos-sdk/blob/v1.14.0-sdk-v0.46.11/x/bank/spec/README.md) +- [capability](https://github.com/celestiaorg/cosmos-sdk/blob/v1.14.0-sdk-v0.46.11/x/capability/spec/README.md) +- [crisis](https://github.com/celestiaorg/cosmos-sdk/blob/v1.14.0-sdk-v0.46.11/x/crisis/spec/README.md) +- [distribution](https://github.com/celestiaorg/cosmos-sdk/blob/v1.14.0-sdk-v0.46.11/x/distribution/spec/README.md) +- [evidence](https://github.com/celestiaorg/cosmos-sdk/blob/v1.14.0-sdk-v0.46.11/x/evidence/spec/README.md) +- [feegrant](https://github.com/celestiaorg/cosmos-sdk/blob/v1.14.0-sdk-v0.46.11/x/feegrant/spec/README.md) +- [genutil](https://github.com/celestiaorg/cosmos-sdk/tree/v1.14.0-sdk-v0.46.11/x/genutil) (no spec) +- [gov](https://github.com/celestiaorg/cosmos-sdk/blob/v1.14.0-sdk-v0.46.11/x/gov/spec/README.md) +- [ibc](https://github.com/cosmos/ibc/blob/f990a7f96eb7753c2fabbd49ed50b64d3a807629/README.md) +- [params](https://github.com/celestiaorg/cosmos-sdk/blob/v1.14.0-sdk-v0.46.11/x/params/spec/README.md) +- [slashing](https://github.com/celestiaorg/cosmos-sdk/blob/v1.14.0-sdk-v0.46.11/x/slashing/spec/README.md) +- [staking](https://github.com/celestiaorg/cosmos-sdk/blob/v1.14.0-sdk-v0.46.11/x/staking/spec/README.md) +- [transfer](https://github.com/cosmos/ibc/blob/f990a7f96eb7753c2fabbd49ed50b64d3a807629/spec/app/ics-020-fungible-token-transfer/README.md) +- [vesting](https://github.com/celestiaorg/cosmos-sdk/tree/v1.14.0-sdk-v0.46.11/x/auth/vesting) (no spec) diff --git a/specs/src/specs/state_machine_modules_v2.md b/specs/src/specs/state_machine_modules_v2.md new file mode 100644 index 0000000000..25fea4947e --- /dev/null +++ b/specs/src/specs/state_machine_modules_v2.md @@ -0,0 +1,33 @@ +# State Machine Modules v2 + +The modules used in app version 2 are: + +## `celestia-app` modules + +- [blob](https://github.com/celestiaorg/celestia-app/blob/main/x/blob/README.md) +- [minfee](https://github.com/celestiaorg/celestia-app/blob/main/x/minfee/README.md) +- [mint](https://github.com/celestiaorg/celestia-app/blob/main/x/mint/README.md) +- [paramfilter](https://github.com/celestiaorg/celestia-app/blob/main/x/paramfilter/README.md) +- [signal](https://github.com/celestiaorg/celestia-app/blob/main/x/signal/README.md) +- [tokenfilter](https://github.com/celestiaorg/celestia-app/blob/main/x/tokenfilter/README.md) + +## `cosmos-sdk` modules + +- [auth](https://github.com/celestiaorg/cosmos-sdk/blob/v1.14.0-sdk-v0.46.11/x/auth/spec/README.md) +- [authz](https://github.com/celestiaorg/cosmos-sdk/blob/v1.14.0-sdk-v0.46.11/x/authz/spec/README.md) +- [bank](https://github.com/celestiaorg/cosmos-sdk/blob/v1.14.0-sdk-v0.46.11/x/bank/spec/README.md) +- [capability](https://github.com/celestiaorg/cosmos-sdk/blob/v1.14.0-sdk-v0.46.11/x/capability/spec/README.md) +- [crisis](https://github.com/celestiaorg/cosmos-sdk/blob/v1.14.0-sdk-v0.46.11/x/crisis/spec/README.md) +- [distribution](https://github.com/celestiaorg/cosmos-sdk/blob/v1.14.0-sdk-v0.46.11/x/distribution/spec/README.md) +- [evidence](https://github.com/celestiaorg/cosmos-sdk/blob/v1.14.0-sdk-v0.46.11/x/evidence/spec/README.md) +- [feegrant](https://github.com/celestiaorg/cosmos-sdk/blob/v1.14.0-sdk-v0.46.11/x/feegrant/spec/README.md) +- [genutil](https://github.com/celestiaorg/cosmos-sdk/tree/v1.14.0-sdk-v0.46.11/x/genutil) (no spec) +- [gov](https://github.com/celestiaorg/cosmos-sdk/blob/v1.14.0-sdk-v0.46.11/x/gov/spec/README.md) +- [ibc](https://github.com/cosmos/ibc/blob/f990a7f96eb7753c2fabbd49ed50b64d3a807629/README.md) +- [interchain accounts](https://github.com/cosmos/ibc/blob/2921c5cec7b18e4ef77677e16a6b693051ae3b35/spec/app/ics-027-interchain-accounts/README.md) +- [packetforwardmiddleware](https://github.com/cosmos/ibc-apps/blob/main/middleware/packet-forward-middleware/README.md) +- [params](https://github.com/celestiaorg/cosmos-sdk/blob/v1.14.0-sdk-v0.46.11/x/params/spec/README.md) +- [slashing](https://github.com/celestiaorg/cosmos-sdk/blob/v1.14.0-sdk-v0.46.11/x/slashing/spec/README.md) +- [staking](https://github.com/celestiaorg/cosmos-sdk/blob/v1.14.0-sdk-v0.46.11/x/staking/spec/README.md) +- [transfer](https://github.com/cosmos/ibc/blob/f990a7f96eb7753c2fabbd49ed50b64d3a807629/spec/app/ics-020-fungible-token-transfer/README.md) +- [vesting](https://github.com/celestiaorg/cosmos-sdk/tree/v1.14.0-sdk-v0.46.11/x/auth/vesting) (no spec) diff --git a/x/paramfilter/test/gov_params_test.go b/x/paramfilter/test/gov_params_test.go index ca482e99fe..c9c6b83efa 100644 --- a/x/paramfilter/test/gov_params_test.go +++ b/x/paramfilter/test/gov_params_test.go @@ -5,15 +5,11 @@ import ( "time" "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/x/paramfilter" - "github.com/stretchr/testify/suite" - - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - testutil "github.com/celestiaorg/celestia-app/v2/test/util" blobtypes "github.com/celestiaorg/celestia-app/v2/x/blob/types" bsmoduletypes "github.com/celestiaorg/celestia-app/v2/x/blobstream/types" minfeetypes "github.com/celestiaorg/celestia-app/v2/x/minfee" + "github.com/celestiaorg/celestia-app/v2/x/paramfilter" "github.com/cosmos/cosmos-sdk/baseapp" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" @@ -24,9 +20,12 @@ import ( "github.com/cosmos/cosmos-sdk/x/params/types/proposal" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + icahosttypes "github.com/cosmos/ibc-go/v6/modules/apps/27-interchain-accounts/host/types" ibctransfertypes "github.com/cosmos/ibc-go/v6/modules/apps/transfer/types" ibcclienttypes "github.com/cosmos/ibc-go/v6/modules/core/02-client/types" ibcconnectiontypes "github.com/cosmos/ibc-go/v6/modules/core/03-connection/types" + "github.com/stretchr/testify/suite" + tmproto "github.com/tendermint/tendermint/proto/tendermint/types" ) type GovParamsTestSuite struct { @@ -51,7 +50,7 @@ func TestGovParamsTestSuite(t *testing.T) { } // TestModifiableParams verifies that the params listed as governance modifiable -// in the specs params.md file are modifiable via governance. +// in the specs parameters.md file are modifiable via governance. func (suite *GovParamsTestSuite) TestModifiableParams() { assert := suite.Assert() @@ -370,6 +369,32 @@ func (suite *GovParamsTestSuite) TestModifiableParams() { assert.Equal(want, got) }, }, + { + "icahost.HostEnabled", + testProposal(proposal.ParamChange{ + Subspace: icahosttypes.SubModuleName, + Key: string(icahosttypes.KeyHostEnabled), + Value: `false`, + }), + func() { + got := suite.app.ICAHostKeeper.GetParams(suite.ctx).HostEnabled + want := false + assert.Equal(want, got) + }, + }, + { + "icahost.AllowMessages", + testProposal(proposal.ParamChange{ + Subspace: icahosttypes.SubModuleName, + Key: string(icahosttypes.KeyAllowMessages), + Value: `["foo"]`, + }), + func() { + got := suite.app.ICAHostKeeper.GetParams(suite.ctx).AllowMessages + want := []string{"foo"} + assert.Equal(want, got) + }, + }, { "slashing.DowntimeJailDuration", testProposal(proposal.ParamChange{ @@ -516,8 +541,8 @@ func (suite *GovParamsTestSuite) TestModifiableParams() { } // TestUnmodifiableParams verifies that the params listed as non governance -// modifiable in the specs params.md file cannot be modified via governance. It -// does not include a test case for consensus.block.TimeIotaMs because +// modifiable in the specs parameters.md file cannot be modified via governance. +// It does not include a test case for consensus.block.TimeIotaMs because // TimeIotaMs is not exposed to the application. func (suite *GovParamsTestSuite) TestUnmodifiableParams() { assert := suite.Assert() From 3b87024c0822e063bc45de575b2557ef970e399d Mon Sep 17 00:00:00 2001 From: Elias Rad <146735585+nnsW3@users.noreply.github.com> Date: Tue, 16 Jul 2024 20:16:12 +0300 Subject: [PATCH 20/40] docs: fix grammar (#3681) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hello I found some spelling issues in your docs. Hope it helps Br, Elias. --------- Co-authored-by: CHAMI Rachid Co-authored-by: nina / ნინა Co-authored-by: Rootul P --- docs/architecture/adr-018-network-upgrades.md | 4 ++-- .../architecture/adr-020-deterministic-square-construction.md | 2 +- docs/architecture/adr-022-multi-versioned-state-machine.md | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/architecture/adr-018-network-upgrades.md b/docs/architecture/adr-018-network-upgrades.md index 2ff4e19a34..a361d49cfc 100644 --- a/docs/architecture/adr-018-network-upgrades.md +++ b/docs/architecture/adr-018-network-upgrades.md @@ -45,7 +45,7 @@ Given this, a node can at any time spin up a v2 binary which will immediately be ### Configured Upgrade Height -The height of the the v1 -> v2 upgrade will initially be supplied via CLI flag (i.e. `--v2-upgrade-height`). There are a few considerations that shape how this system will work: +The height of the v1 -> v2 upgrade will initially be supplied via CLI flag (i.e. `--v2-upgrade-height`). There are a few considerations that shape how this system will work: - Upgrading needs to support state migrations. These must happen to all nodes at the same moment between heights. Ideally all migrations that affect state would correspond at the height of the new app version i.e. after `Commit` and before processing of the transactions at that height. `BeginBlock` seems like an ideal area to perform these upgrades however these might affect the way that `PrepareProposal` and `ProcessProposal` is conducted thus they must be performed even prior to these ABCI calls. A simpler implementation would have been for the proposer to immediately propose a block with the next version i.e. v2. However that would require the proposer to first migrate state (taking an unknown length of time) and for the validators receiving that proposal to first migrate before validating and given that the upgrade is not certain, there would need to be a mechanism to migrate back to v1 (NOTE: this remains the case if we wish to support downgrading which is discussed later). To overcome these requirements, the proposer must signal in the prior height the intention to upgrade to a new version. This is done with a new message type, `MsgVersionChange`, which must be put as the first transaction in the block. Validators read this and if they are in agreement to supporting the version change they vote on the block accordingly. If the block reaches consensus then all validators will update the app version at `EndBlock`. CometBFT will then propose the next block using that version. Nodes that have not upgraded and don't support the binary will error and exit. Given that the previous block was approved by more than 2/3 of the network we have a strong guarantee that this block will be accepted by the network. However, it's worth noting that given a security model that must withstand 1/3 byzantine nodes, even a single byzantine node that voted for the upgrade yet doesn't vote for the following block can stall the network until > 2/3 nodes upgrade and vote on the following block. - Given uncertainty in scheduling, the system must be able to handle changes to the upgrade height that most commonly would come in the form of delays. Embedding the upgrade schedule in the binary is convenient for node operators and avoids the possibility for user errors. However, binaries are static. If the community wished to push back the upgrade by two weeks there is the possibility that some nodes would not rerun the new binary thus we'd get a split between nodes running the old schedule and nodes running the new schedule. To overcome this, proposers will only propose a version change in the first round of each height, thus allowing transactions to still be committed even under circumstances where there is no consensus on upgrading. Secondly, we define a range in which nodes will attempt to upgrade the app version and failing this will continue to run the current version. Lastly, the binary will have the ability to manually specify the app version height mapping and override the built-in values either through a flag or in the `app.toml` config. This is expected to be used in testing and in emergency situations only. Another example to keep in mind is if a quorum outright rejects an upgrade. If some of the validators are for the change they should have some way to continue participating in the network. Therefore we employ a range that nodes will attempt to upgrade and afterwards will continue on normally with the new binary however running the older version. @@ -65,7 +65,7 @@ For better performance, `VoteExtensions` should be modified such that empty mess There are two alternative approaches that were considered: - **Off-chain**: A new p2p reactor is introduced whereby validators sign a message indicating they are now running a new binary and are ready to switch. Once a proposer has received a quorum plus some predefined grace period, they will propose a block with the new version and the rest of the network will vote accordingly. This approach means that the application doesn't have control but rather has to listen for changes in the app version. This also requires a change to the `PrivValidator` interface to be able to sign the new message. -- **On-chain**: Upon upgrading to a new binary, the node will submit a transaction signalling it's ability to switch version. Again after a quorum is reached and some grace period, the `upgrade` module would trigger the app version change in `EndBlock`. The drawback with this approach is that this would probably require gas to submit in order to avoid spamming the network and wouldn't necessarily be automatic i.e. nodes could upgrade and forget to signal. +- **On-chain**: Upon upgrading to a new binary, the node will submit a transaction signaling its ability to switch version. Again after a quorum is reached and some grace period, the `upgrade` module would trigger the app version change in `EndBlock`. The drawback with this approach is that this would probably require gas to submit in order to avoid spamming the network and wouldn't necessarily be automatic i.e. nodes could upgrade and forget to signal. ### Future Work: Downgrading diff --git a/docs/architecture/adr-020-deterministic-square-construction.md b/docs/architecture/adr-020-deterministic-square-construction.md index 67202e0eec..dc96815eb3 100644 --- a/docs/architecture/adr-020-deterministic-square-construction.md +++ b/docs/architecture/adr-020-deterministic-square-construction.md @@ -60,7 +60,7 @@ With these two structs, we can safely guarantee that all staged transactions can Both `PrepareProposal` and `ProcessProposal` will as a result, call much the same methods. Verification is thus reduced to: did I create the same square as you, rather than is your version of the square valid. The main difference is that `PrepareProposal` will handle overflow of transactions by discarding them, while `ProcessProposal` will handle overflow by rejecting the block. -The new algorithm will no longer need to check that the blobs are ordered by namespace and that the wrapped PFBs contain the corrext share index. `ProcessProposal` will still need to verify the `BlobTx` format (i.e that each blob has a matching PFB and that the PFBs are correctly signed) +The new algorithm will no longer need to check that the blobs are ordered by namespace and that the wrapped PFBs contain the correct share index. `ProcessProposal` will still need to verify the `BlobTx` format (i.e that each blob has a matching PFB and that the PFBs are correctly signed) ## Consequences diff --git a/docs/architecture/adr-022-multi-versioned-state-machine.md b/docs/architecture/adr-022-multi-versioned-state-machine.md index 24c893aee3..d5202a3d0c 100644 --- a/docs/architecture/adr-022-multi-versioned-state-machine.md +++ b/docs/architecture/adr-022-multi-versioned-state-machine.md @@ -10,7 +10,7 @@ Implemented ## Context -The Celestia application required a modification from the existing Cosmos SDK to support multiple versions of the state machine simultaneously. This capability is crucial for single binary syncs and ensuring a smooth transition during upgrades, allowing nodes to upgrade independently and then switch to the next state machine without any downtime to the network. This is important for a network which is depended on by a large number of rollups and users. +The Celestia application required a modification from the existing Cosmos SDK to support multiple versions of the state machine simultaneously. This capability is crucial for single binary syncs and ensuring a smooth transition during upgrades, allowing nodes to upgrade independently and then switch to the next state machine without any downtime to the network. This is important for a network on which a large number of rollups and users depend. ## Decision From 5b27eba3c9d57dce50c1df7489555b9747f3da6c Mon Sep 17 00:00:00 2001 From: Rootul P Date: Tue, 16 Jul 2024 16:16:29 -0400 Subject: [PATCH 21/40] test(testnode): configure custom min gas price (#3680) Context: https://github.com/celestiaorg/celestia-node/pull/3453#issuecomment-2220710282 Fix testnode so that it is possible to query the local min gas price again. I plan on backporting this to v2.x to fix celestia-node integration tests which query local min gas price. --- app/test/testnode_test.go | 26 ++++++++++++++++++++++ pkg/user/tx_client_test.go | 32 +++++++++++++++------------ test/util/testnode/config.go | 42 ++++++++++++++++++++++++++++++++++-- 3 files changed, 84 insertions(+), 16 deletions(-) diff --git a/app/test/testnode_test.go b/app/test/testnode_test.go index b33a87eaec..f9f8466b7d 100644 --- a/app/test/testnode_test.go +++ b/app/test/testnode_test.go @@ -3,7 +3,12 @@ package app_test import ( "testing" + v2 "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/v2" "github.com/celestiaorg/celestia-app/v2/test/util/testnode" + "github.com/celestiaorg/celestia-app/v2/x/minfee" + nodeservice "github.com/cosmos/cosmos-sdk/client/grpc/node" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func Test_testnode(t *testing.T) { @@ -15,4 +20,25 @@ func Test_testnode(t *testing.T) { config := testnode.DefaultConfig().WithChainID(chainID) testnode.NewNetwork(t, config) }) + t.Run("testnode can query network min gas price", func(t *testing.T) { + config := testnode.DefaultConfig() + cctx, _, _ := testnode.NewNetwork(t, config) + + queryClient := minfee.NewQueryClient(cctx.GRPCClient) + resp, err := queryClient.NetworkMinGasPrice(cctx.GoContext(), &minfee.QueryNetworkMinGasPrice{}) + require.NoError(t, err) + got, err := resp.NetworkMinGasPrice.Float64() + require.NoError(t, err) + assert.Equal(t, v2.NetworkMinGasPrice, got) + }) + t.Run("testnode can query local min gas price", func(t *testing.T) { + config := testnode.DefaultConfig() + cctx, _, _ := testnode.NewNetwork(t, config) + + serviceClient := nodeservice.NewServiceClient(cctx.GRPCClient) + resp, err := serviceClient.Config(cctx.GoContext(), &nodeservice.ConfigRequest{}) + require.NoError(t, err) + want := "0.002000000000000000utia" + assert.Equal(t, want, resp.MinimumGasPrice) + }) } diff --git a/pkg/user/tx_client_test.go b/pkg/user/tx_client_test.go index 3dc717e7a4..ebdb6e1c66 100644 --- a/pkg/user/tx_client_test.go +++ b/pkg/user/tx_client_test.go @@ -37,7 +37,10 @@ type TxClientTestSuite struct { func (suite *TxClientTestSuite) SetupSuite() { suite.encCfg = encoding.MakeConfig(app.ModuleEncodingRegisters...) - suite.ctx, _, _ = testnode.NewNetwork(suite.T(), testnode.DefaultConfig().WithFundedAccounts("a", "b", "c")) + config := testnode.DefaultConfig(). + WithFundedAccounts("a", "b", "c"). + WithAppCreator(testnode.CustomAppCreator("0utia")) + suite.ctx, _, _ = testnode.NewNetwork(suite.T(), config) _, err := suite.ctx.WaitForHeight(1) suite.Require().NoError(err) suite.txClient, err = user.SetupTxClient(suite.ctx.GoContext(), suite.ctx.Keyring, suite.ctx.GRPCClient, suite.encCfg, user.WithGasMultiplier(1.2)) @@ -83,36 +86,37 @@ func (suite *TxClientTestSuite) TestSubmitPayForBlob() { func (suite *TxClientTestSuite) TestSubmitTx() { t := suite.T() - fee := user.SetFee(1e6) - gas := user.SetGasLimit(1e6) + gasLimit := uint64(1e6) + gasLimitOption := user.SetGasLimit(gasLimit) + feeOption := user.SetFee(1e6) addr := suite.txClient.DefaultAddress() msg := bank.NewMsgSend(addr, testnode.RandomAddress().(sdk.AccAddress), sdk.NewCoins(sdk.NewInt64Coin(app.BondDenom, 10))) t.Run("submit tx without provided fee and gas limit", func(t *testing.T) { resp, err := suite.txClient.SubmitTx(suite.ctx.GoContext(), []sdk.Msg{msg}) require.NoError(t, err) - require.EqualValues(t, 0, resp.Code) + require.Equal(t, abci.CodeTypeOK, resp.Code) require.Greater(t, resp.GasWanted, int64(0)) }) t.Run("submit tx with provided gas limit", func(t *testing.T) { - resp, err := suite.txClient.SubmitTx(suite.ctx.GoContext(), []sdk.Msg{msg}, gas) + resp, err := suite.txClient.SubmitTx(suite.ctx.GoContext(), []sdk.Msg{msg}, gasLimitOption) require.NoError(t, err) - require.EqualValues(t, 0, resp.Code) - require.EqualValues(t, resp.GasWanted, 1e6) + require.Equal(t, abci.CodeTypeOK, resp.Code) + require.EqualValues(t, gasLimit, resp.GasWanted) }) t.Run("submit tx with provided fee", func(t *testing.T) { - resp, err := suite.txClient.SubmitTx(suite.ctx.GoContext(), []sdk.Msg{msg}, fee) + resp, err := suite.txClient.SubmitTx(suite.ctx.GoContext(), []sdk.Msg{msg}, feeOption) require.NoError(t, err) - require.EqualValues(t, 0, resp.Code) + require.Equal(t, abci.CodeTypeOK, resp.Code) }) t.Run("submit tx with provided fee and gas limit", func(t *testing.T) { - resp, err := suite.txClient.SubmitTx(suite.ctx.GoContext(), []sdk.Msg{msg}, fee, gas) + resp, err := suite.txClient.SubmitTx(suite.ctx.GoContext(), []sdk.Msg{msg}, feeOption, gasLimitOption) require.NoError(t, err) - require.EqualValues(t, 0, resp.Code) - require.EqualValues(t, resp.GasWanted, 1e6) + require.Equal(t, abci.CodeTypeOK, resp.Code) + require.EqualValues(t, gasLimit, resp.GasWanted) }) t.Run("submit tx with a different account", func(t *testing.T) { @@ -120,14 +124,14 @@ func (suite *TxClientTestSuite) TestSubmitTx() { msg := bank.NewMsgSend(addr, testnode.RandomAddress().(sdk.AccAddress), sdk.NewCoins(sdk.NewInt64Coin(app.BondDenom, 10))) resp, err := suite.txClient.SubmitTx(suite.ctx.GoContext(), []sdk.Msg{msg}) require.NoError(t, err) - require.EqualValues(t, 0, resp.Code) + require.Equal(t, abci.CodeTypeOK, resp.Code) }) t.Run("submit tx with an updated default gas price", func(t *testing.T) { suite.txClient.SetDefaultGasPrice(appconsts.DefaultMinGasPrice / 2) resp, err := suite.txClient.SubmitTx(suite.ctx.GoContext(), []sdk.Msg{msg}) require.NoError(t, err) - require.EqualValues(t, 0, resp.Code) + require.Equal(t, abci.CodeTypeOK, resp.Code) suite.txClient.SetDefaultGasPrice(appconsts.DefaultMinGasPrice) }) } diff --git a/test/util/testnode/config.go b/test/util/testnode/config.go index 975a4ddc3c..74e5fe8086 100644 --- a/test/util/testnode/config.go +++ b/test/util/testnode/config.go @@ -2,16 +2,22 @@ package testnode import ( "fmt" + "io" "time" - "github.com/celestiaorg/celestia-app/v2/cmd/celestia-appd/cmd" + "github.com/celestiaorg/celestia-app/v2/app" + "github.com/celestiaorg/celestia-app/v2/app/encoding" "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" "github.com/celestiaorg/celestia-app/v2/test/util/genesis" + "github.com/cosmos/cosmos-sdk/baseapp" srvconfig "github.com/cosmos/cosmos-sdk/server/config" srvtypes "github.com/cosmos/cosmos-sdk/server/types" + "github.com/cosmos/cosmos-sdk/simapp" tmconfig "github.com/tendermint/tendermint/config" + "github.com/tendermint/tendermint/libs/log" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" "github.com/tendermint/tendermint/types" + tmdb "github.com/tendermint/tm-db" ) const ( @@ -126,7 +132,7 @@ func DefaultConfig() *Config { WithTendermintConfig(DefaultTendermintConfig()). WithAppConfig(DefaultAppConfig()). WithAppOptions(DefaultAppOptions()). - WithAppCreator(cmd.NewAppServer). + WithAppCreator(DefaultAppCreator()). WithSuppressLogs(true). // TODO: consider removing this line because default consensus params is invoked above. WithConsensusParams(DefaultConsensusParams()) @@ -166,3 +172,35 @@ func DefaultTendermintConfig() *tmconfig.Config { return tmCfg } + +func DefaultAppCreator() srvtypes.AppCreator { + return func(_ log.Logger, _ tmdb.DB, _ io.Writer, _ srvtypes.AppOptions) srvtypes.Application { + encodingConfig := encoding.MakeConfig(app.ModuleEncodingRegisters...) + return app.New( + log.NewNopLogger(), + tmdb.NewMemDB(), + nil, // trace store + 0, // invCheckPerid + encodingConfig, + 0, // v2 upgrade height + simapp.EmptyAppOptions{}, + baseapp.SetMinGasPrices(fmt.Sprintf("%v%v", appconsts.DefaultMinGasPrice, app.BondDenom)), + ) + } +} + +func CustomAppCreator(minGasPrice string) srvtypes.AppCreator { + return func(_ log.Logger, _ tmdb.DB, _ io.Writer, _ srvtypes.AppOptions) srvtypes.Application { + encodingConfig := encoding.MakeConfig(app.ModuleEncodingRegisters...) + return app.New( + log.NewNopLogger(), + tmdb.NewMemDB(), + nil, // trace store + 0, // invCheckPerid + encodingConfig, + 0, // v2 upgrade height + simapp.EmptyAppOptions{}, + baseapp.SetMinGasPrices(minGasPrice), + ) + } +} From a11ee9f412d2f3669cbbefcdeced780a3543015b Mon Sep 17 00:00:00 2001 From: nathan haim Date: Tue, 16 Jul 2024 22:22:07 +0200 Subject: [PATCH 22/40] refactor: single-node.sh - modify prompts (#3685) Closes #3652 ## Overview It modifies `single-node.sh` script. This rewrites the first prompt and deletes the second one. I wanted write `Do you want to start a new local testnet? [y/n]` only when `$HOME/.celestia-app` does not exist. But it looks like as soon as `celestia-app` is invoked, it creates the directory. Hence I cannot use this information. --------- Co-authored-by: Rootul Patel --- scripts/single-node.sh | 178 +++++++++++++++++++++-------------------- 1 file changed, 91 insertions(+), 87 deletions(-) diff --git a/scripts/single-node.sh b/scripts/single-node.sh index b7a86812e9..5cfc2bf030 100755 --- a/scripts/single-node.sh +++ b/scripts/single-node.sh @@ -18,97 +18,101 @@ COINS="1000000000000000utia" DELEGATION_AMOUNT="5000000000utia" CELESTIA_APP_HOME="${HOME}/.celestia-app" CELESTIA_APP_VERSION=$(celestia-appd version 2>&1) +GENESIS_FILE="${CELESTIA_APP_HOME}/config/genesis.json" FEES="500utia" echo "celestia-app home: ${CELESTIA_APP_HOME}" echo "celestia-app version: ${CELESTIA_APP_VERSION}" echo "" -# Ask the user for confirmation before deleting the existing celestia-app home -# directory. -echo "Are you sure you want to delete: $CELESTIA_APP_HOME? [y/n] " -read -r response - -# Check the user's response -if [ "$response" != "y" ]; then - # Exit if the user did not respond with "y" - echo "You must delete $CELESTIA_APP_HOME to continue." - exit 1 +createGenesis() { + echo "Initializing validator and node config files..." + celestia-appd init ${CHAIN_ID} \ + --chain-id ${CHAIN_ID} \ + --home "${CELESTIA_APP_HOME}" \ + > /dev/null 2>&1 # Hide output to reduce terminal noise + + echo "Adding a new key to the keyring..." + celestia-appd keys add ${KEY_NAME} \ + --keyring-backend=${KEYRING_BACKEND} \ + --home "${CELESTIA_APP_HOME}" \ + > /dev/null 2>&1 # Hide output to reduce terminal noise + + echo "Adding genesis account..." + celestia-appd add-genesis-account \ + "$(celestia-appd keys show ${KEY_NAME} -a --keyring-backend=${KEYRING_BACKEND} --home "${CELESTIA_APP_HOME}")" \ + $COINS \ + --home "${CELESTIA_APP_HOME}" + + echo "Creating a genesis tx..." + celestia-appd gentx ${KEY_NAME} ${DELEGATION_AMOUNT} \ + --fees ${FEES} \ + --keyring-backend=${KEYRING_BACKEND} \ + --chain-id ${CHAIN_ID} \ + --home "${CELESTIA_APP_HOME}" \ + > /dev/null 2>&1 # Hide output to reduce terminal noise + + echo "Collecting genesis txs..." + celestia-appd collect-gentxs \ + --home "${CELESTIA_APP_HOME}" \ + > /dev/null 2>&1 # Hide output to reduce terminal noise + + # If you encounter: `sed: -I or -i may not be used with stdin` on MacOS you can mitigate by installing gnu-sed + # https://gist.github.com/andre3k1/e3a1a7133fded5de5a9ee99c87c6fa0d?permalink_comment_id=3082272#gistcomment-3082272 + + # Override the default RPC servier listening address + sed -i'.bak' 's#"tcp://127.0.0.1:26657"#"tcp://0.0.0.0:26657"#g' "${CELESTIA_APP_HOME}"/config/config.toml + + # Enable transaction indexing + sed -i'.bak' 's#"null"#"kv"#g' "${CELESTIA_APP_HOME}"/config/config.toml + + # Persist ABCI responses + sed -i'.bak' 's#discard_abci_responses = true#discard_abci_responses = false#g' "${CELESTIA_APP_HOME}"/config/config.toml + + # Override the log level to debug + # sed -i'.bak' 's#log_level = "info"#log_level = "debug"#g' "${CELESTIA_APP_HOME}"/config/config.toml + + # Override the VotingPeriod from 1 week to 1 minute + sed -i'.bak' 's#"604800s"#"60s"#g' "${CELESTIA_APP_HOME}"/config/genesis.json + + # Override the genesis to use app version 1 and then upgrade to app version 2 later. + sed -i'.bak' 's#"app_version": "2"#"app_version": "1"#g' "${CELESTIA_APP_HOME}"/config/genesis.json + + trace_type="local" + sed -i.bak -e "s/^trace_type *=.*/trace_type = \"$trace_type\"/" ${CELESTIA_APP_HOME}/config/config.toml + + trace_pull_address=":26661" + sed -i.bak -e "s/^trace_pull_address *=.*/trace_pull_address = \"$trace_pull_address\"/" ${CELESTIA_APP_HOME}/config/config.toml + + trace_push_batch_size=1000 + sed -i.bak -e "s/^trace_push_batch_size *=.*/trace_push_batch_size = \"$trace_push_batch_size\"/" ${CELESTIA_APP_HOME}/config/config.toml + + echo "Tracing is set up with the ability to pull traced data from the node on the address http://127.0.0.1${trace_pull_address}" +} + +deleteCelestiaAppHome() { + echo "Deleting $CELESTIA_APP_HOME..." + rm -r "$CELESTIA_APP_HOME" +} + +startCelestiaApp() { + echo "Starting celestia-app..." + celestia-appd start \ + --home "${CELESTIA_APP_HOME}" \ + --api.enable \ + --grpc.enable \ + --grpc-web.enable \ + --v2-upgrade-height 3 +} + +if [ -f $GENESIS_FILE ]; then + echo "Do you want to delete existing ${CELESTIA_APP_HOME} and start a new local testnet? [y/n]" + read -r response + if [ "$response" = "y" ]; then + deleteCelestiaAppHome + createGenesis + fi +else + createGenesis fi - -echo "Deleting $CELESTIA_APP_HOME..." -rm -r "$CELESTIA_APP_HOME" - -echo "Initializing validator and node config files..." -celestia-appd init ${CHAIN_ID} \ - --chain-id ${CHAIN_ID} \ - --home "${CELESTIA_APP_HOME}" \ - > /dev/null 2>&1 # Hide output to reduce terminal noise - -echo "Adding a new key to the keyring..." -celestia-appd keys add ${KEY_NAME} \ - --keyring-backend=${KEYRING_BACKEND} \ - --home "${CELESTIA_APP_HOME}" \ - > /dev/null 2>&1 # Hide output to reduce terminal noise - -echo "Adding genesis account..." -celestia-appd add-genesis-account \ - "$(celestia-appd keys show ${KEY_NAME} -a --keyring-backend=${KEYRING_BACKEND} --home "${CELESTIA_APP_HOME}")" \ - $COINS \ - --home "${CELESTIA_APP_HOME}" - -echo "Creating a genesis tx..." -celestia-appd gentx ${KEY_NAME} ${DELEGATION_AMOUNT} \ - --fees ${FEES} \ - --keyring-backend=${KEYRING_BACKEND} \ - --chain-id ${CHAIN_ID} \ - --home "${CELESTIA_APP_HOME}" \ - > /dev/null 2>&1 # Hide output to reduce terminal noise - -echo "Collecting genesis txs..." -celestia-appd collect-gentxs \ - --home "${CELESTIA_APP_HOME}" \ - > /dev/null 2>&1 # Hide output to reduce terminal noise - -# If you encounter: `sed: -I or -i may not be used with stdin` on MacOS you can mitigate by installing gnu-sed -# https://gist.github.com/andre3k1/e3a1a7133fded5de5a9ee99c87c6fa0d?permalink_comment_id=3082272#gistcomment-3082272 - -# Override the default RPC servier listening address -sed -i'.bak' 's#"tcp://127.0.0.1:26657"#"tcp://0.0.0.0:26657"#g' "${CELESTIA_APP_HOME}"/config/config.toml - -# Enable transaction indexing -sed -i'.bak' 's#"null"#"kv"#g' "${CELESTIA_APP_HOME}"/config/config.toml - -# Persist ABCI responses -sed -i'.bak' 's#discard_abci_responses = true#discard_abci_responses = false#g' "${CELESTIA_APP_HOME}"/config/config.toml - -# Override the log level to debug -# sed -i'.bak' 's#log_level = "info"#log_level = "debug"#g' "${CELESTIA_APP_HOME}"/config/config.toml - -# Override the VotingPeriod from 1 week to 1 minute -sed -i'.bak' 's#"604800s"#"60s"#g' "${CELESTIA_APP_HOME}"/config/genesis.json - -# Override the genesis to use app version 1 and then upgrade to app version 2 later. -sed -i'.bak' 's#"app_version": "2"#"app_version": "1"#g' "${CELESTIA_APP_HOME}"/config/genesis.json - - -echo "Do you want to set up local tracing with the ability to pull traced data? [y/n]" -read -r response -if [[ $response == "y" ]]; then - trace_type="local" - sed -i.bak -e "s/^trace_type *=.*/trace_type = \"$trace_type\"/" ${CELESTIA_APP_HOME}/config/config.toml - trace_pull_address=":26661" - sed -i.bak -e "s/^trace_pull_address *=.*/trace_pull_address = \"$trace_pull_address\"/" ${CELESTIA_APP_HOME}/config/config.toml - trace_push_batch_size=1000 - sed -i.bak -e "s/^trace_push_batch_size *=.*/trace_push_batch_size = \"$trace_push_batch_size\"/" ${CELESTIA_APP_HOME}/config/config.toml - echo "Tracing is set up with the ability to pull traced data from the node on the address http://127.0.0.1${trace_pull_address}" -fi - -# Start celestia-app -echo "Starting celestia-app..." -celestia-appd start \ - --home "${CELESTIA_APP_HOME}" \ - --api.enable \ - --grpc.enable \ - --grpc-web.enable \ - --v2-upgrade-height 3 +startCelestiaApp From 9df3d18ab485effaca491764edaff2b12be6ec99 Mon Sep 17 00:00:00 2001 From: Rootul P Date: Wed, 17 Jul 2024 05:22:36 -0400 Subject: [PATCH 23/40] chore(makefile): add PHONY for markdown-link-check (#3679) I was copying this command to celestia-stack-internal and noticed that it is missing a `PHONY` --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index c7fdcbdc5d..f37ee4dc5d 100644 --- a/Makefile +++ b/Makefile @@ -103,13 +103,13 @@ lint: @hadolint Dockerfile @echo "--> Running yamllint" @yamllint --no-warnings . -c .yamllint.yml - .PHONY: lint ## markdown-link-check: Check all markdown links. markdown-link-check: @echo "--> Running markdown-link-check" @find . -name \*.md -print0 | xargs -0 -n1 markdown-link-check +.PHONY: markdown-link-check ## fmt: Format files per linters golangci-lint and markdownlint. From de4e066f77b78dd4aca77cb7f1717922dfb6b12f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Jul 2024 10:45:54 -0400 Subject: [PATCH 24/40] chore(deps): Bump github.com/celestiaorg/rsmt2d from 0.13.1 to 0.14.0 (#3693) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [github.com/celestiaorg/rsmt2d](https://github.com/celestiaorg/rsmt2d) from 0.13.1 to 0.14.0.
Release notes

Sourced from github.com/celestiaorg/rsmt2d's releases.

v0.14.0

What's Changed

New Contributors

Full Changelog: https://github.com/celestiaorg/rsmt2d/compare/v0.13.1...v0.14.0

Commits
  • 638ef71 chore(deps): Bump github.com/celestiaorg/nmt from 0.21.0 to 0.22.0 (#331)
  • 83c7b71 chore(deps): Bump codecov/codecov-action from 4.4.1 to 4.5.0 (#329)
  • 8149293 chore(deps): Bump github.com/celestiaorg/nmt from 0.20.0 to 0.21.0 (#328)
  • ffebc7f Reorganize entries in go.mod (#327)
  • 5656709 chore(deps): Bump codecov/codecov-action from 4.3.0 to 4.4.1 (#326)
  • 716234c chore(deps): Bump golangci/golangci-lint-action from 6.0.0 to 6.0.1 (#324)
  • 7d58efa chore(deps): Bump golangci/golangci-lint-action from 5.1.0 to 6.0.0 (#323)
  • 196aa61 chore(deps): Bump golangci/golangci-lint-action from 5.0.0 to 5.1.0 (#320)
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/celestiaorg/rsmt2d&package-manager=go_modules&previous-version=0.13.1&new-version=0.14.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 334e470c88..ee75956951 100644 --- a/go.mod +++ b/go.mod @@ -9,8 +9,8 @@ require ( github.com/celestiaorg/go-square v1.1.0 github.com/celestiaorg/go-square/merkle v0.0.0-20240117232118-fd78256df076 github.com/celestiaorg/knuu v0.14.0 - github.com/celestiaorg/nmt v0.21.0 - github.com/celestiaorg/rsmt2d v0.13.1 + github.com/celestiaorg/nmt v0.22.0 + github.com/celestiaorg/rsmt2d v0.14.0 github.com/cosmos/cosmos-proto v1.0.0-beta.5 github.com/cosmos/cosmos-sdk v0.46.16 github.com/cosmos/gogoproto v1.5.0 diff --git a/go.sum b/go.sum index e5b1057755..42ba33e2ce 100644 --- a/go.sum +++ b/go.sum @@ -330,10 +330,10 @@ github.com/celestiaorg/knuu v0.14.0 h1:96uaDHTzlTfhDLrAiygq9Ewow7UzOzGAbUvMwws1S github.com/celestiaorg/knuu v0.14.0/go.mod h1:5x/+tlLebBSfLmmSBm2ps6aLjnKLn5bOaZpUfI5FpsA= github.com/celestiaorg/merkletree v0.0.0-20210714075610-a84dc3ddbbe4 h1:CJdIpo8n5MFP2MwK0gSRcOVlDlFdQJO1p+FqdxYzmvc= github.com/celestiaorg/merkletree v0.0.0-20210714075610-a84dc3ddbbe4/go.mod h1:fzuHnhzj1pUygGz+1ZkB3uQbEUL4htqCGJ4Qs2LwMZA= -github.com/celestiaorg/nmt v0.21.0 h1:81MBqxNn3orByoiCtdNVjwi5WsLgMkzHwP02ZMhTBHM= -github.com/celestiaorg/nmt v0.21.0/go.mod h1:ia/EpCk0enD5yO5frcxoNoFToz2Ghtk2i+blmCRjIY8= -github.com/celestiaorg/rsmt2d v0.13.1 h1:eRhp79DKTkDojwInKVs1lRK6f6zJc1BVlmZfUfI19yQ= -github.com/celestiaorg/rsmt2d v0.13.1/go.mod h1:P7t92OATXbBmc/P5uR+GCOBv+PV8wLb0vU32ucrb148= +github.com/celestiaorg/nmt v0.22.0 h1:AGtfmBiVgreR1KkIV5R7XFNeMp/H4IUDLlBbLjZZ3zk= +github.com/celestiaorg/nmt v0.22.0/go.mod h1:ia/EpCk0enD5yO5frcxoNoFToz2Ghtk2i+blmCRjIY8= +github.com/celestiaorg/rsmt2d v0.14.0 h1:L7XJ3tRJDY8sQcvCjzHq0L7JmsmaSD+VItymIYFLqYc= +github.com/celestiaorg/rsmt2d v0.14.0/go.mod h1:4kxqiTdFev49sGiKXTDjohbWYOG5GlcIfftTgaBJnpc= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= From e7b5d8ff6816ebe3fc5321e2e454cde8c46677f6 Mon Sep 17 00:00:00 2001 From: Rootul P Date: Wed, 17 Jul 2024 10:46:13 -0400 Subject: [PATCH 25/40] test: add Name to Account (#3690) There are a few places in celestia-node where I want to use the account names from testnode but they weren't persisted/exposed prior to this PR. --- test/util/genesis/document.go | 4 ++++ test/util/genesis/genesis.go | 1 + test/util/test_app.go | 4 +++- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/test/util/genesis/document.go b/test/util/genesis/document.go index 842bb92770..3823e10be8 100644 --- a/test/util/genesis/document.go +++ b/test/util/genesis/document.go @@ -110,6 +110,7 @@ func accountsToSDKTypes(accounts []Account) ([]banktypes.Balance, []authtypes.Ge type Account struct { PubKey cryptotypes.PubKey Balance int64 + Name string } func (ga Account) ValidateBasic() error { @@ -119,5 +120,8 @@ func (ga Account) ValidateBasic() error { if ga.Balance <= 0 { return fmt.Errorf("balance must be greater than 0") } + if ga.Name == "" { + return fmt.Errorf("name cannot be empty") + } return nil } diff --git a/test/util/genesis/genesis.go b/test/util/genesis/genesis.go index 228997f88b..f5ffe51084 100644 --- a/test/util/genesis/genesis.go +++ b/test/util/genesis/genesis.go @@ -155,6 +155,7 @@ func (g *Genesis) NewAccount(acc KeyringAccount) error { account := Account{ PubKey: pubKey, Balance: acc.InitialTokens, + Name: acc.Name, } g.accounts = append(g.accounts, account) diff --git a/test/util/test_app.go b/test/util/test_app.go index 1fc02f8d06..e1d50722e2 100644 --- a/test/util/test_app.go +++ b/test/util/test_app.go @@ -103,10 +103,11 @@ func SetupDeterministicGenesisState(testApp *app.App, pubKeys []cryptotypes.PubK WithGenesisTime(time.Date(2023, 1, 1, 1, 1, 1, 1, time.UTC).UTC()) // add accounts to genesis - for _, pk := range pubKeys { + for i, pk := range pubKeys { err := gen.AddAccount(genesis.Account{ PubKey: pk, Balance: balance, + Name: fmt.Sprintf("%v", i), }) if err != nil { return nil, nil, err @@ -237,6 +238,7 @@ func AddDeterministicValidatorToGenesis(g *genesis.Genesis) error { account := genesis.Account{ PubKey: validatorPubKey, Balance: val.KeyringAccount.InitialTokens, + Name: val.Name, } // add the validator's account to the genesis From 5601f4e0059a6aee701f34c638f1a1a535c044d5 Mon Sep 17 00:00:00 2001 From: Rootul P Date: Wed, 17 Jul 2024 15:07:28 -0400 Subject: [PATCH 26/40] chore: skip testnode test in race mode (#3696) I noticed a CI failure on another PR for test-race and I'm pretty sure testnode tests will fail in race mode b/c of an un-ivestigated issue. --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index f37ee4dc5d..fb483c7572 100644 --- a/Makefile +++ b/Makefile @@ -143,7 +143,7 @@ test-race: # TODO: Remove the -skip flag once the following tests no longer contain data races. # https://github.com/celestiaorg/celestia-app/issues/1369 @echo "--> Running tests in race mode" - @go test ./... -v -race -skip "TestPrepareProposalConsistency|TestIntegrationTestSuite|TestBlobstreamRPCQueries|TestSquareSizeIntegrationTest|TestStandardSDKIntegrationTestSuite|TestTxsimCommandFlags|TestTxsimCommandEnvVar|TestMintIntegrationTestSuite|TestBlobstreamCLI|TestUpgrade|TestMaliciousTestNode|TestBigBlobSuite|TestQGBIntegrationSuite|TestSignerTestSuite|TestPriorityTestSuite|TestTimeInPrepareProposalContext|TestBlobstream|TestCLITestSuite|TestLegacyUpgrade|TestSignerTwins|TestConcurrentTxSubmission|TestTxClientTestSuite" + @go test ./... -v -race -skip "TestPrepareProposalConsistency|TestIntegrationTestSuite|TestBlobstreamRPCQueries|TestSquareSizeIntegrationTest|TestStandardSDKIntegrationTestSuite|TestTxsimCommandFlags|TestTxsimCommandEnvVar|TestMintIntegrationTestSuite|TestBlobstreamCLI|TestUpgrade|TestMaliciousTestNode|TestBigBlobSuite|TestQGBIntegrationSuite|TestSignerTestSuite|TestPriorityTestSuite|TestTimeInPrepareProposalContext|TestBlobstream|TestCLITestSuite|TestLegacyUpgrade|TestSignerTwins|TestConcurrentTxSubmission|TestTxClientTestSuite|Test_testnode" .PHONY: test-race ## test-bench: Run unit tests in bench mode. From 99d9def016ec9e3fcbe80946cec689c7f05c18ac Mon Sep 17 00:00:00 2001 From: Rootul P Date: Thu, 18 Jul 2024 06:16:27 -0400 Subject: [PATCH 27/40] fix(goreleaser): do not mark rcs as latest release (#3701) There is an issue with goreleaser where it will automatically mark release candidates as the latest release. Motivated by https://github.com/celestiaorg/celestia-node/pull/3569 Thanks @ramin! --- .goreleaser.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.goreleaser.yaml b/.goreleaser.yaml index 9d425f96b7..950143a3f1 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -115,5 +115,7 @@ changelog: exclude: - "^docs:" - "^test:" +release: + prerelease: auto git: - prerelease_suffix: "-" + prerelease_suffix: "-rc*" From fdfa2c02368b11685dcd350412bb0b11effd76df Mon Sep 17 00:00:00 2001 From: closeobserve Date: Fri, 19 Jul 2024 02:21:10 +0900 Subject: [PATCH 28/40] chore: fix some comments (#3705) ## Overview fix some comments Signed-off-by: closeobserve --- README.md | 2 +- app/app.go | 2 +- app/module/manager.go | 4 ++-- local_devnet/celestia-app/app.toml | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 52fbc287f4..c82f1f5f82 100644 --- a/README.md +++ b/README.md @@ -108,7 +108,7 @@ celestia-appd tx blob pay-for-blob 0x00010203040506070809 0x48656c6c6f2c20576f72 ### Usage as a library -If import celestia-app as a Go module, you may need to add some Go module `replace` directives to avoid type incompatabilities. Please see the `replace` directive in [go.mod](./go.mod) for inspiration. +If import celestia-app as a Go module, you may need to add some Go module `replace` directives to avoid type incompatibilities. Please see the `replace` directive in [go.mod](./go.mod) for inspiration. ## Contributing diff --git a/app/app.go b/app/app.go index 42ca5494fb..0c0decfd0a 100644 --- a/app/app.go +++ b/app/app.go @@ -254,7 +254,7 @@ func New( ) app.FeeGrantKeeper = feegrantkeeper.NewKeeper(appCodec, keys[feegrant.StoreKey], app.AccountKeeper) - // The ugrade keeper is intialised solely for the ibc keeper which depends on it to know what the next validator hash is for after the + // The upgrade keeper is intialised solely for the ibc keeper which depends on it to know what the next validator hash is for after the // upgrade. This keeper is not used for the actual upgrades but merely for compatibility reasons. Ideally IBC has their own upgrade module // for performing IBC based upgrades. Note, as we use rolling upgrades, IBC technically never needs this functionality. app.UpgradeKeeper = upgradekeeper.NewKeeper(nil, keys[upgradetypes.StoreKey], appCodec, "", app.BaseApp, authtypes.NewModuleAddress(govtypes.ModuleName).String()) diff --git a/app/module/manager.go b/app/module/manager.go index 441498ed54..f680177922 100644 --- a/app/module/manager.go +++ b/app/module/manager.go @@ -16,7 +16,7 @@ import ( // Manager defines a module manager that provides the high level utility for // managing and executing operations for a group of modules. This implementation // was originally inspired by the module manager defined in Cosmos SDK but this -// implemention maps the state machine version to different versions of the +// implementation maps the state machine version to different versions of the // module. It also provides a way to run migrations between different versions // of a module. type Manager struct { @@ -362,7 +362,7 @@ func (m *Manager) SupportedVersions() []uint64 { return getKeys(m.versionedModules) } -// checkUgradeSchedule performs a dry run of all the upgrades in all versions and asserts that the consensus version +// checkUpgradeSchedule performs a dry run of all the upgrades in all versions and asserts that the consensus version // for a module domain i.e. auth, always increments for each module that uses the auth domain name func (m *Manager) checkUpgradeSchedule() error { if m.firstVersion == m.lastVersion { diff --git a/local_devnet/celestia-app/app.toml b/local_devnet/celestia-app/app.toml index ea7ffb68b5..129fbb3ba6 100644 --- a/local_devnet/celestia-app/app.toml +++ b/local_devnet/celestia-app/app.toml @@ -173,7 +173,7 @@ enable-fee-suggestion = false # GasToSuggest defines gas limit when calculating the fee gas-to-suggest = 210000 -# DenomToSuggest defines the defult denom for fee suggestion. +# DenomToSuggest defines the default denom for fee suggestion. # Price must be in minimum-gas-prices. denom-to-suggest = "uatom" From 6d90d7bd226883889ece53f644a4490294e9ea41 Mon Sep 17 00:00:00 2001 From: Christina <156356273+cratiu222@users.noreply.github.com> Date: Fri, 19 Jul 2024 13:07:53 +0300 Subject: [PATCH 29/40] fix(docs/adr): spelling (#3704) Hello I found some spelling issues in your docs. Glad I was helpful. --------- Co-authored-by: Rootul P --- docs/architecture/adr-002-qgb-valset.md | 2 +- docs/architecture/adr-006-non-interactive-defaults.md | 2 +- docs/architecture/adr-018-network-upgrades.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/architecture/adr-002-qgb-valset.md b/docs/architecture/adr-002-qgb-valset.md index f446941246..35f0188cf4 100644 --- a/docs/architecture/adr-002-qgb-valset.md +++ b/docs/architecture/adr-002-qgb-valset.md @@ -12,7 +12,7 @@ To accommodate the requirements of the [Quantum Gravity Bridge](https://github.c Add the `ValSet` and `ValSetConfirm` types of messages in order to track the state of the validator set. -PS: The `ValsetConfirm` have been updated in `adr-005-qgb-reduce-state-usage`. Please take a look at it to know how we will be handling the confirms. +PS: The `ValsetConfirm` has been updated in `adr-005-qgb-reduce-state-usage`. Please take a look at it to know how we will be handling the confirms. ## Detailed Design diff --git a/docs/architecture/adr-006-non-interactive-defaults.md b/docs/architecture/adr-006-non-interactive-defaults.md index d57e4fbaa3..0c8a8f4eb4 100644 --- a/docs/architecture/adr-006-non-interactive-defaults.md +++ b/docs/architecture/adr-006-non-interactive-defaults.md @@ -375,7 +375,7 @@ func estimateSquareSize(txs []*parsedTx, evd core.EvidenceList) (uint64, int) { If there are too many transactions and messages in the square to fit in the max square size, then we have to remove them from the block. This can be complicated, as by default we want to prioritize transactions that have higher fees, but removing a low-fee transaction doesn't always result in using fewer shares. -The simplest approach, and the one taken in the initial implementation, works by prematurely pruning the txs if we estimate that too many shares are being used. While this does work and fulfills the constraints discussed earlier to create valid blocks, it is suboptimal. Ideally, we would be able to identify the most optimal message and transactions to remove and then simply remove only those. As mentioned earlier, technically, a single-byte difference could change the entire arrangement of the square. This makes arranging the square with complete confidence difficult not only because we have to follow all of the constraints, but also because of our frequent reliance on variable length length delimiters, and protobuf changing the amount of bytes used depending on the size of ints/uints. +The simplest approach, and the one taken in the initial implementation, works by prematurely pruning the txs if we estimate that too many shares are being used. While this does work and fulfills the constraints discussed earlier to create valid blocks, it is suboptimal. Ideally, we would be able to identify the most optimal message and transactions to remove and then simply remove only those. As mentioned earlier, technically, a single-byte difference could change the entire arrangement of the square. This makes arranging the square with complete confidence difficult not only because we have to follow all of the constraints, but also because of our frequent reliance on variable length delimiters, and protobuf changing the amount of bytes used depending on the size of ints/uints. ```go func (app *App) PrepareProposal(req abci.RequestPrepareProposal) abci.ResponsePrepareProposal { diff --git a/docs/architecture/adr-018-network-upgrades.md b/docs/architecture/adr-018-network-upgrades.md index a361d49cfc..3a9453eb0f 100644 --- a/docs/architecture/adr-018-network-upgrades.md +++ b/docs/architecture/adr-018-network-upgrades.md @@ -48,7 +48,7 @@ Given this, a node can at any time spin up a v2 binary which will immediately be The height of the v1 -> v2 upgrade will initially be supplied via CLI flag (i.e. `--v2-upgrade-height`). There are a few considerations that shape how this system will work: - Upgrading needs to support state migrations. These must happen to all nodes at the same moment between heights. Ideally all migrations that affect state would correspond at the height of the new app version i.e. after `Commit` and before processing of the transactions at that height. `BeginBlock` seems like an ideal area to perform these upgrades however these might affect the way that `PrepareProposal` and `ProcessProposal` is conducted thus they must be performed even prior to these ABCI calls. A simpler implementation would have been for the proposer to immediately propose a block with the next version i.e. v2. However that would require the proposer to first migrate state (taking an unknown length of time) and for the validators receiving that proposal to first migrate before validating and given that the upgrade is not certain, there would need to be a mechanism to migrate back to v1 (NOTE: this remains the case if we wish to support downgrading which is discussed later). To overcome these requirements, the proposer must signal in the prior height the intention to upgrade to a new version. This is done with a new message type, `MsgVersionChange`, which must be put as the first transaction in the block. Validators read this and if they are in agreement to supporting the version change they vote on the block accordingly. If the block reaches consensus then all validators will update the app version at `EndBlock`. CometBFT will then propose the next block using that version. Nodes that have not upgraded and don't support the binary will error and exit. Given that the previous block was approved by more than 2/3 of the network we have a strong guarantee that this block will be accepted by the network. However, it's worth noting that given a security model that must withstand 1/3 byzantine nodes, even a single byzantine node that voted for the upgrade yet doesn't vote for the following block can stall the network until > 2/3 nodes upgrade and vote on the following block. -- Given uncertainty in scheduling, the system must be able to handle changes to the upgrade height that most commonly would come in the form of delays. Embedding the upgrade schedule in the binary is convenient for node operators and avoids the possibility for user errors. However, binaries are static. If the community wished to push back the upgrade by two weeks there is the possibility that some nodes would not rerun the new binary thus we'd get a split between nodes running the old schedule and nodes running the new schedule. To overcome this, proposers will only propose a version change in the first round of each height, thus allowing transactions to still be committed even under circumstances where there is no consensus on upgrading. Secondly, we define a range in which nodes will attempt to upgrade the app version and failing this will continue to run the current version. Lastly, the binary will have the ability to manually specify the app version height mapping and override the built-in values either through a flag or in the `app.toml` config. This is expected to be used in testing and in emergency situations only. Another example to keep in mind is if a quorum outright rejects an upgrade. If some of the validators are for the change they should have some way to continue participating in the network. Therefore we employ a range that nodes will attempt to upgrade and afterwards will continue on normally with the new binary however running the older version. +- Given the uncertainty in scheduling, the system must be able to handle changes to the upgrade height that most commonly would come in the form of delays. Embedding the upgrade schedule in the binary is convenient for node operators and avoids the possibility for user errors. However, binaries are static. If the community wished to push back the upgrade by two weeks there is the possibility that some nodes would not rerun the new binary thus we'd get a split between nodes running the old schedule and nodes running the new schedule. To overcome this, proposers will only propose a version change in the first round of each height, thus allowing transactions to still be committed even under circumstances where there is no consensus on upgrading. Secondly, we define a range in which nodes will attempt to upgrade the app version and failing this will continue to run the current version. Lastly, the binary will have the ability to manually specify the app version height mapping and override the built-in values either through a flag or in the `app.toml` config. This is expected to be used in testing and in emergency situations only. Another example to keep in mind is if a quorum outright rejects an upgrade. If some of the validators are for the change they should have some way to continue participating in the network. Therefore we employ a range that nodes will attempt to upgrade and afterwards will continue on normally with the new binary however running the older version. - The system needs to be tolerant of unexpected faults in the upgrade process. This can be: - The community/contributors realize there is a bug in the new version after the binary has been released. Node operators will need to downgrade back to the previous version and restart their node. - There is a halting bug in the migration or in processing of the first transactions. This most likely would be in the form of an apphash mismatch. This becomes more problematic with delayed execution as the block (with v2 transactions) has already been committed. Immediate execution has the advantage of the apphash mismatch being realised before the data is committed. It's still however feasible to over come this but it involves nodes rolling back the previous state and re-exectuing the transactions using the v1 state machine (which will skip over the v2 transactions). This means node operators should be able to manually override the app version that the proposer will propose with. Lastly, if state migrations occurred between v2 and v1, a reverse migration would need to be performed which would make things especially difficult. If we are unable to fallback to the previous version and continue then the other option is to remain halted until the bug is patched and the network can update and continue From 9407a5b8e32d4a1d999c42f3d5032485f448f54d Mon Sep 17 00:00:00 2001 From: Rootul P Date: Fri, 19 Jul 2024 06:08:09 -0400 Subject: [PATCH 30/40] refactor(testnode): remove duplicate consensus params (#3687) Closes https://github.com/celestiaorg/celestia-app/issues/3684 --- test/util/testnode/config.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/test/util/testnode/config.go b/test/util/testnode/config.go index 74e5fe8086..efaaf10ac6 100644 --- a/test/util/testnode/config.go +++ b/test/util/testnode/config.go @@ -133,9 +133,7 @@ func DefaultConfig() *Config { WithAppConfig(DefaultAppConfig()). WithAppOptions(DefaultAppOptions()). WithAppCreator(DefaultAppCreator()). - WithSuppressLogs(true). - // TODO: consider removing this line because default consensus params is invoked above. - WithConsensusParams(DefaultConsensusParams()) + WithSuppressLogs(true) } func DefaultConsensusParams() *tmproto.ConsensusParams { From 535802c14a0bd6bde7c08b8c55caf0a46144a047 Mon Sep 17 00:00:00 2001 From: CHAMI Rachid Date: Fri, 19 Jul 2024 12:18:49 +0200 Subject: [PATCH 31/40] chore: add (start share == end share) check in parse namespace (#3709) ## Overview The start share shouldn't be equal to the end share because the range is end-exclusive. This PR adds this check. --- pkg/proof/proof_test.go | 7 +++++++ pkg/proof/querier.go | 5 +++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/pkg/proof/proof_test.go b/pkg/proof/proof_test.go index 2064e63cf2..d8559d8c24 100644 --- a/pkg/proof/proof_test.go +++ b/pkg/proof/proof_test.go @@ -150,6 +150,13 @@ func TestNewShareInclusionProof(t *testing.T) { namespaceID: appns.TxNamespace, expectErr: true, }, + { + name: "ending share is equal to the starting share", + startingShare: 1, + endingShare: 1, + namespaceID: appns.TxNamespace, + expectErr: true, + }, { name: "ending share higher than number of shares available in square size of 32", startingShare: 0, diff --git a/pkg/proof/querier.go b/pkg/proof/querier.go index 3f10220860..e5602d5ef7 100644 --- a/pkg/proof/querier.go +++ b/pkg/proof/querier.go @@ -130,6 +130,7 @@ func QueryShareInclusionProof(_ sdk.Context, path []string, req abci.RequestQuer // ParseNamespace validates the share range, checks if it only contains one namespace and returns // that namespace ID. +// The provided range, defined by startShare and endShare, is end-exclusive. func ParseNamespace(rawShares []shares.Share, startShare int, endShare int) (appns.Namespace, error) { if startShare < 0 { return appns.Namespace{}, fmt.Errorf("start share %d should be positive", startShare) @@ -139,8 +140,8 @@ func ParseNamespace(rawShares []shares.Share, startShare int, endShare int) (app return appns.Namespace{}, fmt.Errorf("end share %d should be positive", endShare) } - if endShare < startShare { - return appns.Namespace{}, fmt.Errorf("end share %d cannot be lower than starting share %d", endShare, startShare) + if endShare <= startShare { + return appns.Namespace{}, fmt.Errorf("end share %d cannot be lower or equal to the starting share %d", endShare, startShare) } if endShare > len(rawShares) { From acf7fc11df967bf269e3bcd8a278bdc73b51f9e8 Mon Sep 17 00:00:00 2001 From: Rootul P Date: Fri, 19 Jul 2024 11:50:44 -0400 Subject: [PATCH 32/40] fix(test/e2e): name cannot be empty error (#3706) Recent e2e tests failed with: ``` 2024/07/18 17:22:08 Failed to setup testnet: converting accounts into sdk types: invalid account 4: name cannot be empty ``` because https://github.com/celestiaorg/celestia-app/pull/3690 merged. Since e2e tests aren't run as part of CI on each PR, I didn't learn about the failure until @ninabarbakadze pinged about it. ## Testing ``` make test-e2e ``` gets past that error locally. --- test/e2e/testnet/testnet.go | 1 + test/util/genesis/genesis.go | 3 +++ 2 files changed, 4 insertions(+) diff --git a/test/e2e/testnet/testnet.go b/test/e2e/testnet/testnet.go index e300a77288..9a37d87e7a 100644 --- a/test/e2e/testnet/testnet.go +++ b/test/e2e/testnet/testnet.go @@ -218,6 +218,7 @@ func (t *Testnet) CreateAccount(name string, tokens int64, txsimKeyringDir strin err = t.genesis.AddAccount(genesis.Account{ PubKey: pk, Balance: tokens, + Name: name, }) if err != nil { return nil, err diff --git a/test/util/genesis/genesis.go b/test/util/genesis/genesis.go index f5ffe51084..80a14d11ea 100644 --- a/test/util/genesis/genesis.go +++ b/test/util/genesis/genesis.go @@ -122,6 +122,9 @@ func (g *Genesis) WithKeyringAccounts(accs ...KeyringAccount) *Genesis { // AddAccount adds an existing account to the genesis. func (g *Genesis) AddAccount(account Account) error { + if err := account.ValidateBasic(); err != nil { + return err + } for _, acc := range g.accounts { if bytes.Equal(acc.PubKey.Bytes(), account.PubKey.Bytes()) { return fmt.Errorf("account with pubkey %s already exists", account.PubKey.String()) From 891e0d3483789de1bcd967bb5e948136a5912fde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nina=20/=20=E1=83=9C=E1=83=98=E1=83=9C=E1=83=90?= Date: Tue, 23 Jul 2024 14:12:12 +0200 Subject: [PATCH 33/40] test: expand apphash test with all state machine msgs (#3606) ## Overview Resolves #3540 & Resolves #3626 Expected AppHash generated from https://github.com/celestiaorg/celestia-app/pull/3665 --- app/test/consistent_apphash_test.go | 433 ++++++++++++++++++++++++---- test/util/common.go | 28 ++ test/util/genesis/modifier.go | 11 + test/util/test_app.go | 98 ++++--- test/util/testfactory/common.go | 17 +- 5 files changed, 475 insertions(+), 112 deletions(-) diff --git a/app/test/consistent_apphash_test.go b/app/test/consistent_apphash_test.go index c3133ba98c..5d1928935c 100644 --- a/app/test/consistent_apphash_test.go +++ b/app/test/consistent_apphash_test.go @@ -3,6 +3,7 @@ package app_test import ( "fmt" "testing" + "time" "github.com/celestiaorg/celestia-app/v2/app" "github.com/celestiaorg/celestia-app/v2/app/encoding" @@ -10,127 +11,292 @@ import ( "github.com/celestiaorg/celestia-app/v2/pkg/user" testutil "github.com/celestiaorg/celestia-app/v2/test/util" "github.com/celestiaorg/celestia-app/v2/test/util/blobfactory" + "github.com/celestiaorg/celestia-app/v2/test/util/testfactory" + blobtypes "github.com/celestiaorg/celestia-app/v2/x/blob/types" "github.com/celestiaorg/go-square/blob" appns "github.com/celestiaorg/go-square/namespace" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/crypto/hd" "github.com/cosmos/cosmos-sdk/crypto/keyring" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/authz" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + crisisTypes "github.com/cosmos/cosmos-sdk/x/crisis/types" + distribution "github.com/cosmos/cosmos-sdk/x/distribution/types" + "github.com/cosmos/cosmos-sdk/x/feegrant" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1" + slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" "github.com/tendermint/tendermint/proto/tendermint/version" ) -type SdkTx struct { - sdkMsgs []sdk.Msg - txOptions []user.TxOption -} - type BlobTx struct { author string blobs []*blob.Blob txOptions []user.TxOption } -// TestConsistentAppHash executes a set of txs, generates an app hash, +// TestConsistentAppHash executes all state machine messages, generates an app hash, // and compares it against a previously generated hash from the same set of transactions. // App hashes across different commits should be consistent. func TestConsistentAppHash(t *testing.T) { - // Expected app hash produced by v1.x - TODO: link to the test producing the hash - expectedAppHash := []byte{9, 208, 117, 101, 108, 61, 146, 58, 26, 190, 199, 124, 76, 178, 84, 74, 54, 159, 76, 187, 2, 169, 128, 87, 70, 78, 8, 192, 28, 144, 116, 117} + // Expected app hash produced by v1.x - https://github.com/celestiaorg/celestia-app/blob/v1.x/app/consistent_apphash_test.go + expectedAppHash := []byte{84, 216, 210, 48, 113, 204, 234, 21, 150, 236, 97, 87, 242, 184, 45, 248, 116, 127, 49, 88, 134, 197, 202, 125, 44, 210, 67, 144, 107, 51, 145, 65} + expectedDataRoot := []byte{100, 59, 112, 241, 238, 49, 50, 64, 105, 90, 209, 211, 49, 254, 211, 83, 133, 88, 5, 89, 221, 116, 141, 72, 33, 110, 16, 78, 5, 48, 118, 72} // Initialize testApp testApp := testutil.NewTestApp() - enc := encoding.MakeConfig(app.ModuleEncodingRegisters...) + // Create deterministic keys kr, pubKeys := deterministicKeyRing(enc.Codec) - recs, err := kr.List() + // Apply genesis state to the app. + valKeyRing, _, err := testutil.SetupDeterministicGenesisState(testApp, pubKeys, 20_000_000_000, app.DefaultInitialConsensusParams()) require.NoError(t, err) - accountNames := make([]string, 0, len(recs)) - // Get the name of the records - for _, rec := range recs { - accountNames = append(accountNames, rec.Name) - } + // ------------ Genesis User Accounts ------------ - // Apply genesis state to the app. - _, _, err = testutil.SetupDeterministicGenesisState(testApp, pubKeys, 1_000_000_000, app.DefaultInitialConsensusParams()) - require.NoError(t, err) + // Get account names and addresses from the keyring + accountNames := testfactory.GetAccountNames(kr) + accountAddresses := testfactory.GetAddresses(kr) // Query keyring account infos accountInfos := queryAccountInfo(testApp, accountNames, kr) // Create accounts for the signer - accounts := make([]*user.Account, 0, len(accountInfos)) - for i, accountInfo := range accountInfos { - account := user.NewAccount(accountNames[i], accountInfo.AccountNum, accountInfo.Sequence) - accounts = append(accounts, account) - } + accounts := createAccounts(accountInfos, accountNames) - // Create a signer with keyring accounts + // Create a signer with accounts signer, err := user.NewSigner(kr, enc.TxConfig, testutil.ChainID, app.DefaultInitialVersion, accounts...) require.NoError(t, err) - amount := sdk.NewCoins(sdk.NewCoin(app.BondDenom, sdk.NewIntFromUint64(1000))) + // ------------ Genesis Validator Accounts ------------ - // Create an SDK Tx - sdkTx := SdkTx{ - sdkMsgs: []sdk.Msg{ - banktypes.NewMsgSend(signer.Account(accountNames[0]).Address(), - signer.Account(accountNames[1]).Address(), - amount), - }, - txOptions: blobfactory.DefaultTxOpts(), + // Validators from genesis state + genValidators := testApp.StakingKeeper.GetAllValidators(testApp.NewContext(false, tmproto.Header{})) + + // Get validator account names from the validator keyring + valAccountNames := testfactory.GetAccountNames(valKeyRing) + + // Query validator account infos + valAccountInfos := queryAccountInfo(testApp, valAccountNames, valKeyRing) + + // Create accounts for the validators' signer + valAccounts := createAccounts(valAccountInfos, valAccountNames) + + // Create a signer with validator accounts + valSigner, err := user.NewSigner(valKeyRing, enc.TxConfig, testutil.ChainID, app.DefaultInitialVersion, valAccounts...) + require.NoError(t, err) + + // ----------- Create SDK Messages ------------ + + amount := sdk.NewCoins(sdk.NewCoin(app.BondDenom, sdk.NewIntFromUint64(1_000))) + // Minimum deposit required for a gov proposal to become active + depositAmount := sdk.NewCoins(sdk.NewCoin(app.BondDenom, sdk.NewIntFromUint64(10000000000))) + twoInt := sdk.NewInt(2) + + // ---------------- First Block ------------ + var firstBlockSdkMsgs []sdk.Msg + + // NewMsgSend - sends funds from account-0 to account-1 + sendFundsMsg := banktypes.NewMsgSend(accountAddresses[0], accountAddresses[1], amount) + firstBlockSdkMsgs = append(firstBlockSdkMsgs, sendFundsMsg) + + // MultiSend - creates a multi-send transaction from account-0 to account-1 + multiSendFundsMsg := banktypes.NewMsgMultiSend([]banktypes.Input{ + banktypes.NewInput( + accountAddresses[0], + amount, + ), + }, + []banktypes.Output{ + banktypes.NewOutput( + accountAddresses[1], + amount, + ), + }) + firstBlockSdkMsgs = append(firstBlockSdkMsgs, multiSendFundsMsg) + + // NewMsgGrant - grants authorization to account-1 + grantExpiration := time.Date(2026, time.January, 1, 0, 0, 0, 0, time.UTC) + authorization := authz.NewGenericAuthorization(blobtypes.URLMsgPayForBlobs) + msgGrant, err := authz.NewMsgGrant( + accountAddresses[0], + accountAddresses[1], + authorization, + &grantExpiration, + ) + require.NoError(t, err) + firstBlockSdkMsgs = append(firstBlockSdkMsgs, msgGrant) + + // MsgVerifyInvariant - verifies the nonnegative-outstanding invariant within the bank module for the account-0 + msgVerifyInvariant := crisisTypes.NewMsgVerifyInvariant(accountAddresses[0], banktypes.ModuleName, "nonnegative-outstanding") + firstBlockSdkMsgs = append(firstBlockSdkMsgs, msgVerifyInvariant) + + // MsgGrantAllowance - creates a grant allowance for account-1 + basicAllowance := feegrant.BasicAllowance{ + SpendLimit: sdk.NewCoins(sdk.NewCoin(app.BondDenom, sdk.NewIntFromUint64(1000))), } + feegrantMsg, err := feegrant.NewMsgGrantAllowance(&basicAllowance, accountAddresses[0], accountAddresses[1]) + require.NoError(t, err) + firstBlockSdkMsgs = append(firstBlockSdkMsgs, feegrantMsg) - // Create a Blob Tx - blobTx := BlobTx{ - author: accountNames[2], - blobs: []*blob.Blob{blob.New(fixedNamespace(), []byte{1}, appconsts.DefaultShareVersion)}, - txOptions: blobfactory.DefaultTxOpts(), + // NewMsgSubmitProposal - submits a proposal to send funds from the governance account to account-1 + govAccount := testApp.GovKeeper.GetGovernanceAccount(testApp.NewContext(false, tmproto.Header{})).GetAddress() + msgSend := banktypes.MsgSend{ + FromAddress: govAccount.String(), + ToAddress: accountAddresses[1].String(), + Amount: amount, } + proposal, err := govtypes.NewMsgSubmitProposal([]sdk.Msg{&msgSend}, amount, accountAddresses[0].String(), "") + require.NoError(t, err) + firstBlockSdkMsgs = append(firstBlockSdkMsgs, proposal) - // Create SDK Tx - rawSdkTx, err := signer.CreateTx(sdkTx.sdkMsgs, sdkTx.txOptions...) + // NewMsgDeposit - deposits funds to a governance proposal + msgDeposit := govtypes.NewMsgDeposit(accountAddresses[0], 1, depositAmount) + firstBlockSdkMsgs = append(firstBlockSdkMsgs, msgDeposit) + + // NewMsgCreateValidator - creates a new validator + msgCreateValidator, err := stakingtypes.NewMsgCreateValidator(sdk.ValAddress(accountAddresses[6]), + ed25519.GenPrivKeyFromSecret([]byte("validator")).PubKey(), + amount[0], + stakingtypes.NewDescription("taco tuesday", "my keybase", "www.celestia.org", "ping @celestiaorg on twitter", "fake validator"), + stakingtypes.NewCommissionRates(sdk.NewDecWithPrec(6, 0o2), sdk.NewDecWithPrec(12, 0o2), sdk.NewDecWithPrec(1, 0o2)), + sdk.OneInt()) require.NoError(t, err) + firstBlockSdkMsgs = append(firstBlockSdkMsgs, msgCreateValidator) + + // NewMsgDelegate - delegates funds to validator-0 + msgDelegate := stakingtypes.NewMsgDelegate(accountAddresses[0], genValidators[0].GetOperator(), amount[0]) + firstBlockSdkMsgs = append(firstBlockSdkMsgs, msgDelegate) + + // NewMsgBeginRedelegate - re-delegates funds from validator-0 to validator-1 + msgBeginRedelegate := stakingtypes.NewMsgBeginRedelegate(accountAddresses[0], genValidators[0].GetOperator(), genValidators[1].GetOperator(), amount[0]) + firstBlockSdkMsgs = append(firstBlockSdkMsgs, msgBeginRedelegate) + + // ------------ Second Block ------------ + + var secondBlockSdkMsgs []sdk.Msg + + // NewMsgVote - votes yes on a governance proposal + msgVote := govtypes.NewMsgVote(accountAddresses[0], 1, govtypes.VoteOption_VOTE_OPTION_YES, "") + secondBlockSdkMsgs = append(secondBlockSdkMsgs, msgVote) + + // NewMsgRevoke - revokes authorization from account-1 + msgRevoke := authz.NewMsgRevoke( + accountAddresses[0], + accountAddresses[1], + blobtypes.URLMsgPayForBlobs, + ) + + // NewMsgExec - executes the revoke authorization message + msgExec := authz.NewMsgExec(accountAddresses[0], []sdk.Msg{&msgRevoke}) + secondBlockSdkMsgs = append(secondBlockSdkMsgs, &msgExec) + + // NewMsgVoteWeighted - votes with a weighted vote + msgVoteWeighted := govtypes.NewMsgVoteWeighted( + accountAddresses[0], + 1, + govtypes.WeightedVoteOptions([]*govtypes.WeightedVoteOption{{Option: govtypes.OptionYes, Weight: "1.0"}}), // Cast the slice to the expected type + "", + ) + secondBlockSdkMsgs = append(secondBlockSdkMsgs, msgVoteWeighted) + + // NewMsgEditValidator - edits the newly created validator's description + msgEditValidator := stakingtypes.NewMsgEditValidator(sdk.ValAddress(accountAddresses[6]), stakingtypes.NewDescription("add", "new", "val", "desc", "."), nil, &twoInt) + secondBlockSdkMsgs = append(secondBlockSdkMsgs, msgEditValidator) + + // NewMsgUndelegate - undelegates funds from validator-1 + msgUndelegate := stakingtypes.NewMsgUndelegate(accountAddresses[0], genValidators[1].GetOperator(), amount[0]) + secondBlockSdkMsgs = append(secondBlockSdkMsgs, msgUndelegate) + + // NewMsgDelegate - delegates funds to validator-0 + msgDelegate = stakingtypes.NewMsgDelegate(accountAddresses[0], genValidators[0].GetOperator(), amount[0]) + secondBlockSdkMsgs = append(secondBlockSdkMsgs, msgDelegate) + + // Block 2 height + blockHeight := testApp.LastBlockHeight() + 2 + // NewMsgCancelUnbondingDelegation - cancels unbonding delegation from validator-1 + msgCancelUnbondingDelegation := stakingtypes.NewMsgCancelUnbondingDelegation(accountAddresses[0], genValidators[1].GetOperator(), blockHeight, amount[0]) + secondBlockSdkMsgs = append(secondBlockSdkMsgs, msgCancelUnbondingDelegation) + + // NewMsgSetWithdrawAddress - sets the withdraw address for account-0 + msgSetWithdrawAddress := distribution.NewMsgSetWithdrawAddress(accountAddresses[0], accountAddresses[1]) + secondBlockSdkMsgs = append(secondBlockSdkMsgs, msgSetWithdrawAddress) - // Create Blob Tx - rawBlobTx, _, err := signer.CreatePayForBlobs(blobTx.author, blobTx.blobs, blobTx.txOptions...) + // NewMsgRevokeAllowance - revokes the allowance granted to account-1 + msgRevokeAllowance := feegrant.NewMsgRevokeAllowance(accountAddresses[0], accountAddresses[1]) + secondBlockSdkMsgs = append(secondBlockSdkMsgs, &msgRevokeAllowance) + + // NewMsgFundCommunityPool - funds the community pool + msgFundCommunityPool := distribution.NewMsgFundCommunityPool(amount, accountAddresses[0]) + secondBlockSdkMsgs = append(secondBlockSdkMsgs, msgFundCommunityPool) + + // NewMsgWithdrawDelegatorReward - withdraws delegator rewards + msgWithdrawDelegatorReward := distribution.NewMsgWithdrawDelegatorReward(accountAddresses[0], genValidators[0].GetOperator()) + secondBlockSdkMsgs = append(secondBlockSdkMsgs, msgWithdrawDelegatorReward) + + // ------------ Third Block ------------ + + // Txs within the third block are signed by the validator's signer + var thirdBlockSdkMsgs []sdk.Msg + + // NewMsgWithdrawValidatorCommission - withdraws validator-0's commission + msgWithdrawValidatorCommission := distribution.NewMsgWithdrawValidatorCommission(genValidators[0].GetOperator()) + thirdBlockSdkMsgs = append(thirdBlockSdkMsgs, msgWithdrawValidatorCommission) + + // NewMsgUnjail - unjails validator-3 + msgUnjail := slashingtypes.NewMsgUnjail(genValidators[3].GetOperator()) + thirdBlockSdkMsgs = append(thirdBlockSdkMsgs, msgUnjail) + + // ------------ Construct Txs ------------ + + // Create SDK transactions from the list of messages + // and separate them into 3 different blocks + firstBlockEncodedTxs, err := processSdkMessages(signer, firstBlockSdkMsgs) require.NoError(t, err) - // BeginBlock - header := tmproto.Header{ - Version: version.Consensus{App: 1}, - Height: testApp.LastBlockHeight() + 1, - } - testApp.BeginBlock(abci.RequestBeginBlock{Header: header}) + secondBlockEncodedTxs, err := processSdkMessages(signer, secondBlockSdkMsgs) + require.NoError(t, err) - // Deliver SDK Tx - resp := testApp.DeliverTx(abci.RequestDeliverTx{Tx: rawSdkTx}) - require.EqualValues(t, 0, resp.Code, resp.Log) + thirdBlockEncodedTxs, err := processSdkMessages(valSigner, thirdBlockSdkMsgs) + require.NoError(t, err) - // Deliver Blob Tx - blob, isBlobTx := blob.UnmarshalBlobTx(rawBlobTx) - require.True(t, isBlobTx) - resp = testApp.DeliverTx(abci.RequestDeliverTx{Tx: blob.Tx}) - require.EqualValues(t, 0, resp.Code, resp.Log) + // Create a Blob Tx + blobTx := BlobTx{ + author: accountNames[1], + blobs: []*blob.Blob{blob.New(fixedNamespace(), []byte{1}, appconsts.DefaultShareVersion)}, + txOptions: blobfactory.DefaultTxOpts(), + } + encodedBlobTx, _, err := signer.CreatePayForBlobs(blobTx.author, blobTx.blobs, blobTx.txOptions...) + require.NoError(t, err) - // EndBlock - testApp.EndBlock(abci.RequestEndBlock{Height: header.Height}) + // Convert validators to ABCI validators + abciValidators, err := convertToABCIValidators(genValidators) + require.NoError(t, err) - // Commit the state - testApp.Commit() + // Execute the first block + _, firstBlockAppHash, err := executeTxs(testApp, []byte{}, firstBlockEncodedTxs, abciValidators, testApp.LastCommitID().Hash) + require.NoError(t, err) - // Get the app hash - appHash := testApp.LastCommitID().Hash + // Execute the second block + _, secondBlockAppHash, err := executeTxs(testApp, encodedBlobTx, secondBlockEncodedTxs, abciValidators, firstBlockAppHash) + require.NoError(t, err) + + // Execute the final block and get the data root alongside the final app hash + finalDataRoot, finalAppHash, err := executeTxs(testApp, []byte{}, thirdBlockEncodedTxs, abciValidators, secondBlockAppHash) + require.NoError(t, err) // Require that the app hash is equal to the app hash produced on a different commit - require.Equal(t, expectedAppHash, appHash) + require.Equal(t, expectedAppHash, finalAppHash) + // Require that the data root is equal to the data root produced on a different commit + require.Equal(t, expectedDataRoot, finalDataRoot) } // fixedNamespace returns a hardcoded namespace @@ -171,3 +337,144 @@ func deterministicKeyRing(cdc codec.Codec) (keyring.Keyring, []types.PubKey) { } return kb, pubKeys } + +// processSdkMessages takes a list of sdk messages, forms transactions, signs them +// and returns a list of encoded transactions +func processSdkMessages(signer *user.Signer, sdkMessages []sdk.Msg) ([][]byte, error) { + encodedTxs := make([][]byte, 0, len(sdkMessages)) + for _, msg := range sdkMessages { + encodedTx, err := signer.CreateTx([]sdk.Msg{msg}, blobfactory.DefaultTxOpts()...) + if err != nil { + return nil, err + } + + signerAddress := msg.GetSigners()[0] + signerAccount := signer.AccountByAddress(signerAddress) + err = signer.SetSequence(signerAccount.Name(), signerAccount.Sequence()+1) + if err != nil { + return nil, err + } + + encodedTxs = append(encodedTxs, encodedTx) + } + return encodedTxs, nil +} + +// executeTxs executes a set of transactions and returns the data hash and app hash +func executeTxs(testApp *app.App, encodedBlobTx []byte, encodedSdkTxs [][]byte, validators []abci.Validator, lastCommitHash []byte) ([]byte, []byte, error) { + height := testApp.LastBlockHeight() + 1 + chainID := testApp.GetChainID() + + genesisTime := testutil.GenesisTime + + // Prepare Proposal + resPrepareProposal := testApp.PrepareProposal(abci.RequestPrepareProposal{ + BlockData: &tmproto.Data{ + Txs: encodedSdkTxs, + }, + ChainId: chainID, + Height: height, + // Dynamically increase time so the validator can be unjailed (1m duration) + Time: genesisTime.Add(time.Duration(height) * time.Minute), + }) + + dataHash := resPrepareProposal.BlockData.Hash + + header := tmproto.Header{ + Version: version.Consensus{App: 1}, + DataHash: resPrepareProposal.BlockData.Hash, + ChainID: chainID, + Time: genesisTime.Add(time.Duration(height) * time.Minute), + Height: height, + LastCommitHash: lastCommitHash, + } + + // Process Proposal + resProcessProposal := testApp.ProcessProposal(abci.RequestProcessProposal{ + BlockData: resPrepareProposal.BlockData, + Header: header, + }, + ) + if abci.ResponseProcessProposal_ACCEPT != resProcessProposal.Result { + return nil, nil, fmt.Errorf("ProcessProposal failed: %v", resProcessProposal.Result) + } + + // Begin block + validator3Signed := height == 2 // Validator 3 signs only the first block + testApp.BeginBlock(abci.RequestBeginBlock{ + Header: header, + LastCommitInfo: abci.LastCommitInfo{ + Votes: []abci.VoteInfo{ + // In order to withdraw commission for this validator + { + Validator: validators[0], + SignedLastBlock: true, + }, + // In order to jail this validator + { + Validator: validators[3], + SignedLastBlock: validator3Signed, + }, + }, + }, + }) + + // Deliver SDK Txs + for i, tx := range encodedSdkTxs { + resp := testApp.DeliverTx(abci.RequestDeliverTx{Tx: tx}) + if resp.Code != abci.CodeTypeOK { + return nil, nil, fmt.Errorf("DeliverTx failed for the message at index %d: %s", i, resp.Log) + } + } + + // Deliver Blob Txs + if len(encodedBlobTx) != 0 { + // Deliver Blob Tx + blob, isBlobTx := blob.UnmarshalBlobTx(encodedBlobTx) + if !isBlobTx { + return nil, nil, fmt.Errorf("Not a valid BlobTx") + } + + respDeliverTx := testApp.DeliverTx(abci.RequestDeliverTx{Tx: blob.Tx}) + if respDeliverTx.Code != uint32(0) { + return nil, nil, fmt.Errorf("DeliverTx failed for the BlobTx: %s", respDeliverTx.Log) + } + } + + // EndBlock + testApp.EndBlock(abci.RequestEndBlock{Height: header.Height}) + + // Commit the state + testApp.Commit() + + // Get the app hash + appHash := testApp.LastCommitID().Hash + + return dataHash, appHash, nil +} + +// createAccounts creates a list of user.Accounts from a list of accountInfos +func createAccounts(accountInfos []blobfactory.AccountInfo, accountNames []string) []*user.Account { + accounts := make([]*user.Account, 0, len(accountInfos)) + for i, accountInfo := range accountInfos { + account := user.NewAccount(accountNames[i], accountInfo.AccountNum, accountInfo.Sequence) + accounts = append(accounts, account) + } + return accounts +} + +// convertToABCIValidators converts a list of staking.Validator to a list of abci.Validator +func convertToABCIValidators(genValidators []stakingtypes.Validator) ([]abci.Validator, error) { + abciValidators := make([]abci.Validator, 0, len(genValidators)) + for _, val := range genValidators { + consAddr, err := val.GetConsAddr() + if err != nil { + return nil, err + } + abciValidators = append(abciValidators, abci.Validator{ + Address: consAddr, + Power: 100, + }) + } + return abciValidators, nil +} diff --git a/test/util/common.go b/test/util/common.go index b969400c2c..e4fa050661 100644 --- a/test/util/common.go +++ b/test/util/common.go @@ -40,6 +40,7 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" gethcommon "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/require" + tmed "github.com/tendermint/tendermint/crypto/ed25519" "github.com/tendermint/tendermint/libs/log" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" tmversion "github.com/tendermint/tendermint/proto/tendermint/version" @@ -59,6 +60,33 @@ var ( MinCommissionRate: sdk.NewDecWithPrec(0, 0), } + // HardcodedConsensusPrivKeys + FixedConsensusPrivKeys = []tmed.PrivKey{ + tmed.GenPrivKeyFromSecret([]byte("12345678901234567890123456389012")), + tmed.GenPrivKeyFromSecret([]byte("12345678901234567890123456389013")), + tmed.GenPrivKeyFromSecret([]byte("12345678901234567890123456389014")), + tmed.GenPrivKeyFromSecret([]byte("12345678901234567890123456389015")), + tmed.GenPrivKeyFromSecret([]byte("12345678901234567890123456389016")), + } + + FixedNetworkPrivKeys = []tmed.PrivKey{ + tmed.GenPrivKeyFromSecret([]byte("12345678901234567890123456786012")), + tmed.GenPrivKeyFromSecret([]byte("12345678901234567890123456786013")), + tmed.GenPrivKeyFromSecret([]byte("12345678901234567890123456786014")), + tmed.GenPrivKeyFromSecret([]byte("12345678901234567890123456786015")), + tmed.GenPrivKeyFromSecret([]byte("12345678901234567890123456786016")), + } + + // FixedMnemonics is a set of fixed mnemonics for testing. + // Account names are: validator1, validator2, validator3, validator4, validator5 + FixedMnemonics = []string{ + "body world north giggle crop reduce height copper damp next verify orphan lens loan adjust inform utility theory now ranch motion opinion crowd fun", + "body champion street fat bone above office guess waste vivid gift around approve elevator depth fiber alarm usual skirt like organ space antique silk", + "cheap alpha render punch clap prize duty drive steel situate person radar smooth elegant over chronic wait danger thumb soft letter spatial acquire rough", + "outdoor ramp suspect office disagree world attend vanish small wish capable fall wall soon damp session emotion chest toss viable meat host clerk truth", + "ability evidence casino cram weasel chest brush bridge sister blur onion found glad own mansion amateur expect force fun dragon famous alien appear open", + } + // ConsPrivKeys generate ed25519 ConsPrivKeys to be used for validator operator keys ConsPrivKeys = []ccrypto.PrivKey{ ed25519.GenPrivKey(), diff --git a/test/util/genesis/modifier.go b/test/util/genesis/modifier.go index 20c62fb768..b7a419b848 100644 --- a/test/util/genesis/modifier.go +++ b/test/util/genesis/modifier.go @@ -13,6 +13,7 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" v1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" + slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" ) // Modifier allows for arbitrary changes to be made on the genesis state @@ -30,6 +31,16 @@ func SetBlobParams(codec codec.Codec, params blobtypes.Params) Modifier { } } +// SetSlashingParams will set the provided slashing params as genesis state. +func SetSlashingParams(codec codec.Codec, parans slashingtypes.Params) Modifier { + return func(state map[string]json.RawMessage) map[string]json.RawMessage { + slashingGenState := slashingtypes.DefaultGenesisState() + slashingGenState.Params = parans + state[slashingtypes.ModuleName] = codec.MustMarshalJSON(slashingGenState) + return state + } +} + // ImmediateProposals sets the thresholds for getting a gov proposal to very low // levels. func ImmediateProposals(codec codec.Codec) Modifier { diff --git a/test/util/test_app.go b/test/util/test_app.go index e1d50722e2..a4ca8e6208 100644 --- a/test/util/test_app.go +++ b/test/util/test_app.go @@ -36,11 +36,14 @@ import ( tmtypes "github.com/tendermint/tendermint/types" dbm "github.com/tendermint/tm-db" + slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ) const ChainID = testfactory.ChainID +var GenesisTime = time.Date(2023, 1, 1, 1, 1, 1, 1, time.UTC).UTC() + // Get flags every time the simulator is run func init() { simapp.GetSimulatorFlags() @@ -96,13 +99,16 @@ func NewTestApp() *app.App { // SetupDeterministicGenesisState sets genesis on initialized testApp with the provided arguments. func SetupDeterministicGenesisState(testApp *app.App, pubKeys []cryptotypes.PubKey, balance int64, cparams *tmproto.ConsensusParams) (keyring.Keyring, []genesis.Account, error) { - // create genesis + slashingParams := slashingtypes.NewParams(2, sdk.OneDec(), time.Minute, sdk.OneDec(), sdk.OneDec()) + + // Create genesis gen := genesis.NewDefaultGenesis(). WithChainID(ChainID). WithConsensusParams(cparams). - WithGenesisTime(time.Date(2023, 1, 1, 1, 1, 1, 1, time.UTC).UTC()) + WithModifiers(genesis.SetSlashingParams(testApp.AppCodec(), slashingParams)). + WithGenesisTime(GenesisTime) - // add accounts to genesis + // Add accounts to genesis for i, pk := range pubKeys { err := gen.AddAccount(genesis.Account{ PubKey: pk, @@ -114,8 +120,8 @@ func SetupDeterministicGenesisState(testApp *app.App, pubKeys []cryptotypes.PubK } } - // add validator to genesis - err := AddDeterministicValidatorToGenesis(gen) + // Add validators to genesis + err := AddDeterministicValidatorsToGenesis(gen) if err != nil { return nil, nil, fmt.Errorf("failed to add validator: %w", err) } @@ -125,12 +131,12 @@ func SetupDeterministicGenesisState(testApp *app.App, pubKeys []cryptotypes.PubK return nil, nil, fmt.Errorf("failed to export genesis doc: %w", err) } - // initialise test app against genesis + // Initialise test app against genesis testApp.Info(abci.RequestInfo{}) abciParams := &abci.ConsensusParams{ Block: &abci.BlockParams{ - // choose some value large enough to not bottleneck the max square + // Choose some value large enough to not bottleneck the max square // size MaxBytes: int64(appconsts.DefaultSquareSizeUpperBound*appconsts.DefaultSquareSizeUpperBound) * appconsts.ContinuationSparseShareContentSize, MaxGas: cparams.Block.MaxGas, @@ -140,7 +146,7 @@ func SetupDeterministicGenesisState(testApp *app.App, pubKeys []cryptotypes.PubK Version: &cparams.Version, } - // init chain will set the validator set and initialize the genesis accounts + // Init chain will set the validator set and initialize the genesis accounts testApp.InitChain( abci.RequestInitChain{ Time: gen.GenesisTime, @@ -151,7 +157,7 @@ func SetupDeterministicGenesisState(testApp *app.App, pubKeys []cryptotypes.PubK }, ) - // commit genesis changes + // Commit genesis changes testApp.Commit() testApp.BeginBlock(abci.RequestBeginBlock{Header: tmproto.Header{ ChainID: ChainID, @@ -189,14 +195,12 @@ func NewTestAppWithGenesisSet(cparams *tmproto.ConsensusParams, genAccounts ...s Version: &cparams.Version, } - genesisTime := time.Date(2023, 1, 1, 1, 1, 1, 1, time.UTC).UTC() - testApp.Info(abci.RequestInfo{}) // init chain will set the validator set and initialize the genesis accounts testApp.InitChain( abci.RequestInitChain{ - Time: genesisTime, + Time: GenesisTime, Validators: []abci.ValidatorUpdate{}, ConsensusParams: abciParams, AppStateBytes: stateBytes, @@ -206,47 +210,47 @@ func NewTestAppWithGenesisSet(cparams *tmproto.ConsensusParams, genAccounts ...s return testApp, valSet, kr } -// AddDeterministicValidatorToGenesis adds a single deterministic validator to the genesis. -func AddDeterministicValidatorToGenesis(g *genesis.Genesis) error { - // hardcoded keys for deterministic account creation - mnemo := "body world north giggle crop reduce height copper damp next verify orphan lens loan adjust inform utility theory now ranch motion opinion crowd fun" - consensusKey := ed25519.GenPrivKeyFromSecret([]byte("12345678901234567890123456389012")) - networkKey := ed25519.GenPrivKeyFromSecret([]byte("12345678901234567890123456786012")) - - val := genesis.Validator{ - KeyringAccount: genesis.KeyringAccount{ - Name: "validator1", - InitialTokens: 1_000_000_000, - }, - Stake: 1_000_000, - ConsensusKey: consensusKey, - NetworkKey: networkKey, - } +// AddDeterministicValidatorToGenesis adds a set of five validators to the genesis. +func AddDeterministicValidatorsToGenesis(g *genesis.Genesis) error { + for i := range FixedMnemonics { + val := genesis.Validator{ + KeyringAccount: genesis.KeyringAccount{ + Name: "validator" + fmt.Sprint(i), + InitialTokens: 5_000_000_000, + }, + Stake: 1_000_000_000, + ConsensusKey: FixedConsensusPrivKeys[i], + NetworkKey: FixedNetworkPrivKeys[i], + } - // initialize the validator's genesis account in the keyring - rec, err := g.Keyring().NewAccount(val.Name, mnemo, "", "", hd.Secp256k1) - if err != nil { - return fmt.Errorf("failed to create account: %w", err) - } + // Initialize the validator's genesis account in the keyring + rec, err := g.Keyring().NewAccount(val.Name, FixedMnemonics[i], "", "", hd.Secp256k1) + if err != nil { + return fmt.Errorf("failed to create account: %w", err) + } - validatorPubKey, err := rec.GetPubKey() - if err != nil { - return fmt.Errorf("failed to get pubkey: %w", err) - } + validatorPubKey, err := rec.GetPubKey() + if err != nil { + return fmt.Errorf("failed to get pubkey: %w", err) + } - // make account from keyring account - account := genesis.Account{ - PubKey: validatorPubKey, - Balance: val.KeyringAccount.InitialTokens, - Name: val.Name, - } + // Construct account from keyring account + account := genesis.Account{ + PubKey: validatorPubKey, + Balance: val.KeyringAccount.InitialTokens, + Name: val.Name, + } - // add the validator's account to the genesis - if err := g.AddAccount(account); err != nil { - return fmt.Errorf("failed to add account: %w", err) + // Add the validator's account to the genesis + if err := g.AddAccount(account); err != nil { + return fmt.Errorf("failed to add account: %w", err) + } + if err := g.AddValidator(val); err != nil { + return fmt.Errorf("failed to add validator: %w", err) + } } - return g.AddValidator(val) + return nil } // AddAccount mimics the cli addAccount command, providing an diff --git a/test/util/testfactory/common.go b/test/util/testfactory/common.go index 8edb003aa8..a25a9002b8 100644 --- a/test/util/testfactory/common.go +++ b/test/util/testfactory/common.go @@ -71,15 +71,28 @@ func GetAddresses(keys keyring.Keyring) []sdk.AccAddress { panic(err) } addresses := make([]sdk.AccAddress, 0, len(recs)) - for idx, rec := range recs { - addresses[idx], err = rec.GetAddress() + for _, rec := range recs { + address, err := rec.GetAddress() if err != nil { panic(err) } + addresses = append(addresses, address) } return addresses } +func GetAccountNames(keys keyring.Keyring) []string { + recs, err := keys.List() + if err != nil { + panic(err) + } + names := make([]string, 0, len(recs)) + for _, rec := range recs { + names = append(names, rec.Name) + } + return names +} + func GetAddress(keys keyring.Keyring, account string) sdk.AccAddress { rec, err := keys.Key(account) if err != nil { From cd6cc13123df9e4cc79bc3f61db52c7b4a5a537e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nina=20/=20=E1=83=9C=E1=83=98=E1=83=9C=E1=83=90?= Date: Tue, 23 Jul 2024 15:02:24 +0200 Subject: [PATCH 34/40] test: pfm integration (#3694) ## Overview Fixes #3651 --- go.mod | 2 +- test/pfm/pfm_test.go | 237 ++++++++++++ test/pfm/setup.go | 226 ++++++++++++ test/pfm/simapp.go | 856 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 1320 insertions(+), 1 deletion(-) create mode 100644 test/pfm/pfm_test.go create mode 100644 test/pfm/setup.go create mode 100644 test/pfm/simapp.go diff --git a/go.mod b/go.mod index ee75956951..c1fa89836e 100644 --- a/go.mod +++ b/go.mod @@ -22,6 +22,7 @@ require ( github.com/golang/protobuf v1.5.4 github.com/gorilla/mux v1.8.1 github.com/grpc-ecosystem/grpc-gateway v1.16.0 + github.com/rakyll/statik v0.1.7 github.com/rs/zerolog v1.33.0 github.com/spf13/cast v1.6.0 github.com/spf13/cobra v1.8.0 @@ -182,7 +183,6 @@ require ( github.com/prometheus/client_model v0.6.0 // indirect github.com/prometheus/common v0.53.0 // indirect github.com/prometheus/procfs v0.12.0 // indirect - github.com/rakyll/statik v0.1.7 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/regen-network/cosmos-proto v0.3.1 // indirect github.com/rivo/uniseg v0.4.4 // indirect diff --git a/test/pfm/pfm_test.go b/test/pfm/pfm_test.go new file mode 100644 index 0000000000..db83ea59d3 --- /dev/null +++ b/test/pfm/pfm_test.go @@ -0,0 +1,237 @@ +package pfm + +import ( + "bytes" + "encoding/json" + "errors" + "testing" + "time" + + "github.com/celestiaorg/celestia-app/v2/app" + utils "github.com/celestiaorg/celestia-app/v2/test/tokenfilter" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/ibc-go/v6/modules/apps/transfer/types" + clienttypes "github.com/cosmos/ibc-go/v6/modules/core/02-client/types" + channeltypes "github.com/cosmos/ibc-go/v6/modules/core/04-channel/types" + host "github.com/cosmos/ibc-go/v6/modules/core/24-host" + ibctesting "github.com/cosmos/ibc-go/v6/testing" + "github.com/stretchr/testify/require" +) + +type PacketMetadata struct { + Forward *ForwardMetadata `json:"forward"` +} + +type ForwardMetadata struct { + Receiver string `json:"receiver"` + Port string `json:"port"` + Channel string `json:"channel"` + Timeout time.Duration `json:"timeout"` + Retries *uint8 `json:"retries,omitempty"` + Next *string `json:"next,omitempty"` + RefundSequence *uint64 `json:"refund_sequence,omitempty"` +} + +func SetupTest(t *testing.T) (*ibctesting.Coordinator, *ibctesting.TestChain, + *ibctesting.TestChain, *ibctesting.TestChain, +) { + chains := make(map[string]*ibctesting.TestChain) + coordinator := &ibctesting.Coordinator{ + T: t, + CurrentTime: time.Now(), + Chains: chains, + } + celestiaChain := utils.NewTestChain(t, coordinator, ibctesting.GetChainID(1)) + chainA := NewTestChain(t, coordinator, ibctesting.GetChainID(2)) + chainB := NewTestChain(t, coordinator, ibctesting.GetChainID(3)) + coordinator.Chains[ibctesting.GetChainID(1)] = celestiaChain + coordinator.Chains[ibctesting.GetChainID(2)] = chainA + coordinator.Chains[ibctesting.GetChainID(3)] = chainB + return coordinator, chainA, celestiaChain, chainB +} + +func NewTransferPaths(chain1, chain2, chain3 *ibctesting.TestChain) (*ibctesting.Path, *ibctesting.Path) { + path1 := ibctesting.NewPath(chain1, chain2) + path1.EndpointA.ChannelConfig.PortID = ibctesting.TransferPort + path1.EndpointB.ChannelConfig.PortID = ibctesting.TransferPort + path1.EndpointA.ChannelConfig.Version = types.Version + path1.EndpointB.ChannelConfig.Version = types.Version + path2 := ibctesting.NewPath(chain2, chain3) + path2.EndpointA.ChannelConfig.PortID = ibctesting.TransferPort + path2.EndpointB.ChannelConfig.PortID = ibctesting.TransferPort + path2.EndpointA.ChannelConfig.Version = types.Version + path2.EndpointB.ChannelConfig.Version = types.Version + + return path1, path2 +} + +// TestPacketForwardMiddlewareTransfer sends a PFM transfer originating from Celestia to ChainA, then back to Celestia and finally to ChainB. +// It verifies that Celestia forwards the packet successfully, the balance of the sender account on Celestia decreases by the amount sent, +// and the balance of the receiver account on ChainB increases by the amount sent. +func TestPacketForwardMiddlewareTransfer(t *testing.T) { + coordinator, chainA, celestia, chainB := SetupTest(t) + path1, path2 := NewTransferPaths(chainA, celestia, chainB) + + coordinator.Setup(path1) + coordinator.Setup(path2) + + celestiaApp := celestia.App.(*app.App) + originalCelestiaBalalance := celestiaApp.BankKeeper.GetBalance(celestia.GetContext(), celestia.SenderAccount.GetAddress(), sdk.DefaultBondDenom) + + // Take half of the original balance + transferAmount := originalCelestiaBalalance.Amount.QuoRaw(2) + timeoutHeight := clienttypes.NewHeight(1, 300) + coinToSendToB := sdk.NewCoin(sdk.DefaultBondDenom, transferAmount) + + // Forward the packet to ChainB + secondHopMetaData := &PacketMetadata{ + Forward: &ForwardMetadata{ + Receiver: chainB.SenderAccount.GetAddress().String(), + Channel: path2.EndpointA.ChannelID, + Port: path2.EndpointA.ChannelConfig.PortID, + }, + } + nextBz, err := json.Marshal(secondHopMetaData) + require.NoError(t, err) + next := string(nextBz) + + // Send it back to Celestia + firstHopMetaData := &PacketMetadata{ + Forward: &ForwardMetadata{ + Receiver: celestia.SenderAccount.GetAddress().String(), + Channel: path1.EndpointA.ChannelID, + Port: path1.EndpointA.ChannelConfig.PortID, + Next: &next, + }, + } + memo, err := json.Marshal(firstHopMetaData) + require.NoError(t, err) + + // Transfer path: Celestia -> ChainA -> Celestia -> ChainB + msg := types.NewMsgTransfer(path1.EndpointB.ChannelConfig.PortID, path1.EndpointB.ChannelID, coinToSendToB, celestia.SenderAccount.GetAddress().String(), chainA.SenderAccount.GetAddress().String(), timeoutHeight, 0, string(memo)) + + res, err := celestia.SendMsgs(msg) + require.NoError(t, err) + + packet, err := ibctesting.ParsePacketFromEvents(res.GetEvents()) + require.NoError(t, err) + + err = ForwardPacket([]*ibctesting.Path{path1, path1, path2}, packet) + require.NoError(t, err) + + sourceBalanceAfter := celestiaApp.BankKeeper.GetBalance(celestia.GetContext(), celestia.SenderAccount.GetAddress(), sdk.DefaultBondDenom) + require.Equal(t, originalCelestiaBalalance.Amount.Sub(transferAmount), sourceBalanceAfter.Amount) + + ibcDenomTrace := types.ParseDenomTrace(types.GetPrefixedDenom(packet.GetDestPort(), packet.GetDestChannel(), sdk.DefaultBondDenom)) + destinationBalanceAfter := chainB.App.(*SimApp).BankKeeper.GetBalance(chainB.GetContext(), chainB.SenderAccount.GetAddress(), ibcDenomTrace.IBCDenom()) + + require.Equal(t, transferAmount, destinationBalanceAfter.Amount) +} + +// isPacketToEndpoint checks if a packet is meant for the specified endpoint +func isPacketToEndpoint(endpoint *ibctesting.Endpoint, packet channeltypes.Packet) bool { + pc := endpoint.Chain.App.GetIBCKeeper().ChannelKeeper.GetPacketCommitment(endpoint.Chain.GetContext(), packet.GetSourcePort(), packet.GetSourceChannel(), packet.GetSequence()) + return bytes.Equal(pc, channeltypes.CommitPacket(endpoint.Chain.App.AppCodec(), packet)) +} + +// relayPacket submits packet to an endpoint and returns either the acknowledgement or another packet +func relayPacket(endpoint *ibctesting.Endpoint, packet channeltypes.Packet) (channeltypes.Packet, []byte, error) { + if err := endpoint.UpdateClient(); err != nil { + return channeltypes.Packet{}, nil, err + } + + res, err := endpoint.RecvPacketWithResult(packet) + if err != nil { + return channeltypes.Packet{}, nil, err + } + + ack, err := ibctesting.ParseAckFromEvents(res.GetEvents()) + if err != nil { + packet, err = ibctesting.ParsePacketFromEvents(res.GetEvents()) + if err != nil { + return channeltypes.Packet{}, nil, err + } + return packet, nil, nil + } + + return packet, ack, nil +} + +// ForwardPacket forwards a packet through a series of paths and routes the acknowledgement back +func ForwardPacket(paths []*ibctesting.Path, packet channeltypes.Packet) error { + if len(paths) < 2 { + return errors.New("path must have at least two hops to forward packet") + } + + var ( + ack []byte + rewindEndpoints = make([]*ibctesting.Endpoint, len(paths)) + packets = make([]channeltypes.Packet, len(paths)) + ) + + // Relay the packet through the paths and store the packets and acknowledgements + packets[0] = packet + for idx, path := range paths { + switch { + case isPacketToEndpoint(path.EndpointA, packets[idx]): + packet, packetAck, err := relayPacket(path.EndpointB, packets[idx]) + if err != nil { + return err + } + if len(packetAck) == 0 { + packets[idx+1] = packet + } else { + ack = packetAck + } + rewindEndpoints[idx] = path.EndpointA + case isPacketToEndpoint(path.EndpointB, packets[idx]): + packet, packetAck, err := relayPacket(path.EndpointA, packets[idx]) + if err != nil { + return err + } + if len(packetAck) == 0 { + packets[idx+1] = packet + } else { + ack = packetAck + } + rewindEndpoints[idx] = path.EndpointB + default: + return errors.New("packet is for neither endpoint A nor endpoint B") + } + } + + if len(ack) == 0 { + return errors.New("no acknowledgement received from the last packet") + } + + // Now we route the acknowledgements back + for i := len(rewindEndpoints) - 1; i >= 0; i-- { + if err := rewindEndpoints[i].UpdateClient(); err != nil { + return err + } + + res, err := AcknowledgePacket(rewindEndpoints[i], packets[i], ack) + if err != nil { + return err + } + // On endpoint at index 0 ack has reached the source chain + // so we no longer need to parse it + if i > 0 { + ack, err = ibctesting.ParseAckFromEvents(res.GetEvents()) + if err != nil { + return err + } + } + rewindEndpoints[i].Chain.Coordinator.CommitBlock() + } + return nil +} + +// AcknowledgePacket acknowledges a packet and returns the result +func AcknowledgePacket(endpoint *ibctesting.Endpoint, packet channeltypes.Packet, ack []byte) (*sdk.Result, error) { + packetKey := host.PacketAcknowledgementKey(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) + proof, proofHeight := endpoint.Counterparty.QueryProof(packetKey) + ackMsg := channeltypes.NewMsgAcknowledgement(packet, ack, proof, proofHeight, endpoint.Chain.SenderAccount.GetAddress().String()) + + return endpoint.Chain.SendMsgs(ackMsg) +} diff --git a/test/pfm/setup.go b/test/pfm/setup.go new file mode 100644 index 0000000000..b46ad35267 --- /dev/null +++ b/test/pfm/setup.go @@ -0,0 +1,226 @@ +package pfm + +import ( + "encoding/json" + "testing" + "time" + + "cosmossdk.io/math" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" + "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + sdk "github.com/cosmos/cosmos-sdk/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + packetforwardtypes "github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v6/packetforward/types" + ibctesting "github.com/cosmos/ibc-go/v6/testing" + "github.com/cosmos/ibc-go/v6/testing/mock" + "github.com/cosmos/ibc-go/v6/testing/simapp" + "github.com/stretchr/testify/require" + abci "github.com/tendermint/tendermint/abci/types" + "github.com/tendermint/tendermint/libs/log" + tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + tmprotoversion "github.com/tendermint/tendermint/proto/tendermint/version" + tmtypes "github.com/tendermint/tendermint/types" + dbm "github.com/tendermint/tm-db" +) + +// NewTestChain initializes a new test chain with a default of 4 validators. +// Use this function if the tests do not need custom control over the validator set. +func NewTestChain(t *testing.T, coord *ibctesting.Coordinator, chainID string) *ibctesting.TestChain { + var ( + validatorsPerChain = 4 + validators []*tmtypes.Validator + signersByAddress = make(map[string]tmtypes.PrivValidator, validatorsPerChain) + ) + + // generate validators private/public key + for i := 0; i < validatorsPerChain; i++ { + privVal := mock.NewPV() + pubKey, err := privVal.GetPubKey() + require.NoError(t, err) + validators = append(validators, tmtypes.NewValidator(pubKey, 1)) + signersByAddress[pubKey.Address().String()] = privVal + } + + // construct validator set; + // Note that the validators are sorted by voting power + // or, if equal, by address lexical order + valSet := tmtypes.NewValidatorSet(validators) + + return NewTestChainWithValSet(t, coord, chainID, valSet, signersByAddress) +} + +func NewTestChainWithValSet(t *testing.T, coord *ibctesting.Coordinator, chainID string, valSet *tmtypes.ValidatorSet, signers map[string]tmtypes.PrivValidator) *ibctesting.TestChain { + genAccs := []authtypes.GenesisAccount{} + genBals := []banktypes.Balance{} + senderAccs := []ibctesting.SenderAccount{} + + // generate genesis accounts + for i := 0; i < ibctesting.MaxAccounts; i++ { + senderPrivKey := secp256k1.GenPrivKey() + acc := authtypes.NewBaseAccount(senderPrivKey.PubKey().Address().Bytes(), senderPrivKey.PubKey(), uint64(i), 0) + amount, ok := sdk.NewIntFromString("10000000000000000000") + require.True(t, ok) + + // add sender account + balance := banktypes.Balance{ + Address: acc.GetAddress().String(), + Coins: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, amount)), + } + + genAccs = append(genAccs, acc) + genBals = append(genBals, balance) + + senderAcc := ibctesting.SenderAccount{ + SenderAccount: acc, + SenderPrivKey: senderPrivKey, + } + + senderAccs = append(senderAccs, senderAcc) + } + + app := SetupWithGenesisValSet(t, valSet, genAccs, chainID, sdk.DefaultPowerReduction, genBals...) + + // create current header and call begin block + header := tmproto.Header{ + Version: tmprotoversion.Consensus{ + App: simapp.DefaultAppVersion, + }, + ChainID: chainID, + Height: 1, + Time: coord.CurrentTime.UTC(), + } + + txConfig := app.GetTxConfig() + + // create an account to send transactions from + chain := &ibctesting.TestChain{ + T: t, + Coordinator: coord, + ChainID: chainID, + App: app, + CurrentHeader: header, + QueryServer: app.GetIBCKeeper(), + TxConfig: txConfig, + Codec: app.AppCodec(), + Vals: valSet, + NextVals: valSet, + Signers: signers, + SenderPrivKey: senderAccs[0].SenderPrivKey, + SenderAccount: senderAccs[0].SenderAccount, + SenderAccounts: senderAccs, + } + + coord.CommitBlock(chain) + + return chain +} + +// SetupWithGenesisValSet initializes a new SimApp with a validator set and genesis accounts +// that also act as delegators. For simplicity, each validator is bonded with a delegation +// of one consensus engine unit (10^6) in the default token of the simapp from first genesis +// account. A Nop logger is set in SimApp. +func SetupWithGenesisValSet(t *testing.T, valSet *tmtypes.ValidatorSet, genAccs []authtypes.GenesisAccount, chainID string, powerReduction math.Int, balances ...banktypes.Balance) ibctesting.TestingApp { + return SetupWithGenesisValSetAndConsensusParams(t, simapp.DefaultConsensusParams, valSet, genAccs, chainID, powerReduction, balances...) +} + +func SetupWithGenesisValSetAndConsensusParams(t *testing.T, consensusParams *abci.ConsensusParams, valSet *tmtypes.ValidatorSet, genAccs []authtypes.GenesisAccount, chainID string, powerReduction math.Int, balances ...banktypes.Balance) ibctesting.TestingApp { + app, genesisState := SetupTestingApp() + + // set genesis accounts + authGenesis := authtypes.NewGenesisState(authtypes.DefaultParams(), genAccs) + genesisState[authtypes.ModuleName] = app.AppCodec().MustMarshalJSON(authGenesis) + + validators := make([]stakingtypes.Validator, 0, len(valSet.Validators)) + delegations := make([]stakingtypes.Delegation, 0, len(valSet.Validators)) + + bondAmt := sdk.TokensFromConsensusPower(1, powerReduction) + + for _, val := range valSet.Validators { + pk, err := cryptocodec.FromTmPubKeyInterface(val.PubKey) + require.NoError(t, err) + pkAny, err := codectypes.NewAnyWithValue(pk) + require.NoError(t, err) + validator := stakingtypes.Validator{ + OperatorAddress: sdk.ValAddress(val.Address).String(), + ConsensusPubkey: pkAny, + Jailed: false, + Status: stakingtypes.Bonded, + Tokens: bondAmt, + DelegatorShares: sdk.OneDec(), + Description: stakingtypes.Description{}, + UnbondingHeight: int64(0), + UnbondingTime: time.Unix(0, 0).UTC(), + Commission: stakingtypes.NewCommission(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec()), + MinSelfDelegation: sdk.ZeroInt(), + } + + validators = append(validators, validator) + delegations = append(delegations, stakingtypes.NewDelegation(genAccs[0].GetAddress(), val.Address.Bytes(), sdk.OneDec())) + } + + // set validators and delegations + var stakingGenesis stakingtypes.GenesisState + app.AppCodec().MustUnmarshalJSON(genesisState[stakingtypes.ModuleName], &stakingGenesis) + + bondDenom := stakingGenesis.Params.BondDenom + + // add bonded amount to bonded pool module account + balances = append(balances, banktypes.Balance{ + Address: authtypes.NewModuleAddress(stakingtypes.BondedPoolName).String(), + Coins: sdk.Coins{sdk.NewCoin(bondDenom, bondAmt.Mul(sdk.NewInt(int64(len(valSet.Validators)))))}, + }) + + // set validators and delegations + stakingGenesis = *stakingtypes.NewGenesisState(stakingGenesis.Params, validators, delegations) + genesisState[stakingtypes.ModuleName] = app.AppCodec().MustMarshalJSON(&stakingGenesis) + + // update total supply + bankGenesis := banktypes.NewGenesisState(banktypes.DefaultGenesisState().Params, balances, sdk.NewCoins(), []banktypes.Metadata{}) + genesisState[banktypes.ModuleName] = app.AppCodec().MustMarshalJSON(bankGenesis) + + // packet forward + packetForwardGenesis := packetforwardtypes.NewGenesisState(packetforwardtypes.DefaultParams(), nil) + genesisState[packetforwardtypes.ModuleName] = app.AppCodec().MustMarshalJSON(packetForwardGenesis) + + stateBytes, err := json.MarshalIndent(genesisState, "", " ") + require.NoError(t, err) + + // init chain will set the validator set and initialize the genesis accounts + app.InitChain( + abci.RequestInitChain{ + ChainId: chainID, + Validators: []abci.ValidatorUpdate{}, + ConsensusParams: consensusParams, + AppStateBytes: stateBytes, + }, + ) + + // commit genesis changes + app.Commit() + app.BeginBlock( + abci.RequestBeginBlock{ + Header: tmproto.Header{ + Version: tmprotoversion.Consensus{ + App: consensusParams.Version.AppVersion, + }, + ChainID: chainID, + Height: app.LastBlockHeight() + 1, + AppHash: app.LastCommitID().Hash, + ValidatorsHash: valSet.Hash(), + NextValidatorsHash: valSet.Hash(), + }, + }, + ) + + return app +} + +func SetupTestingApp() (ibctesting.TestingApp, map[string]json.RawMessage) { + db := dbm.NewMemDB() + encCdc := simapp.MakeTestEncodingConfig() + app := NewSimApp(log.NewNopLogger(), db, nil, true, map[int64]bool{}, simapp.DefaultNodeHome, 5, encCdc, simapp.EmptyAppOptions{}) + return app, simapp.NewDefaultGenesisState(encCdc.Marshaler) +} diff --git a/test/pfm/simapp.go b/test/pfm/simapp.go new file mode 100644 index 0000000000..f8ed3ae4a2 --- /dev/null +++ b/test/pfm/simapp.go @@ -0,0 +1,856 @@ +package pfm + +import ( + "encoding/json" + "io" + "net/http" + "os" + "path/filepath" + + "github.com/cosmos/cosmos-sdk/baseapp" + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/grpc/tmservice" + "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/server/api" + "github.com/cosmos/cosmos-sdk/server/config" + servertypes "github.com/cosmos/cosmos-sdk/server/types" + storetypes "github.com/cosmos/cosmos-sdk/store/types" + "github.com/cosmos/cosmos-sdk/testutil/testdata" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + "github.com/cosmos/cosmos-sdk/version" + "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/cosmos/cosmos-sdk/x/auth/ante" + authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" + authsims "github.com/cosmos/cosmos-sdk/x/auth/simulation" + authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + "github.com/cosmos/cosmos-sdk/x/auth/vesting" + vestingtypes "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" + authz "github.com/cosmos/cosmos-sdk/x/authz" + authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" + authzmodule "github.com/cosmos/cosmos-sdk/x/authz/module" + "github.com/cosmos/cosmos-sdk/x/bank" + bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + "github.com/cosmos/cosmos-sdk/x/capability" + capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper" + capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" + "github.com/cosmos/cosmos-sdk/x/crisis" + crisiskeeper "github.com/cosmos/cosmos-sdk/x/crisis/keeper" + crisistypes "github.com/cosmos/cosmos-sdk/x/crisis/types" + distr "github.com/cosmos/cosmos-sdk/x/distribution" + distrclient "github.com/cosmos/cosmos-sdk/x/distribution/client" + distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" + distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" + "github.com/cosmos/cosmos-sdk/x/evidence" + evidencekeeper "github.com/cosmos/cosmos-sdk/x/evidence/keeper" + evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" + "github.com/cosmos/cosmos-sdk/x/feegrant" + feegrantkeeper "github.com/cosmos/cosmos-sdk/x/feegrant/keeper" + feegrantmodule "github.com/cosmos/cosmos-sdk/x/feegrant/module" + "github.com/cosmos/cosmos-sdk/x/genutil" + genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" + "github.com/cosmos/cosmos-sdk/x/gov" + govclient "github.com/cosmos/cosmos-sdk/x/gov/client" + govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" + govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" + "github.com/cosmos/cosmos-sdk/x/group" + groupkeeper "github.com/cosmos/cosmos-sdk/x/group/keeper" + groupmodule "github.com/cosmos/cosmos-sdk/x/group/module" + "github.com/cosmos/cosmos-sdk/x/mint" + mintkeeper "github.com/cosmos/cosmos-sdk/x/mint/keeper" + minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" + "github.com/cosmos/cosmos-sdk/x/params" + paramsclient "github.com/cosmos/cosmos-sdk/x/params/client" + paramskeeper "github.com/cosmos/cosmos-sdk/x/params/keeper" + paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" + paramproposal "github.com/cosmos/cosmos-sdk/x/params/types/proposal" + "github.com/cosmos/cosmos-sdk/x/slashing" + slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper" + slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" + "github.com/cosmos/cosmos-sdk/x/staking" + stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + "github.com/cosmos/cosmos-sdk/x/upgrade" + upgradeclient "github.com/cosmos/cosmos-sdk/x/upgrade/client" + upgradekeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper" + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + "github.com/gorilla/mux" + "github.com/rakyll/statik/fs" + "github.com/spf13/cast" + abci "github.com/tendermint/tendermint/abci/types" + "github.com/tendermint/tendermint/libs/log" + tmos "github.com/tendermint/tendermint/libs/os" + dbm "github.com/tendermint/tm-db" + + "github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v6/packetforward" + packetforwardkeeper "github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v6/packetforward/keeper" + packetforwardtypes "github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v6/packetforward/types" + transfer "github.com/cosmos/ibc-go/v6/modules/apps/transfer" + ibctransferkeeper "github.com/cosmos/ibc-go/v6/modules/apps/transfer/keeper" + ibctransfertypes "github.com/cosmos/ibc-go/v6/modules/apps/transfer/types" + ibc "github.com/cosmos/ibc-go/v6/modules/core" + ibcclient "github.com/cosmos/ibc-go/v6/modules/core/02-client" + ibcclientclient "github.com/cosmos/ibc-go/v6/modules/core/02-client/client" + ibcclienttypes "github.com/cosmos/ibc-go/v6/modules/core/02-client/types" + porttypes "github.com/cosmos/ibc-go/v6/modules/core/05-port/types" + ibchost "github.com/cosmos/ibc-go/v6/modules/core/24-host" + ibckeeper "github.com/cosmos/ibc-go/v6/modules/core/keeper" + ibcmock "github.com/cosmos/ibc-go/v6/testing/mock" + simapp "github.com/cosmos/ibc-go/v6/testing/simapp" + simappparams "github.com/cosmos/ibc-go/v6/testing/simapp/params" + simappupgrades "github.com/cosmos/ibc-go/v6/testing/simapp/upgrades" + v6 "github.com/cosmos/ibc-go/v6/testing/simapp/upgrades/v6" + ibctestingtypes "github.com/cosmos/ibc-go/v6/testing/types" +) + +// App implements the common methods for a Cosmos SDK-based application +// specific blockchain. +type App interface { + // The assigned name of the app. + Name() string + + // The application types codec. + // NOTE: This shoult be sealed before being returned. + LegacyAmino() *codec.LegacyAmino + + // Application updates every begin block. + BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock + + // Application updates every end block. + EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock + + // Application update at chain (i.e app) initialization. + InitChainer(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain + + // Loads the app at a given height. + LoadHeight(height int64) error + + // All the registered module account addreses. + ModuleAccountAddrs() map[string]bool + + // Helper for the simulation framework. + SimulationManager() *module.SimulationManager +} + +const appName = "SimApp" + +// IBC application testing ports +const ( + MockFeePort string = ibcmock.ModuleName +) + +var ( + // DefaultNodeHome default home directories for the application daemon + DefaultNodeHome string + + // ModuleBasics defines the module BasicManager is in charge of setting up basic, + // non-dependant module elements, such as codec registration + // and genesis verification. + ModuleBasics = module.NewBasicManager( + auth.AppModuleBasic{}, + genutil.AppModuleBasic{}, + bank.AppModuleBasic{}, + capability.AppModuleBasic{}, + staking.AppModuleBasic{}, + mint.AppModuleBasic{}, + distr.AppModuleBasic{}, + gov.NewAppModuleBasic( + []govclient.ProposalHandler{ + paramsclient.ProposalHandler, + distrclient.ProposalHandler, + upgradeclient.LegacyProposalHandler, + upgradeclient.LegacyCancelProposalHandler, + ibcclientclient.UpdateClientProposalHandler, + ibcclientclient.UpgradeProposalHandler, + }, + ), + groupmodule.AppModuleBasic{}, + params.AppModuleBasic{}, + crisis.AppModuleBasic{}, + slashing.AppModuleBasic{}, + ibc.AppModuleBasic{}, + feegrantmodule.AppModuleBasic{}, + upgrade.AppModuleBasic{}, + evidence.AppModuleBasic{}, + transfer.AppModuleBasic{}, + ibcmock.AppModuleBasic{}, + authzmodule.AppModuleBasic{}, + vesting.AppModuleBasic{}, + packetforward.AppModuleBasic{}, + ) + + // module account permissions + maccPerms = map[string][]string{ + authtypes.FeeCollectorName: nil, + distrtypes.ModuleName: nil, + minttypes.ModuleName: {authtypes.Minter}, + stakingtypes.BondedPoolName: {authtypes.Burner, authtypes.Staking}, + stakingtypes.NotBondedPoolName: {authtypes.Burner, authtypes.Staking}, + govtypes.ModuleName: {authtypes.Burner}, + ibctransfertypes.ModuleName: {authtypes.Minter, authtypes.Burner}, + ibcmock.ModuleName: nil, + } +) + +var ( + _ App = (*SimApp)(nil) + _ servertypes.Application = (*SimApp)(nil) +) + +// SimApp extends an ABCI application, but with most of its parameters exported. +// They are exported for convenience in creating helper functions, as object +// capabilities aren't needed for testing. +type SimApp struct { + *baseapp.BaseApp + legacyAmino *codec.LegacyAmino + appCodec codec.Codec + interfaceRegistry types.InterfaceRegistry + + invCheckPeriod uint + + // keys to access the substores + keys map[string]*storetypes.KVStoreKey + tkeys map[string]*storetypes.TransientStoreKey + memKeys map[string]*storetypes.MemoryStoreKey + + // keepers + AccountKeeper authkeeper.AccountKeeper + BankKeeper bankkeeper.Keeper + CapabilityKeeper *capabilitykeeper.Keeper + StakingKeeper stakingkeeper.Keeper + SlashingKeeper slashingkeeper.Keeper + MintKeeper mintkeeper.Keeper + DistrKeeper distrkeeper.Keeper + GovKeeper govkeeper.Keeper + GroupKeeper groupkeeper.Keeper + CrisisKeeper crisiskeeper.Keeper + UpgradeKeeper upgradekeeper.Keeper + ParamsKeeper paramskeeper.Keeper + AuthzKeeper authzkeeper.Keeper + IBCKeeper *ibckeeper.Keeper // IBC Keeper must be a pointer in the app, so we can SetRouter on it correctly + EvidenceKeeper evidencekeeper.Keeper + TransferKeeper ibctransferkeeper.Keeper + FeeGrantKeeper feegrantkeeper.Keeper + PacketForwardKeeper *packetforwardkeeper.Keeper + + // make scoped keepers public for test purposes + ScopedIBCKeeper capabilitykeeper.ScopedKeeper + ScopedTransferKeeper capabilitykeeper.ScopedKeeper + ScopedFeeMockKeeper capabilitykeeper.ScopedKeeper + ScopedIBCMockKeeper capabilitykeeper.ScopedKeeper + + // make IBC modules public for test purposes + // these modules are never directly routed to by the IBC Router + // ICAAuthModule ibcmock.IBCModule + // FeeMockModule ibcmock.IBCModule + + // the module manager + mm *module.Manager + + // simulation manager + sm *module.SimulationManager + + // the configurator + configurator module.Configurator +} + +func init() { + userHomeDir, err := os.UserHomeDir() + if err != nil { + panic(err) + } + + DefaultNodeHome = filepath.Join(userHomeDir, ".simapp") +} + +// NewSimApp returns a reference to an initialized SimApp. +func NewSimApp( + logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool, skipUpgradeHeights map[int64]bool, + homePath string, invCheckPeriod uint, encodingConfig simappparams.EncodingConfig, + appOpts servertypes.AppOptions, baseAppOptions ...func(*baseapp.BaseApp), +) *SimApp { + appCodec := encodingConfig.Marshaler + legacyAmino := encodingConfig.Amino + interfaceRegistry := encodingConfig.InterfaceRegistry + + bApp := baseapp.NewBaseApp(appName, logger, db, encodingConfig.TxConfig.TxDecoder(), baseAppOptions...) + bApp.SetCommitMultiStoreTracer(traceStore) + bApp.SetVersion(version.Version) + bApp.SetInterfaceRegistry(interfaceRegistry) + + keys := sdk.NewKVStoreKeys( + authtypes.StoreKey, banktypes.StoreKey, stakingtypes.StoreKey, + minttypes.StoreKey, distrtypes.StoreKey, slashingtypes.StoreKey, + govtypes.StoreKey, group.StoreKey, paramstypes.StoreKey, ibchost.StoreKey, upgradetypes.StoreKey, feegrant.StoreKey, + evidencetypes.StoreKey, ibctransfertypes.StoreKey, capabilitytypes.StoreKey, + authzkeeper.StoreKey, packetforwardtypes.StoreKey, + ) + tkeys := sdk.NewTransientStoreKeys(paramstypes.TStoreKey) + memKeys := sdk.NewMemoryStoreKeys(capabilitytypes.MemStoreKey) + + app := &SimApp{ + BaseApp: bApp, + legacyAmino: legacyAmino, + appCodec: appCodec, + interfaceRegistry: interfaceRegistry, + invCheckPeriod: invCheckPeriod, + keys: keys, + tkeys: tkeys, + memKeys: memKeys, + } + + app.ParamsKeeper = initParamsKeeper(appCodec, legacyAmino, keys[paramstypes.StoreKey], tkeys[paramstypes.TStoreKey]) + + // set the BaseApp's parameter store + bApp.SetParamStore(app.ParamsKeeper.Subspace(baseapp.Paramspace).WithKeyTable(paramstypes.ConsensusParamsKeyTable())) + + // add capability keeper and ScopeToModule for ibc module + app.CapabilityKeeper = capabilitykeeper.NewKeeper(appCodec, keys[capabilitytypes.StoreKey], memKeys[capabilitytypes.MemStoreKey]) + scopedIBCKeeper := app.CapabilityKeeper.ScopeToModule(ibchost.ModuleName) + scopedTransferKeeper := app.CapabilityKeeper.ScopeToModule(ibctransfertypes.ModuleName) + + // NOTE: the IBC mock keeper and application module is used only for testing core IBC. Do + // not replicate if you do not need to test core IBC or light clients. + scopedIBCMockKeeper := app.CapabilityKeeper.ScopeToModule(ibcmock.ModuleName) + + // seal capability keeper after scoping modules + app.CapabilityKeeper.Seal() + + // SDK module keepers + + app.AccountKeeper = authkeeper.NewAccountKeeper( + appCodec, keys[authtypes.StoreKey], app.GetSubspace(authtypes.ModuleName), authtypes.ProtoBaseAccount, maccPerms, sdk.GetConfig().GetBech32AccountAddrPrefix(), + ) + app.BankKeeper = bankkeeper.NewBaseKeeper( + appCodec, keys[banktypes.StoreKey], app.AccountKeeper, app.GetSubspace(banktypes.ModuleName), app.ModuleAccountAddrs(), + ) + stakingKeeper := stakingkeeper.NewKeeper( + appCodec, keys[stakingtypes.StoreKey], app.AccountKeeper, app.BankKeeper, app.GetSubspace(stakingtypes.ModuleName), + ) + app.MintKeeper = mintkeeper.NewKeeper( + appCodec, keys[minttypes.StoreKey], app.GetSubspace(minttypes.ModuleName), &stakingKeeper, + app.AccountKeeper, app.BankKeeper, authtypes.FeeCollectorName, + ) + app.DistrKeeper = distrkeeper.NewKeeper( + appCodec, keys[distrtypes.StoreKey], app.GetSubspace(distrtypes.ModuleName), app.AccountKeeper, app.BankKeeper, + &stakingKeeper, authtypes.FeeCollectorName, + ) + + app.SlashingKeeper = slashingkeeper.NewKeeper( + appCodec, keys[slashingtypes.StoreKey], &stakingKeeper, app.GetSubspace(slashingtypes.ModuleName), + ) + app.CrisisKeeper = crisiskeeper.NewKeeper( + app.GetSubspace(crisistypes.ModuleName), invCheckPeriod, app.BankKeeper, authtypes.FeeCollectorName, + ) + + app.FeeGrantKeeper = feegrantkeeper.NewKeeper(appCodec, keys[feegrant.StoreKey], app.AccountKeeper) + app.UpgradeKeeper = upgradekeeper.NewKeeper(skipUpgradeHeights, keys[upgradetypes.StoreKey], appCodec, homePath, app.BaseApp, authtypes.NewModuleAddress(govtypes.ModuleName).String()) + + // register the staking hooks + // NOTE: stakingKeeper above is passed by reference, so that it will contain these hooks + app.StakingKeeper = *stakingKeeper.SetHooks( + stakingtypes.NewMultiStakingHooks(app.DistrKeeper.Hooks(), app.SlashingKeeper.Hooks()), + ) + + app.AuthzKeeper = authzkeeper.NewKeeper(keys[authzkeeper.StoreKey], appCodec, app.MsgServiceRouter(), app.AccountKeeper) + + // IBC Keepers + + app.IBCKeeper = ibckeeper.NewKeeper( + appCodec, keys[ibchost.StoreKey], app.GetSubspace(ibchost.ModuleName), app.StakingKeeper, app.UpgradeKeeper, scopedIBCKeeper, + ) + + // register the proposal types + govRouter := govv1beta1.NewRouter() + govRouter.AddRoute(govtypes.RouterKey, govv1beta1.ProposalHandler). + AddRoute(paramproposal.RouterKey, params.NewParamChangeProposalHandler(app.ParamsKeeper)). + AddRoute(distrtypes.RouterKey, distr.NewCommunityPoolSpendProposalHandler(app.DistrKeeper)). + AddRoute(upgradetypes.RouterKey, upgrade.NewSoftwareUpgradeProposalHandler(app.UpgradeKeeper)). + AddRoute(ibcclienttypes.RouterKey, ibcclient.NewClientProposalHandler(app.IBCKeeper.ClientKeeper)) + + govConfig := govtypes.DefaultConfig() + /* + Example of setting gov params: + govConfig.MaxMetadataLen = 10000 + */ + govKeeper := govkeeper.NewKeeper( + appCodec, keys[govtypes.StoreKey], app.GetSubspace(govtypes.ModuleName), app.AccountKeeper, app.BankKeeper, + &stakingKeeper, govRouter, app.MsgServiceRouter(), govConfig, + ) + + app.GovKeeper = *govKeeper.SetHooks( + govtypes.NewMultiGovHooks( + // register the governance hooks + ), + ) + + groupConfig := group.DefaultConfig() + /* + Example of setting group params: + groupConfig.MaxMetadataLen = 1000 + */ + app.GroupKeeper = groupkeeper.NewKeeper(keys[group.StoreKey], appCodec, app.MsgServiceRouter(), app.AccountKeeper, groupConfig) + + // Create IBC Router + ibcRouter := porttypes.NewRouter() + + // Middleware Stacks + + app.PacketForwardKeeper = packetforwardkeeper.NewKeeper( + appCodec, + keys[packetforwardtypes.StoreKey], + app.GetSubspace(packetforwardtypes.ModuleName), + app.TransferKeeper, // will be zero-value here, reference is set later on with SetTransferKeeper. + app.IBCKeeper.ChannelKeeper, + app.DistrKeeper, + app.BankKeeper, + app.IBCKeeper.ChannelKeeper, + ) + + // Create Transfer Keeper and pass IBCFeeKeeper as expected Channel and PortKeeper + // since fee middleware will wrap the IBCKeeper for underlying application. + app.TransferKeeper = ibctransferkeeper.NewKeeper( + appCodec, keys[ibctransfertypes.StoreKey], app.GetSubspace(ibctransfertypes.ModuleName), + app.PacketForwardKeeper, app.IBCKeeper.ChannelKeeper, &app.IBCKeeper.PortKeeper, + app.AccountKeeper, app.BankKeeper, scopedTransferKeeper, + ) + + // Mock Module Stack + + // Mock Module setup for testing IBC and also acts as the interchain accounts authentication module + // NOTE: the IBC mock keeper and application module is used only for testing core IBC. Do + // not replicate if you do not need to test core IBC or light clients. + mockModule := ibcmock.NewAppModule(&app.IBCKeeper.PortKeeper) + + // The mock module is used for testing IBC + mockIBCModule := ibcmock.NewIBCModule(&mockModule, ibcmock.NewIBCApp(ibcmock.ModuleName, scopedIBCMockKeeper)) + ibcRouter.AddRoute(ibcmock.ModuleName, mockIBCModule) + + // Create Transfer Stack + // SendPacket, since it is originating from the application to core IBC: + // transferKeeper.SendPacket -> fee.SendPacket -> channel.SendPacket + + // RecvPacket, message that originates from core IBC and goes down to app, the flow is the other way + // channel.RecvPacket -> fee.OnRecvPacket -> transfer.OnRecvPacket + + // transfer stack contains (from top to bottom): + // - Transfer + // - Packet Forward Middleware + + // create IBC module from bottom to top of stack + var transferStack porttypes.IBCModule + transferStack = transfer.NewIBCModule(app.TransferKeeper) + transferStack = packetforward.NewIBCMiddleware( + transferStack, + app.PacketForwardKeeper, + 0, // retries on timeout + packetforwardkeeper.DefaultForwardTransferPacketTimeoutTimestamp, // forward timeout + packetforwardkeeper.DefaultRefundTransferPacketTimeoutTimestamp, // refund timeout + ) + + // Add transfer stack to IBC Router + ibcRouter.AddRoute(ibctransfertypes.ModuleName, transferStack) + + // RecvPacket, message that originates from core IBC and goes down to app, the flow is: + // channel.RecvPacket -> fee.OnRecvPacket -> icaHost.OnRecvPacket + + // Create Mock IBC Fee module stack for testing + // SendPacket, since it is originating from the application to core IBC: + // mockModule.SendPacket -> fee.SendPacket -> channel.SendPacket + + // OnRecvPacket, message that originates from core IBC and goes down to app, the flow is the otherway + // channel.RecvPacket -> fee.OnRecvPacket -> mockModule.OnRecvPacket + + // OnAcknowledgementPacket as this is where fee's are paid out + // mockModule.OnAcknowledgementPacket -> fee.OnAcknowledgementPacket -> channel.OnAcknowledgementPacket + + // create evidence keeper with router + evidenceKeeper := evidencekeeper.NewKeeper( + appCodec, keys[evidencetypes.StoreKey], &app.StakingKeeper, app.SlashingKeeper, + ) + // If evidence needs to be handled for the app, set routes in router here and seal + app.EvidenceKeeper = *evidenceKeeper + app.PacketForwardKeeper.SetTransferKeeper(app.TransferKeeper) + // Seal the IBC Router + app.IBCKeeper.SetRouter(ibcRouter) + + /**** Module Options ****/ + + // NOTE: we may consider parsing `appOpts` inside module constructors. For the moment + // we prefer to be more strict in what arguments the modules expect. + skipGenesisInvariants := cast.ToBool(appOpts.Get(crisis.FlagSkipGenesisInvariants)) + + // NOTE: Any module instantiated in the module manager that is later modified + // must be passed by reference here. + app.mm = module.NewManager( + // SDK app modules + genutil.NewAppModule( + app.AccountKeeper, app.StakingKeeper, app.BaseApp.DeliverTx, + encodingConfig.TxConfig, + ), + auth.NewAppModule(appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts), + vesting.NewAppModule(app.AccountKeeper, app.BankKeeper), + bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper), + capability.NewAppModule(appCodec, *app.CapabilityKeeper), + crisis.NewAppModule(&app.CrisisKeeper, skipGenesisInvariants), + feegrantmodule.NewAppModule(appCodec, app.AccountKeeper, app.BankKeeper, app.FeeGrantKeeper, app.interfaceRegistry), + gov.NewAppModule(appCodec, app.GovKeeper, app.AccountKeeper, app.BankKeeper), + groupmodule.NewAppModule(appCodec, app.GroupKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), + mint.NewAppModule(appCodec, app.MintKeeper, app.AccountKeeper, nil), + slashing.NewAppModule(appCodec, app.SlashingKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), + distr.NewAppModule(appCodec, app.DistrKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), + staking.NewAppModule(appCodec, app.StakingKeeper, app.AccountKeeper, app.BankKeeper), + upgrade.NewAppModule(app.UpgradeKeeper), + evidence.NewAppModule(app.EvidenceKeeper), + ibc.NewAppModule(app.IBCKeeper), + params.NewAppModule(app.ParamsKeeper), + authzmodule.NewAppModule(appCodec, app.AuthzKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), + + // IBC modules + transfer.NewAppModule(app.TransferKeeper), + packetforward.NewAppModule(app.PacketForwardKeeper), + mockModule, + ) + + // During begin block slashing happens after distr.BeginBlocker so that + // there is nothing left over in the validator fee pool, so as to keep the + // CanWithdrawInvariant invariant. + // NOTE: staking module is required if HistoricalEntries param > 0 + // NOTE: capability module's beginblocker must come before any modules using capabilities (e.g. IBC) + app.mm.SetOrderBeginBlockers( + upgradetypes.ModuleName, capabilitytypes.ModuleName, minttypes.ModuleName, distrtypes.ModuleName, slashingtypes.ModuleName, + evidencetypes.ModuleName, stakingtypes.ModuleName, ibchost.ModuleName, ibctransfertypes.ModuleName, authtypes.ModuleName, + banktypes.ModuleName, govtypes.ModuleName, crisistypes.ModuleName, genutiltypes.ModuleName, authz.ModuleName, feegrant.ModuleName, + paramstypes.ModuleName, vestingtypes.ModuleName, ibcmock.ModuleName, group.ModuleName, + packetforwardtypes.ModuleName, + ) + app.mm.SetOrderEndBlockers( + crisistypes.ModuleName, govtypes.ModuleName, stakingtypes.ModuleName, ibchost.ModuleName, ibctransfertypes.ModuleName, + capabilitytypes.ModuleName, authtypes.ModuleName, banktypes.ModuleName, distrtypes.ModuleName, slashingtypes.ModuleName, + minttypes.ModuleName, genutiltypes.ModuleName, evidencetypes.ModuleName, authz.ModuleName, feegrant.ModuleName, paramstypes.ModuleName, + upgradetypes.ModuleName, vestingtypes.ModuleName, ibcmock.ModuleName, group.ModuleName, packetforwardtypes.ModuleName, + ) + + // NOTE: The genutils module must occur after staking so that pools are + // properly initialized with tokens from genesis accounts. + // NOTE: Capability module must occur first so that it can initialize any capabilities + // so that other modules that want to create or claim capabilities afterwards in InitChain + // can do so safely. + app.mm.SetOrderInitGenesis( + capabilitytypes.ModuleName, authtypes.ModuleName, banktypes.ModuleName, distrtypes.ModuleName, stakingtypes.ModuleName, + slashingtypes.ModuleName, govtypes.ModuleName, minttypes.ModuleName, crisistypes.ModuleName, + ibchost.ModuleName, genutiltypes.ModuleName, evidencetypes.ModuleName, authz.ModuleName, ibctransfertypes.ModuleName, ibcmock.ModuleName, feegrant.ModuleName, paramstypes.ModuleName, upgradetypes.ModuleName, + vestingtypes.ModuleName, group.ModuleName, packetforwardtypes.ModuleName, + ) + + app.mm.RegisterInvariants(&app.CrisisKeeper) + app.mm.RegisterRoutes(app.Router(), app.QueryRouter(), encodingConfig.Amino) + app.configurator = module.NewConfigurator(app.appCodec, app.MsgServiceRouter(), app.GRPCQueryRouter()) + app.mm.RegisterServices(app.configurator) + + // add test gRPC service for testing gRPC queries in isolation + testdata.RegisterQueryServer(app.GRPCQueryRouter(), testdata.QueryImpl{}) + + // create the simulation manager and define the order of the modules for deterministic simulations + // + // NOTE: this is not required apps that don't use the simulator for fuzz testing + // transactions + app.sm = module.NewSimulationManager( + auth.NewAppModule(appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts), + bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper), + capability.NewAppModule(appCodec, *app.CapabilityKeeper), + feegrantmodule.NewAppModule(appCodec, app.AccountKeeper, app.BankKeeper, app.FeeGrantKeeper, app.interfaceRegistry), + gov.NewAppModule(appCodec, app.GovKeeper, app.AccountKeeper, app.BankKeeper), + mint.NewAppModule(appCodec, app.MintKeeper, app.AccountKeeper, nil), + staking.NewAppModule(appCodec, app.StakingKeeper, app.AccountKeeper, app.BankKeeper), + distr.NewAppModule(appCodec, app.DistrKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), + slashing.NewAppModule(appCodec, app.SlashingKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), + params.NewAppModule(app.ParamsKeeper), + evidence.NewAppModule(app.EvidenceKeeper), + authzmodule.NewAppModule(appCodec, app.AuthzKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), + ibc.NewAppModule(app.IBCKeeper), + transfer.NewAppModule(app.TransferKeeper), + // packetforward.NewAppModule(app.PacketForwardKeeper), + ) + + app.sm.RegisterStoreDecoders() + + // initialize stores + app.MountKVStores(keys) + app.MountTransientStores(tkeys) + app.MountMemoryStores(memKeys) + + // initialize BaseApp + app.SetInitChainer(app.InitChainer) + app.SetBeginBlocker(app.BeginBlocker) + anteHandler, err := simapp.NewAnteHandler( + simapp.HandlerOptions{ + HandlerOptions: ante.HandlerOptions{ + AccountKeeper: app.AccountKeeper, + BankKeeper: app.BankKeeper, + SignModeHandler: encodingConfig.TxConfig.SignModeHandler(), + FeegrantKeeper: app.FeeGrantKeeper, + SigGasConsumer: ante.DefaultSigVerificationGasConsumer, + }, + IBCKeeper: app.IBCKeeper, + }, + ) + if err != nil { + panic(err) + } + + app.SetAnteHandler(anteHandler) + + app.SetEndBlocker(app.EndBlocker) + + app.setupUpgradeHandlers() + + if loadLatest { + if err := app.LoadLatestVersion(); err != nil { + tmos.Exit(err.Error()) + } + } + + app.ScopedIBCKeeper = scopedIBCKeeper + app.ScopedTransferKeeper = scopedTransferKeeper + + // NOTE: the IBC mock keeper and application module is used only for testing core IBC. Do + // note replicate if you do not need to test core IBC or light clients. + app.ScopedIBCMockKeeper = scopedIBCMockKeeper + + return app +} + +// Name returns the name of the App +func (app *SimApp) Name() string { return app.BaseApp.Name() } + +// BeginBlocker application updates every begin block +func (app *SimApp) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock { + return app.mm.BeginBlock(ctx, req) +} + +// EndBlocker application updates every end block +func (app *SimApp) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock { + return app.mm.EndBlock(ctx, req) +} + +// InitChainer application update at chain initialization +func (app *SimApp) InitChainer(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain { + var genesisState simapp.GenesisState + if err := json.Unmarshal(req.AppStateBytes, &genesisState); err != nil { + panic(err) + } + app.UpgradeKeeper.SetModuleVersionMap(ctx, app.mm.GetVersionMap()) + + return app.mm.InitGenesis(ctx, app.appCodec, genesisState) +} + +// LoadHeight loads a particular height +func (app *SimApp) LoadHeight(height int64) error { + return app.LoadVersion(height) +} + +// ModuleAccountAddrs returns all the app's module account addresses. +func (app *SimApp) ModuleAccountAddrs() map[string]bool { + modAccAddrs := make(map[string]bool) + for acc := range maccPerms { + // do not add the following modules to blocked addresses + // this is only used for testing + if acc == ibcmock.ModuleName { + continue + } + + modAccAddrs[authtypes.NewModuleAddress(acc).String()] = true + } + + return modAccAddrs +} + +// GetModuleManager returns the app module manager +// NOTE: used for testing purposes +func (app *SimApp) GetModuleManager() *module.Manager { + return app.mm +} + +// LegacyAmino returns SimApp's amino codec. +// +// NOTE: This is solely to be used for testing purposes as it may be desirable +// for modules to register their own custom testing types. +func (app *SimApp) LegacyAmino() *codec.LegacyAmino { + return app.legacyAmino +} + +// AppCodec returns SimApp's app codec. +// +// NOTE: This is solely to be used for testing purposes as it may be desirable +// for modules to register their own custom testing types. +func (app *SimApp) AppCodec() codec.Codec { + return app.appCodec +} + +// InterfaceRegistry returns SimApp's InterfaceRegistry +func (app *SimApp) InterfaceRegistry() types.InterfaceRegistry { + return app.interfaceRegistry +} + +// GetKey returns the KVStoreKey for the provided store key. +// +// NOTE: This is solely to be used for testing purposes. +func (app *SimApp) GetKey(storeKey string) *storetypes.KVStoreKey { + return app.keys[storeKey] +} + +// GetTKey returns the TransientStoreKey for the provided store key. +// +// NOTE: This is solely to be used for testing purposes. +func (app *SimApp) GetTKey(storeKey string) *storetypes.TransientStoreKey { + return app.tkeys[storeKey] +} + +// GetMemKey returns the MemStoreKey for the provided mem key. +// +// NOTE: This is solely used for testing purposes. +func (app *SimApp) GetMemKey(storeKey string) *storetypes.MemoryStoreKey { + return app.memKeys[storeKey] +} + +// GetSubspace returns a param subspace for a given module name. +// +// NOTE: This is solely to be used for testing purposes. +func (app *SimApp) GetSubspace(moduleName string) paramstypes.Subspace { + subspace, _ := app.ParamsKeeper.GetSubspace(moduleName) + return subspace +} + +// TestingApp functions + +// GetBaseApp implements the TestingApp interface. +func (app *SimApp) GetBaseApp() *baseapp.BaseApp { + return app.BaseApp +} + +// GetStakingKeeper implements the TestingApp interface. +func (app *SimApp) GetStakingKeeper() ibctestingtypes.StakingKeeper { + return app.StakingKeeper +} + +// GetIBCKeeper implements the TestingApp interface. +func (app *SimApp) GetIBCKeeper() *ibckeeper.Keeper { + return app.IBCKeeper +} + +// GetScopedIBCKeeper implements the TestingApp interface. +func (app *SimApp) GetScopedIBCKeeper() capabilitykeeper.ScopedKeeper { + return app.ScopedIBCKeeper +} + +// GetTxConfig implements the TestingApp interface. +func (app *SimApp) GetTxConfig() client.TxConfig { + return simapp.MakeTestEncodingConfig().TxConfig +} + +// SimulationManager implements the SimulationApp interface +func (app *SimApp) SimulationManager() *module.SimulationManager { + return app.sm +} + +// RegisterAPIRoutes registers all application module routes with the provided +// API server. +func (app *SimApp) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.APIConfig) { + clientCtx := apiSvr.ClientCtx + // Register new tx routes from grpc-gateway. + authtx.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) + // Register new tendermint queries routes from grpc-gateway. + tmservice.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) + + // Register legacy and grpc-gateway routes for all modules. + ModuleBasics.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) + + // register swagger API from root so that other applications can override easily + if apiConfig.Swagger { + RegisterSwaggerAPI(clientCtx, apiSvr.Router) + } +} + +// RegisterTxService implements the Application.RegisterTxService method. +func (app *SimApp) RegisterTxService(clientCtx client.Context) { + authtx.RegisterTxService(app.BaseApp.GRPCQueryRouter(), clientCtx, app.BaseApp.Simulate, app.interfaceRegistry) +} + +// RegisterTendermintService implements the Application.RegisterTendermintService method. +func (app *SimApp) RegisterTendermintService(clientCtx client.Context) { + tmservice.RegisterTendermintService( + clientCtx, + app.BaseApp.GRPCQueryRouter(), + app.interfaceRegistry, + app.Query, + ) +} + +// RegisterSwaggerAPI registers swagger route with API Server +func RegisterSwaggerAPI(_ client.Context, rtr *mux.Router) { + statikFS, err := fs.New() + if err != nil { + panic(err) + } + + staticServer := http.FileServer(statikFS) + rtr.PathPrefix("/swagger/").Handler(http.StripPrefix("/swagger/", staticServer)) +} + +// GetMaccPerms returns a copy of the module account permissions +func GetMaccPerms() map[string][]string { + dupMaccPerms := make(map[string][]string) + for k, v := range maccPerms { + dupMaccPerms[k] = v + } + return dupMaccPerms +} + +// initParamsKeeper init params keeper and its subspaces +func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino, key, tkey storetypes.StoreKey) paramskeeper.Keeper { + paramsKeeper := paramskeeper.NewKeeper(appCodec, legacyAmino, key, tkey) + + paramsKeeper.Subspace(authtypes.ModuleName) + paramsKeeper.Subspace(banktypes.ModuleName) + paramsKeeper.Subspace(stakingtypes.ModuleName) + paramsKeeper.Subspace(minttypes.ModuleName) + paramsKeeper.Subspace(distrtypes.ModuleName) + paramsKeeper.Subspace(slashingtypes.ModuleName) + paramsKeeper.Subspace(govtypes.ModuleName).WithKeyTable(govv1.ParamKeyTable()) + paramsKeeper.Subspace(crisistypes.ModuleName) + paramsKeeper.Subspace(ibctransfertypes.ModuleName) + paramsKeeper.Subspace(ibchost.ModuleName) + paramsKeeper.Subspace(packetforwardtypes.ModuleName) + + return paramsKeeper +} + +// setupUpgradeHandlers sets all necessary upgrade handlers for testing purposes +func (app *SimApp) setupUpgradeHandlers() { + app.UpgradeKeeper.SetUpgradeHandler( + simappupgrades.DefaultUpgradeName, + simappupgrades.CreateDefaultUpgradeHandler(app.mm, app.configurator), + ) + + // NOTE: The moduleName arg of v6.CreateUpgradeHandler refers to the auth module ScopedKeeper name to which the channel capability should be migrated from. + // This should be the same string value provided upon instantiation of the ScopedKeeper with app.CapabilityKeeper.ScopeToModule() + // TODO: update git tag in link below + // See: https://github.com/cosmos/ibc-go/blob/v5.0.0-rc2/testing/simapp/app.go#L304 + app.UpgradeKeeper.SetUpgradeHandler( + v6.UpgradeName, + v6.CreateUpgradeHandler( + app.mm, + app.configurator, + app.appCodec, + app.keys[capabilitytypes.ModuleName], + app.CapabilityKeeper, + ibcmock.ModuleName, + ), + ) +} From 4b4e9aa9eea942030489e55719aa20eb704981db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nina=20/=20=E1=83=9C=E1=83=98=E1=83=9C=E1=83=90?= Date: Tue, 23 Jul 2024 15:08:13 +0200 Subject: [PATCH 35/40] fix: lint suggestions (#3720) ## Overview There were non-blocking lint suggestions shown on every run. This pr addresses those suggestions so we don't have to keep seeing the red lines. --- test/e2e/testnet/node.go | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/test/e2e/testnet/node.go b/test/e2e/testnet/node.go index b505eca2dc..3005686bbb 100644 --- a/test/e2e/testnet/node.go +++ b/test/e2e/testnet/node.go @@ -317,17 +317,12 @@ func (n *Node) Start() error { if err := n.StartAsync(); err != nil { return err } - if err := n.WaitUntilStartedAndForwardPorts(); err != nil { - return err - } - return nil + + return n.WaitUntilStartedAndForwardPorts() } func (n *Node) StartAsync() error { - if err := n.Instance.StartAsync(); err != nil { - return err - } - return nil + return n.Instance.StartAsync() } func (n *Node) WaitUntilStartedAndForwardPorts() error { @@ -374,10 +369,7 @@ func (n *Node) Upgrade(version string) error { return err } - if err := n.Instance.WaitInstanceIsRunning(); err != nil { - return err - } - return nil + return n.Instance.WaitInstanceIsRunning() } func DockerImageName(version string) string { From e29f8e95c4617d17d0cea8faf505b77f71a833cf Mon Sep 17 00:00:00 2001 From: Callum Waters Date: Tue, 23 Jul 2024 15:54:32 +0200 Subject: [PATCH 36/40] chore!: bump to v3 of the go mod (#3722) --- Makefile | 2 +- app/ante/ante.go | 4 +-- app/ante/fee_checker.go | 6 ++-- app/ante/get_tx_priority_test.go | 2 +- app/ante/gov_test.go | 12 +++---- app/ante/min_fee_test.go | 14 ++++---- app/ante/msg_gatekeeper_test.go | 6 ++-- app/ante/panic_test.go | 8 ++--- app/app.go | 36 +++++++++---------- app/app_test.go | 6 ++-- app/check_tx.go | 4 +-- app/default_overrides.go | 6 ++-- app/default_overrides_test.go | 2 +- app/denom.go | 2 +- app/errors/insufficient_gas_price_test.go | 16 ++++----- app/errors/nonce_mismatch_test.go | 16 ++++----- app/extend_block.go | 4 +-- app/module/configurator_test.go | 10 +++--- app/module/manager_test.go | 2 +- app/module/versioned_ibc_module_test.go | 4 +-- app/modules.go | 22 ++++++------ app/prepare_proposal.go | 6 ++-- app/process_proposal.go | 8 ++--- app/square_size.go | 2 +- app/test/big_blob_test.go | 14 ++++---- app/test/check_tx_test.go | 14 ++++---- app/test/circuit_breaker_test.go | 16 ++++----- app/test/consistent_apphash_test.go | 16 ++++----- app/test/export_test.go | 2 +- app/test/fuzz_abci_test.go | 10 +++--- app/test/integration_test.go | 18 +++++----- app/test/prepare_proposal_context_test.go | 10 +++--- app/test/prepare_proposal_test.go | 12 +++---- app/test/priority_test.go | 16 ++++----- app/test/process_proposal_test.go | 20 +++++------ app/test/qgb_rpc_test.go | 10 +++--- app/test/square_size_test.go | 22 ++++++------ app/test/std_sdk_test.go | 14 ++++---- app/test/testnode_test.go | 6 ++-- app/test/upgrade_test.go | 14 ++++---- cmd/celestia-appd/cmd/addrbook.go | 2 +- cmd/celestia-appd/cmd/root.go | 6 ++-- cmd/celestia-appd/main.go | 4 +-- go.mod | 2 +- pkg/appconsts/versioned_consts.go | 4 +-- pkg/appconsts/versioned_consts_test.go | 6 ++-- pkg/da/data_availability_header.go | 6 ++-- pkg/da/data_availability_header_test.go | 2 +- pkg/inclusion/get_commit.go | 2 +- pkg/inclusion/nmt_caching.go | 4 +-- pkg/inclusion/nmt_caching_test.go | 6 ++-- pkg/inclusion/paths_test.go | 2 +- pkg/proof/proof.go | 6 ++-- pkg/proof/proof_test.go | 12 +++---- pkg/proof/querier.go | 2 +- pkg/proof/share_proof.go | 2 +- pkg/user/e2e_test.go | 8 ++--- pkg/user/signer.go | 2 +- pkg/user/tx_client.go | 12 +++---- pkg/user/tx_client_test.go | 12 +++---- pkg/user/tx_options.go | 2 +- pkg/wrapper/nmt_wrapper.go | 2 +- pkg/wrapper/nmt_wrapper_test.go | 6 ++-- test/cmd/txsim/cli.go | 11 +++--- test/cmd/txsim/cli_test.go | 12 +++---- test/e2e/benchmark/benchmark.go | 6 ++-- test/e2e/benchmark/manifest.go | 10 +++--- test/e2e/benchmark/throughput.go | 4 +-- test/e2e/major_upgrade_v2.go | 8 ++--- test/e2e/minor_version_compatibility.go | 8 ++--- test/e2e/simple.go | 6 ++-- test/e2e/testnet/node.go | 2 +- test/e2e/testnet/setup.go | 2 +- test/e2e/testnet/testnet.go | 6 ++-- test/e2e/testnet/versions_test.go | 2 +- test/pfm/pfm_test.go | 4 +-- test/tokenfilter/setup.go | 10 +++--- test/tokenfilter/tokenfilter_test.go | 2 +- test/txsim/account.go | 6 ++-- test/txsim/blob.go | 6 ++-- test/txsim/run.go | 4 +-- test/txsim/run_test.go | 10 +++--- test/txsim/send.go | 2 +- test/txsim/stake.go | 2 +- test/util/blobfactory/payforblob_factory.go | 10 +++--- .../blobfactory/payforblob_factory_test.go | 10 +++--- test/util/blobfactory/test_util.go | 6 ++-- test/util/blobfactory/test_util_test.go | 14 ++++---- test/util/common.go | 8 ++--- test/util/direct_tx_gen.go | 10 +++--- test/util/genesis/accounts.go | 4 +-- test/util/genesis/document.go | 6 ++-- test/util/genesis/genesis.go | 4 +-- test/util/genesis/modifier.go | 6 ++-- test/util/malicious/app.go | 4 +-- test/util/malicious/app_test.go | 12 +++---- test/util/malicious/out_of_order_builder.go | 2 +- test/util/malicious/out_of_order_prepare.go | 6 ++-- test/util/malicious/test_app.go | 8 ++--- test/util/malicious/tree.go | 4 +-- test/util/sdkutil/proposals.go | 2 +- test/util/test_app.go | 16 ++++----- test/util/testfactory/blob.go | 2 +- test/util/testfactory/common.go | 2 +- test/util/testfactory/common_test.go | 8 ++--- test/util/testnode/config.go | 8 ++--- test/util/testnode/full_node_test.go | 10 +++--- test/util/testnode/network.go | 2 +- test/util/testnode/node_interaction_api.go | 12 +++---- test/util/testnode/read.go | 4 +-- test/util/testnode/rpc_client.go | 2 +- test/util/testnode/signer.go | 10 +++--- test/util/testnode/utils.go | 8 ++--- tools/blockscan/main.go | 2 +- x/blob/ante/ante.go | 2 +- x/blob/ante/ante_test.go | 10 +++--- x/blob/ante/blob_share_decorator.go | 6 ++-- x/blob/ante/blob_share_decorator_test.go | 12 +++---- x/blob/ante/max_total_blob_size_ante.go | 6 ++-- x/blob/ante/max_total_blob_size_ante_test.go | 12 +++---- x/blob/client/cli/payforblob.go | 4 +-- x/blob/client/cli/query.go | 2 +- x/blob/client/cli/query_params.go | 2 +- x/blob/client/cli/tx.go | 2 +- x/blob/client/testutil/integration_test.go | 8 ++--- x/blob/genesis.go | 4 +-- x/blob/handler.go | 4 +-- x/blob/keeper/gas_test.go | 4 +-- x/blob/keeper/genesis_test.go | 4 +-- x/blob/keeper/grpc_query.go | 2 +- x/blob/keeper/grpc_query_params.go | 2 +- x/blob/keeper/grpc_query_params_test.go | 2 +- x/blob/keeper/keeper.go | 2 +- x/blob/keeper/keeper_test.go | 8 ++--- x/blob/keeper/msg_server.go | 2 +- x/blob/keeper/params.go | 2 +- x/blob/keeper/params_test.go | 2 +- x/blob/module.go | 6 ++-- x/blob/test/decode_blob_tx_test.go | 6 ++-- x/blob/types/blob_tx_test.go | 14 ++++---- x/blob/types/estimate_gas_test.go | 16 ++++----- x/blob/types/genesis_test.go | 4 +-- x/blob/types/params.go | 2 +- x/blob/types/params_test.go | 2 +- x/blob/types/payforblob.go | 2 +- x/blob/types/payforblob_test.go | 8 ++--- x/blobstream/abci.go | 4 +-- x/blobstream/abci_test.go | 10 +++--- x/blobstream/client/query.go | 2 +- x/blobstream/client/query_test.go | 2 +- x/blobstream/client/suite_test.go | 4 +-- x/blobstream/client/tx.go | 2 +- x/blobstream/client/verify.go | 4 +-- x/blobstream/genesis.go | 4 +-- x/blobstream/integration_test.go | 14 ++++---- x/blobstream/keeper/hooks.go | 2 +- x/blobstream/keeper/hooks_test.go | 2 +- x/blobstream/keeper/keeper.go | 2 +- x/blobstream/keeper/keeper_attestation.go | 2 +- .../keeper/keeper_attestation_test.go | 4 +-- x/blobstream/keeper/keeper_data_commitment.go | 2 +- .../keeper/keeper_data_commitment_test.go | 6 ++-- x/blobstream/keeper/keeper_valset.go | 2 +- x/blobstream/keeper/keeper_valset_test.go | 6 ++-- x/blobstream/keeper/msg_server.go | 2 +- x/blobstream/keeper/msg_server_test.go | 4 +-- x/blobstream/keeper/query_attestation.go | 2 +- x/blobstream/keeper/query_data_commitment.go | 2 +- x/blobstream/keeper/query_general.go | 2 +- x/blobstream/keeper/query_valset.go | 2 +- x/blobstream/module.go | 4 +-- x/blobstream/types/genesis.go | 2 +- x/blobstream/types/genesis_test.go | 4 +-- x/blobstream/types/types_test.go | 2 +- x/minfee/grpc_query_test.go | 8 ++--- x/minfee/module_test.go | 2 +- x/minfee/params.go | 2 +- x/mint/abci.go | 4 +-- x/mint/abci_test.go | 8 ++--- x/mint/client/cli/query.go | 2 +- x/mint/client/testutil/grpc_test.go | 4 +-- x/mint/client/testutil/suite_test.go | 6 ++-- x/mint/keeper/genesis.go | 2 +- x/mint/keeper/grpc_query.go | 2 +- x/mint/keeper/grpc_query_test.go | 6 ++-- x/mint/keeper/keeper.go | 2 +- x/mint/module.go | 8 ++--- x/mint/module_test.go | 2 +- x/mint/simulation/decoder.go | 2 +- x/mint/simulation/decoder_test.go | 4 +-- x/mint/test/mint_test.go | 6 ++-- x/paramfilter/test/gov_params_test.go | 12 +++---- x/paramfilter/test/param_filter_test.go | 6 ++-- x/signal/cli/cli_test.go | 4 +-- x/signal/cli/query.go | 2 +- x/signal/cli/tx.go | 2 +- x/signal/integration_test.go | 8 ++--- x/signal/keeper.go | 2 +- x/signal/keeper_test.go | 14 ++++---- x/signal/legacy_test.go | 12 +++---- x/signal/module.go | 4 +-- x/tokenfilter/ibc_middleware_test.go | 2 +- 202 files changed, 626 insertions(+), 627 deletions(-) diff --git a/Makefile b/Makefile index fb483c7572..b63b1aa962 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ IMAGE := ghcr.io/tendermint/docker-build-proto:latest DOCKER_PROTO_BUILDER := docker run -v $(shell pwd):/workspace --workdir /workspace $(IMAGE) PROJECTNAME=$(shell basename "$(PWD)") HTTPS_GIT := https://github.com/celestiaorg/celestia-app.git -PACKAGE_NAME := github.com/celestiaorg/celestia-app/v2 +PACKAGE_NAME := github.com/celestiaorg/celestia-app/v3 GOLANG_CROSS_VERSION ?= v1.22.4 # process linker flags diff --git a/app/ante/ante.go b/app/ante/ante.go index dfacee7afd..dd65fdd120 100644 --- a/app/ante/ante.go +++ b/app/ante/ante.go @@ -1,8 +1,8 @@ package ante import ( - blobante "github.com/celestiaorg/celestia-app/v2/x/blob/ante" - blob "github.com/celestiaorg/celestia-app/v2/x/blob/keeper" + blobante "github.com/celestiaorg/celestia-app/v3/x/blob/ante" + blob "github.com/celestiaorg/celestia-app/v3/x/blob/keeper" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth/ante" "github.com/cosmos/cosmos-sdk/x/auth/signing" diff --git a/app/ante/fee_checker.go b/app/ante/fee_checker.go index fbfb18adf3..0ea3b3ef57 100644 --- a/app/ante/fee_checker.go +++ b/app/ante/fee_checker.go @@ -3,9 +3,9 @@ package ante import ( errors "cosmossdk.io/errors" "cosmossdk.io/math" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - v1 "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/v1" - "github.com/celestiaorg/celestia-app/v2/x/minfee" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + v1 "github.com/celestiaorg/celestia-app/v3/pkg/appconsts/v1" + "github.com/celestiaorg/celestia-app/v3/x/minfee" sdk "github.com/cosmos/cosmos-sdk/types" sdkerror "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/x/auth/ante" diff --git a/app/ante/get_tx_priority_test.go b/app/ante/get_tx_priority_test.go index b0139a5f77..26d21d4d6b 100644 --- a/app/ante/get_tx_priority_test.go +++ b/app/ante/get_tx_priority_test.go @@ -3,7 +3,7 @@ package ante import ( "testing" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/assert" ) diff --git a/app/ante/gov_test.go b/app/ante/gov_test.go index 3a8325041a..c6abe13a03 100644 --- a/app/ante/gov_test.go +++ b/app/ante/gov_test.go @@ -3,12 +3,12 @@ package ante_test import ( "testing" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/ante" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/test/util/testfactory" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/ante" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/test/util/testfactory" + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1" diff --git a/app/ante/min_fee_test.go b/app/ante/min_fee_test.go index 6aa85c48f1..30912813c4 100644 --- a/app/ante/min_fee_test.go +++ b/app/ante/min_fee_test.go @@ -5,13 +5,13 @@ import ( "math" "testing" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/ante" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - v2 "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/v2" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" - "github.com/celestiaorg/celestia-app/v2/x/minfee" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/ante" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + v2 "github.com/celestiaorg/celestia-app/v3/pkg/appconsts/v2" + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" + "github.com/celestiaorg/celestia-app/v3/x/minfee" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/store" diff --git a/app/ante/msg_gatekeeper_test.go b/app/ante/msg_gatekeeper_test.go index 6bbedb1571..9866d897a9 100644 --- a/app/ante/msg_gatekeeper_test.go +++ b/app/ante/msg_gatekeeper_test.go @@ -3,9 +3,9 @@ package ante_test import ( "testing" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/ante" - "github.com/celestiaorg/celestia-app/v2/app/encoding" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/ante" + "github.com/celestiaorg/celestia-app/v3/app/encoding" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/authz" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" diff --git a/app/ante/panic_test.go b/app/ante/panic_test.go index d7a86daa09..789269a60d 100644 --- a/app/ante/panic_test.go +++ b/app/ante/panic_test.go @@ -4,10 +4,10 @@ import ( "fmt" "testing" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/ante" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/ante" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/stretchr/testify/require" diff --git a/app/app.go b/app/app.go index 0c0decfd0a..2de17f779d 100644 --- a/app/app.go +++ b/app/app.go @@ -5,24 +5,24 @@ import ( "io" "slices" - "github.com/celestiaorg/celestia-app/v2/app/ante" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/app/module" - "github.com/celestiaorg/celestia-app/v2/app/posthandler" - appv1 "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/v1" - appv2 "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/v2" - "github.com/celestiaorg/celestia-app/v2/pkg/proof" - blobkeeper "github.com/celestiaorg/celestia-app/v2/x/blob/keeper" - blobtypes "github.com/celestiaorg/celestia-app/v2/x/blob/types" - blobstreamkeeper "github.com/celestiaorg/celestia-app/v2/x/blobstream/keeper" - blobstreamtypes "github.com/celestiaorg/celestia-app/v2/x/blobstream/types" - "github.com/celestiaorg/celestia-app/v2/x/minfee" - mintkeeper "github.com/celestiaorg/celestia-app/v2/x/mint/keeper" - minttypes "github.com/celestiaorg/celestia-app/v2/x/mint/types" - "github.com/celestiaorg/celestia-app/v2/x/paramfilter" - "github.com/celestiaorg/celestia-app/v2/x/signal" - signaltypes "github.com/celestiaorg/celestia-app/v2/x/signal/types" - "github.com/celestiaorg/celestia-app/v2/x/tokenfilter" + "github.com/celestiaorg/celestia-app/v3/app/ante" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/app/module" + "github.com/celestiaorg/celestia-app/v3/app/posthandler" + appv1 "github.com/celestiaorg/celestia-app/v3/pkg/appconsts/v1" + appv2 "github.com/celestiaorg/celestia-app/v3/pkg/appconsts/v2" + "github.com/celestiaorg/celestia-app/v3/pkg/proof" + blobkeeper "github.com/celestiaorg/celestia-app/v3/x/blob/keeper" + blobtypes "github.com/celestiaorg/celestia-app/v3/x/blob/types" + blobstreamkeeper "github.com/celestiaorg/celestia-app/v3/x/blobstream/keeper" + blobstreamtypes "github.com/celestiaorg/celestia-app/v3/x/blobstream/types" + "github.com/celestiaorg/celestia-app/v3/x/minfee" + mintkeeper "github.com/celestiaorg/celestia-app/v3/x/mint/keeper" + minttypes "github.com/celestiaorg/celestia-app/v3/x/mint/types" + "github.com/celestiaorg/celestia-app/v3/x/paramfilter" + "github.com/celestiaorg/celestia-app/v3/x/signal" + signaltypes "github.com/celestiaorg/celestia-app/v3/x/signal/types" + "github.com/celestiaorg/celestia-app/v3/x/tokenfilter" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" nodeservice "github.com/cosmos/cosmos-sdk/client/grpc/node" diff --git a/app/app_test.go b/app/app_test.go index a991981d41..e1189e5599 100644 --- a/app/app_test.go +++ b/app/app_test.go @@ -3,9 +3,9 @@ package app_test import ( "testing" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/x/minfee" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/x/minfee" "github.com/stretchr/testify/assert" "github.com/tendermint/tendermint/libs/log" tmdb "github.com/tendermint/tm-db" diff --git a/app/check_tx.go b/app/check_tx.go index e0ddaeb8eb..316359dedc 100644 --- a/app/check_tx.go +++ b/app/check_tx.go @@ -3,8 +3,8 @@ package app import ( "fmt" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - blobtypes "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + blobtypes "github.com/celestiaorg/celestia-app/v3/x/blob/types" "github.com/celestiaorg/go-square/blob" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" abci "github.com/tendermint/tendermint/abci/types" diff --git a/app/default_overrides.go b/app/default_overrides.go index c950e7bcc9..eb21c62af4 100644 --- a/app/default_overrides.go +++ b/app/default_overrides.go @@ -5,9 +5,9 @@ import ( "fmt" "time" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/x/mint" - minttypes "github.com/celestiaorg/celestia-app/v2/x/mint/types" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/x/mint" + minttypes "github.com/celestiaorg/celestia-app/v3/x/mint/types" "github.com/cosmos/cosmos-sdk/codec" serverconfig "github.com/cosmos/cosmos-sdk/server/config" sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/app/default_overrides_test.go b/app/default_overrides_test.go index 48c66c591e..674cd13d9f 100644 --- a/app/default_overrides_test.go +++ b/app/default_overrides_test.go @@ -4,7 +4,7 @@ import ( "testing" "time" - "github.com/celestiaorg/celestia-app/v2/app/encoding" + "github.com/celestiaorg/celestia-app/v3/app/encoding" "github.com/cosmos/cosmos-sdk/types" distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1" diff --git a/app/denom.go b/app/denom.go index 8c9fb0de7f..1b299da8e1 100644 --- a/app/denom.go +++ b/app/denom.go @@ -1,6 +1,6 @@ package app -import "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" +import "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" const ( // BondDenom defines the native staking token denomination. diff --git a/app/errors/insufficient_gas_price_test.go b/app/errors/insufficient_gas_price_test.go index be501b701f..401bf78a1a 100644 --- a/app/errors/insufficient_gas_price_test.go +++ b/app/errors/insufficient_gas_price_test.go @@ -5,14 +5,14 @@ import ( "testing" "cosmossdk.io/errors" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - apperr "github.com/celestiaorg/celestia-app/v2/app/errors" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/pkg/user" - testutil "github.com/celestiaorg/celestia-app/v2/test/util" - "github.com/celestiaorg/celestia-app/v2/test/util/testfactory" - blob "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + apperr "github.com/celestiaorg/celestia-app/v3/app/errors" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/user" + testutil "github.com/celestiaorg/celestia-app/v3/test/util" + "github.com/celestiaorg/celestia-app/v3/test/util/testfactory" + blob "github.com/celestiaorg/celestia-app/v3/x/blob/types" "github.com/celestiaorg/go-square/namespace" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" diff --git a/app/errors/nonce_mismatch_test.go b/app/errors/nonce_mismatch_test.go index b07cb76147..fdb8126df2 100644 --- a/app/errors/nonce_mismatch_test.go +++ b/app/errors/nonce_mismatch_test.go @@ -4,14 +4,14 @@ import ( "fmt" "testing" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - apperr "github.com/celestiaorg/celestia-app/v2/app/errors" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/pkg/user" - testutil "github.com/celestiaorg/celestia-app/v2/test/util" - "github.com/celestiaorg/celestia-app/v2/test/util/testfactory" - blob "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + apperr "github.com/celestiaorg/celestia-app/v3/app/errors" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/user" + testutil "github.com/celestiaorg/celestia-app/v3/test/util" + "github.com/celestiaorg/celestia-app/v3/test/util/testfactory" + blob "github.com/celestiaorg/celestia-app/v3/x/blob/types" "github.com/celestiaorg/go-square/namespace" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth/ante" diff --git a/app/extend_block.go b/app/extend_block.go index e869d7c766..11586f5a2b 100644 --- a/app/extend_block.go +++ b/app/extend_block.go @@ -1,8 +1,8 @@ package app import ( - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/pkg/da" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/da" "github.com/celestiaorg/go-square/shares" "github.com/celestiaorg/go-square/square" "github.com/celestiaorg/rsmt2d" diff --git a/app/module/configurator_test.go b/app/module/configurator_test.go index 5788d84108..a93713938a 100644 --- a/app/module/configurator_test.go +++ b/app/module/configurator_test.go @@ -3,11 +3,11 @@ package module_test import ( "testing" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/app/module" - "github.com/celestiaorg/celestia-app/v2/x/signal" - signaltypes "github.com/celestiaorg/celestia-app/v2/x/signal/types" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/app/module" + "github.com/celestiaorg/celestia-app/v3/x/signal" + signaltypes "github.com/celestiaorg/celestia-app/v3/x/signal/types" "github.com/cosmos/cosmos-sdk/store" storetypes "github.com/cosmos/cosmos-sdk/store/types" "github.com/cosmos/cosmos-sdk/tests/mocks" diff --git a/app/module/manager_test.go b/app/module/manager_test.go index 2e8b3e4132..0f11a23706 100644 --- a/app/module/manager_test.go +++ b/app/module/manager_test.go @@ -12,7 +12,7 @@ import ( tmproto "github.com/tendermint/tendermint/proto/tendermint/types" tmversion "github.com/tendermint/tendermint/proto/tendermint/version" - "github.com/celestiaorg/celestia-app/v2/app/module" + "github.com/celestiaorg/celestia-app/v3/app/module" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/tests/mocks" diff --git a/app/module/versioned_ibc_module_test.go b/app/module/versioned_ibc_module_test.go index 0605048f05..8d2fb23d0e 100644 --- a/app/module/versioned_ibc_module_test.go +++ b/app/module/versioned_ibc_module_test.go @@ -3,8 +3,8 @@ package module_test import ( "testing" - "github.com/celestiaorg/celestia-app/v2/app/module" - mocks "github.com/celestiaorg/celestia-app/v2/app/module/mocks" + "github.com/celestiaorg/celestia-app/v3/app/module" + mocks "github.com/celestiaorg/celestia-app/v3/app/module/mocks" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/ibc-go/v6/modules/core/04-channel/types" "github.com/golang/mock/gomock" diff --git a/app/modules.go b/app/modules.go index 0a18a50b3a..a89f418205 100644 --- a/app/modules.go +++ b/app/modules.go @@ -3,17 +3,17 @@ package app import ( "fmt" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/app/module" - "github.com/celestiaorg/celestia-app/v2/x/blob" - blobtypes "github.com/celestiaorg/celestia-app/v2/x/blob/types" - "github.com/celestiaorg/celestia-app/v2/x/blobstream" - blobstreamtypes "github.com/celestiaorg/celestia-app/v2/x/blobstream/types" - "github.com/celestiaorg/celestia-app/v2/x/minfee" - "github.com/celestiaorg/celestia-app/v2/x/mint" - minttypes "github.com/celestiaorg/celestia-app/v2/x/mint/types" - "github.com/celestiaorg/celestia-app/v2/x/signal" - signaltypes "github.com/celestiaorg/celestia-app/v2/x/signal/types" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/app/module" + "github.com/celestiaorg/celestia-app/v3/x/blob" + blobtypes "github.com/celestiaorg/celestia-app/v3/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/x/blobstream" + blobstreamtypes "github.com/celestiaorg/celestia-app/v3/x/blobstream/types" + "github.com/celestiaorg/celestia-app/v3/x/minfee" + "github.com/celestiaorg/celestia-app/v3/x/mint" + minttypes "github.com/celestiaorg/celestia-app/v3/x/mint/types" + "github.com/celestiaorg/celestia-app/v3/x/signal" + signaltypes "github.com/celestiaorg/celestia-app/v3/x/signal/types" sdkmodule "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/x/auth" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" diff --git a/app/prepare_proposal.go b/app/prepare_proposal.go index 9ec0bd0867..a7e90fc42c 100644 --- a/app/prepare_proposal.go +++ b/app/prepare_proposal.go @@ -3,9 +3,9 @@ package app import ( "time" - "github.com/celestiaorg/celestia-app/v2/app/ante" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/pkg/da" + "github.com/celestiaorg/celestia-app/v3/app/ante" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/da" "github.com/celestiaorg/go-square/shares" "github.com/celestiaorg/go-square/square" "github.com/cosmos/cosmos-sdk/telemetry" diff --git a/app/process_proposal.go b/app/process_proposal.go index 1653e27200..c67766e237 100644 --- a/app/process_proposal.go +++ b/app/process_proposal.go @@ -5,10 +5,10 @@ import ( "fmt" "time" - "github.com/celestiaorg/celestia-app/v2/app/ante" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/pkg/da" - blobtypes "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/app/ante" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/da" + blobtypes "github.com/celestiaorg/celestia-app/v3/x/blob/types" "github.com/celestiaorg/go-square/blob" "github.com/celestiaorg/go-square/shares" "github.com/celestiaorg/go-square/square" diff --git a/app/square_size.go b/app/square_size.go index b09e49688a..4ed7f0ac5d 100644 --- a/app/square_size.go +++ b/app/square_size.go @@ -1,7 +1,7 @@ package app import ( - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" sdk "github.com/cosmos/cosmos-sdk/types" ) diff --git a/app/test/big_blob_test.go b/app/test/big_blob_test.go index e3cd56e84c..4ae8266a6b 100644 --- a/app/test/big_blob_test.go +++ b/app/test/big_blob_test.go @@ -5,13 +5,13 @@ import ( "testing" "time" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/pkg/user" - "github.com/celestiaorg/celestia-app/v2/test/util/testfactory" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" - blobtypes "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/user" + "github.com/celestiaorg/celestia-app/v3/test/util/testfactory" + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" + blobtypes "github.com/celestiaorg/celestia-app/v3/x/blob/types" "github.com/celestiaorg/go-square/blob" "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" diff --git a/app/test/check_tx_test.go b/app/test/check_tx_test.go index 8502941300..88f04b2472 100644 --- a/app/test/check_tx_test.go +++ b/app/test/check_tx_test.go @@ -8,13 +8,13 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/keyring" tmrand "github.com/tendermint/tendermint/libs/rand" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/pkg/user" - testutil "github.com/celestiaorg/celestia-app/v2/test/util" - "github.com/celestiaorg/celestia-app/v2/test/util/blobfactory" - blobtypes "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/user" + testutil "github.com/celestiaorg/celestia-app/v3/test/util" + "github.com/celestiaorg/celestia-app/v3/test/util/blobfactory" + blobtypes "github.com/celestiaorg/celestia-app/v3/x/blob/types" "github.com/celestiaorg/go-square/blob" appns "github.com/celestiaorg/go-square/namespace" "github.com/stretchr/testify/assert" diff --git a/app/test/circuit_breaker_test.go b/app/test/circuit_breaker_test.go index 5aa2d498cf..078f53bc08 100644 --- a/app/test/circuit_breaker_test.go +++ b/app/test/circuit_breaker_test.go @@ -4,14 +4,14 @@ import ( "testing" "time" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - v1 "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/v1" - "github.com/celestiaorg/celestia-app/v2/pkg/user" - "github.com/celestiaorg/celestia-app/v2/test/util" - "github.com/celestiaorg/celestia-app/v2/test/util/blobfactory" - "github.com/celestiaorg/celestia-app/v2/test/util/testfactory" - signaltypes "github.com/celestiaorg/celestia-app/v2/x/signal/types" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + v1 "github.com/celestiaorg/celestia-app/v3/pkg/appconsts/v1" + "github.com/celestiaorg/celestia-app/v3/pkg/user" + "github.com/celestiaorg/celestia-app/v3/test/util" + "github.com/celestiaorg/celestia-app/v3/test/util/blobfactory" + "github.com/celestiaorg/celestia-app/v3/test/util/testfactory" + signaltypes "github.com/celestiaorg/celestia-app/v3/x/signal/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/authz" "github.com/stretchr/testify/assert" diff --git a/app/test/consistent_apphash_test.go b/app/test/consistent_apphash_test.go index 5d1928935c..85c4fe5b7c 100644 --- a/app/test/consistent_apphash_test.go +++ b/app/test/consistent_apphash_test.go @@ -5,14 +5,14 @@ import ( "testing" "time" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/pkg/user" - testutil "github.com/celestiaorg/celestia-app/v2/test/util" - "github.com/celestiaorg/celestia-app/v2/test/util/blobfactory" - "github.com/celestiaorg/celestia-app/v2/test/util/testfactory" - blobtypes "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/user" + testutil "github.com/celestiaorg/celestia-app/v3/test/util" + "github.com/celestiaorg/celestia-app/v3/test/util/blobfactory" + "github.com/celestiaorg/celestia-app/v3/test/util/testfactory" + blobtypes "github.com/celestiaorg/celestia-app/v3/x/blob/types" "github.com/celestiaorg/go-square/blob" appns "github.com/celestiaorg/go-square/namespace" "github.com/cosmos/cosmos-sdk/codec" diff --git a/app/test/export_test.go b/app/test/export_test.go index d224176faa..e8b9e9e955 100644 --- a/app/test/export_test.go +++ b/app/test/export_test.go @@ -3,7 +3,7 @@ package app_test import ( "testing" - "github.com/celestiaorg/celestia-app/v2/app" + "github.com/celestiaorg/celestia-app/v3/app" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" diff --git a/app/test/fuzz_abci_test.go b/app/test/fuzz_abci_test.go index afbc1e698f..96ec81b7ea 100644 --- a/app/test/fuzz_abci_test.go +++ b/app/test/fuzz_abci_test.go @@ -4,11 +4,11 @@ import ( "testing" "time" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/pkg/user" - testutil "github.com/celestiaorg/celestia-app/v2/test/util" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/user" + testutil "github.com/celestiaorg/celestia-app/v3/test/util" "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" tmrand "github.com/tendermint/tendermint/libs/rand" diff --git a/app/test/integration_test.go b/app/test/integration_test.go index 274b4264cd..2529bc4bc6 100644 --- a/app/test/integration_test.go +++ b/app/test/integration_test.go @@ -8,9 +8,9 @@ import ( "os" "testing" - "github.com/celestiaorg/celestia-app/v2/test/util/blobfactory" - "github.com/celestiaorg/celestia-app/v2/test/util/testfactory" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" + "github.com/celestiaorg/celestia-app/v3/test/util/blobfactory" + "github.com/celestiaorg/celestia-app/v3/test/util/testfactory" + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -18,12 +18,12 @@ import ( "github.com/stretchr/testify/suite" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/pkg/da" - "github.com/celestiaorg/celestia-app/v2/pkg/user" - blobtypes "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/da" + "github.com/celestiaorg/celestia-app/v3/pkg/user" + blobtypes "github.com/celestiaorg/celestia-app/v3/x/blob/types" "github.com/celestiaorg/go-square/blob" appns "github.com/celestiaorg/go-square/namespace" "github.com/celestiaorg/go-square/square" diff --git a/app/test/prepare_proposal_context_test.go b/app/test/prepare_proposal_context_test.go index cb181a2a31..dbec6798b3 100644 --- a/app/test/prepare_proposal_context_test.go +++ b/app/test/prepare_proposal_context_test.go @@ -4,11 +4,11 @@ import ( "testing" "time" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/pkg/user" - "github.com/celestiaorg/celestia-app/v2/test/util/testfactory" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/pkg/user" + "github.com/celestiaorg/celestia-app/v3/test/util/testfactory" + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" "github.com/cosmos/cosmos-sdk/crypto/hd" "github.com/cosmos/cosmos-sdk/crypto/keyring" sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/app/test/prepare_proposal_test.go b/app/test/prepare_proposal_test.go index 04b925e365..a1c9cfc22e 100644 --- a/app/test/prepare_proposal_test.go +++ b/app/test/prepare_proposal_test.go @@ -13,12 +13,12 @@ import ( tmproto "github.com/tendermint/tendermint/proto/tendermint/types" coretypes "github.com/tendermint/tendermint/types" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - testutil "github.com/celestiaorg/celestia-app/v2/test/util" - "github.com/celestiaorg/celestia-app/v2/test/util/blobfactory" - "github.com/celestiaorg/celestia-app/v2/test/util/testfactory" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + testutil "github.com/celestiaorg/celestia-app/v3/test/util" + "github.com/celestiaorg/celestia-app/v3/test/util/blobfactory" + "github.com/celestiaorg/celestia-app/v3/test/util/testfactory" "github.com/celestiaorg/go-square/blob" appns "github.com/celestiaorg/go-square/namespace" ) diff --git a/app/test/priority_test.go b/app/test/priority_test.go index c695615611..e401f98177 100644 --- a/app/test/priority_test.go +++ b/app/test/priority_test.go @@ -7,17 +7,17 @@ import ( "testing" "time" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" "github.com/celestiaorg/go-square/namespace" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/pkg/user" - "github.com/celestiaorg/celestia-app/v2/test/util/blobfactory" - "github.com/celestiaorg/celestia-app/v2/test/util/testfactory" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/user" + "github.com/celestiaorg/celestia-app/v3/test/util/blobfactory" + "github.com/celestiaorg/celestia-app/v3/test/util/testfactory" + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" - blobtypes "github.com/celestiaorg/celestia-app/v2/x/blob/types" + blobtypes "github.com/celestiaorg/celestia-app/v3/x/blob/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" diff --git a/app/test/process_proposal_test.go b/app/test/process_proposal_test.go index fd52936322..52774e630e 100644 --- a/app/test/process_proposal_test.go +++ b/app/test/process_proposal_test.go @@ -14,16 +14,16 @@ import ( "github.com/tendermint/tendermint/proto/tendermint/version" coretypes "github.com/tendermint/tendermint/types" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - v1 "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/v1" - v2 "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/v2" - "github.com/celestiaorg/celestia-app/v2/pkg/da" - "github.com/celestiaorg/celestia-app/v2/pkg/user" - testutil "github.com/celestiaorg/celestia-app/v2/test/util" - "github.com/celestiaorg/celestia-app/v2/test/util/blobfactory" - "github.com/celestiaorg/celestia-app/v2/test/util/testfactory" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + v1 "github.com/celestiaorg/celestia-app/v3/pkg/appconsts/v1" + v2 "github.com/celestiaorg/celestia-app/v3/pkg/appconsts/v2" + "github.com/celestiaorg/celestia-app/v3/pkg/da" + "github.com/celestiaorg/celestia-app/v3/pkg/user" + testutil "github.com/celestiaorg/celestia-app/v3/test/util" + "github.com/celestiaorg/celestia-app/v3/test/util/blobfactory" + "github.com/celestiaorg/celestia-app/v3/test/util/testfactory" "github.com/celestiaorg/go-square/blob" appns "github.com/celestiaorg/go-square/namespace" "github.com/celestiaorg/go-square/shares" diff --git a/app/test/qgb_rpc_test.go b/app/test/qgb_rpc_test.go index 33bd9756ad..4eddfd9119 100644 --- a/app/test/qgb_rpc_test.go +++ b/app/test/qgb_rpc_test.go @@ -5,11 +5,11 @@ import ( "testing" "time" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/test/util/genesis" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" - "github.com/celestiaorg/celestia-app/v2/x/blobstream/types" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/test/util/genesis" + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" + "github.com/celestiaorg/celestia-app/v3/x/blobstream/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/app/test/square_size_test.go b/app/test/square_size_test.go index 28748a3bf7..fa529b519f 100644 --- a/app/test/square_size_test.go +++ b/app/test/square_size_test.go @@ -5,17 +5,17 @@ import ( "testing" "time" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/pkg/user" - "github.com/celestiaorg/celestia-app/v2/test/txsim" - "github.com/celestiaorg/celestia-app/v2/test/util/blobfactory" - "github.com/celestiaorg/celestia-app/v2/test/util/genesis" - "github.com/celestiaorg/celestia-app/v2/test/util/sdkutil" - "github.com/celestiaorg/celestia-app/v2/test/util/testfactory" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" - blobtypes "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/user" + "github.com/celestiaorg/celestia-app/v3/test/txsim" + "github.com/celestiaorg/celestia-app/v3/test/util/blobfactory" + "github.com/celestiaorg/celestia-app/v3/test/util/genesis" + "github.com/celestiaorg/celestia-app/v3/test/util/sdkutil" + "github.com/celestiaorg/celestia-app/v3/test/util/testfactory" + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" + blobtypes "github.com/celestiaorg/celestia-app/v3/x/blob/types" sdk "github.com/cosmos/cosmos-sdk/types" v1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" oldgov "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" diff --git a/app/test/std_sdk_test.go b/app/test/std_sdk_test.go index daf5605709..10ca5f5824 100644 --- a/app/test/std_sdk_test.go +++ b/app/test/std_sdk_test.go @@ -5,13 +5,13 @@ import ( "testing" "time" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/pkg/user" - "github.com/celestiaorg/celestia-app/v2/test/util/blobfactory" - "github.com/celestiaorg/celestia-app/v2/test/util/testfactory" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" - signal "github.com/celestiaorg/celestia-app/v2/x/signal/types" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/pkg/user" + "github.com/celestiaorg/celestia-app/v3/test/util/blobfactory" + "github.com/celestiaorg/celestia-app/v3/test/util/testfactory" + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" + signal "github.com/celestiaorg/celestia-app/v3/x/signal/types" "github.com/cosmos/cosmos-sdk/crypto/hd" "github.com/cosmos/cosmos-sdk/crypto/keyring" "github.com/cosmos/cosmos-sdk/testutil/mock" diff --git a/app/test/testnode_test.go b/app/test/testnode_test.go index f9f8466b7d..88e18564e3 100644 --- a/app/test/testnode_test.go +++ b/app/test/testnode_test.go @@ -3,9 +3,9 @@ package app_test import ( "testing" - v2 "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/v2" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" - "github.com/celestiaorg/celestia-app/v2/x/minfee" + v2 "github.com/celestiaorg/celestia-app/v3/pkg/appconsts/v2" + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" + "github.com/celestiaorg/celestia-app/v3/x/minfee" nodeservice "github.com/cosmos/cosmos-sdk/client/grpc/node" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/app/test/upgrade_test.go b/app/test/upgrade_test.go index b80321204b..55de8fc486 100644 --- a/app/test/upgrade_test.go +++ b/app/test/upgrade_test.go @@ -7,13 +7,13 @@ import ( "testing" "time" - app "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - v1 "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/v1" - v2 "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/v2" - "github.com/celestiaorg/celestia-app/v2/test/util" - blobstreamtypes "github.com/celestiaorg/celestia-app/v2/x/blobstream/types" - "github.com/celestiaorg/celestia-app/v2/x/minfee" + app "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + v1 "github.com/celestiaorg/celestia-app/v3/pkg/appconsts/v1" + v2 "github.com/celestiaorg/celestia-app/v3/pkg/appconsts/v2" + "github.com/celestiaorg/celestia-app/v3/test/util" + blobstreamtypes "github.com/celestiaorg/celestia-app/v3/x/blobstream/types" + "github.com/celestiaorg/celestia-app/v3/x/minfee" "github.com/cosmos/cosmos-sdk/crypto/keyring" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/params/types/proposal" diff --git a/cmd/celestia-appd/cmd/addrbook.go b/cmd/celestia-appd/cmd/addrbook.go index 3136da8bce..b083940127 100644 --- a/cmd/celestia-appd/cmd/addrbook.go +++ b/cmd/celestia-appd/cmd/addrbook.go @@ -5,7 +5,7 @@ import ( "os" "strings" - "github.com/celestiaorg/celestia-app/v2/app" + "github.com/celestiaorg/celestia-app/v3/app" "github.com/spf13/cobra" "github.com/tendermint/tendermint/p2p" "github.com/tendermint/tendermint/p2p/pex" diff --git a/cmd/celestia-appd/cmd/root.go b/cmd/celestia-appd/cmd/root.go index 6d4663a4d7..3f88a48518 100644 --- a/cmd/celestia-appd/cmd/root.go +++ b/cmd/celestia-appd/cmd/root.go @@ -5,10 +5,10 @@ import ( "os" "path/filepath" - bscmd "github.com/celestiaorg/celestia-app/v2/x/blobstream/client" + bscmd "github.com/celestiaorg/celestia-app/v3/x/blobstream/client" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" "github.com/cosmos/cosmos-sdk/simapp/simd/cmd" "github.com/cosmos/cosmos-sdk/x/crisis" "github.com/tendermint/tendermint/cmd/cometbft/commands" diff --git a/cmd/celestia-appd/main.go b/cmd/celestia-appd/main.go index 81c36dfc81..e7e87af1c4 100644 --- a/cmd/celestia-appd/main.go +++ b/cmd/celestia-appd/main.go @@ -3,8 +3,8 @@ package main import ( "os" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/cmd/celestia-appd/cmd" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/cmd/celestia-appd/cmd" svrcmd "github.com/cosmos/cosmos-sdk/server/cmd" ) diff --git a/go.mod b/go.mod index c1fa89836e..0cf00b84ae 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/celestiaorg/celestia-app/v2 +module github.com/celestiaorg/celestia-app/v3 go 1.22.4 diff --git a/pkg/appconsts/versioned_consts.go b/pkg/appconsts/versioned_consts.go index 06dbb73ac0..67c3c8a8f2 100644 --- a/pkg/appconsts/versioned_consts.go +++ b/pkg/appconsts/versioned_consts.go @@ -1,8 +1,8 @@ package appconsts import ( - v1 "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/v1" - v2 "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/v2" + v1 "github.com/celestiaorg/celestia-app/v3/pkg/appconsts/v1" + v2 "github.com/celestiaorg/celestia-app/v3/pkg/appconsts/v2" ) const ( diff --git a/pkg/appconsts/versioned_consts_test.go b/pkg/appconsts/versioned_consts_test.go index e3a77a1115..6fb5cfc48d 100644 --- a/pkg/appconsts/versioned_consts_test.go +++ b/pkg/appconsts/versioned_consts_test.go @@ -6,9 +6,9 @@ import ( "github.com/stretchr/testify/require" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - v1 "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/v1" - v2 "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/v2" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + v1 "github.com/celestiaorg/celestia-app/v3/pkg/appconsts/v1" + v2 "github.com/celestiaorg/celestia-app/v3/pkg/appconsts/v2" ) func TestSubtreeRootThreshold(t *testing.T) { diff --git a/pkg/da/data_availability_header.go b/pkg/da/data_availability_header.go index e7199ca261..af5e763a7a 100644 --- a/pkg/da/data_availability_header.go +++ b/pkg/da/data_availability_header.go @@ -11,9 +11,9 @@ import ( "github.com/tendermint/tendermint/types" "golang.org/x/exp/constraints" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/pkg/wrapper" - daproto "github.com/celestiaorg/celestia-app/v2/proto/celestia/core/v1/da" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/wrapper" + daproto "github.com/celestiaorg/celestia-app/v3/proto/celestia/core/v1/da" "github.com/celestiaorg/go-square/shares" ) diff --git a/pkg/da/data_availability_header_test.go b/pkg/da/data_availability_header_test.go index ded5ec5957..8b1863c408 100644 --- a/pkg/da/data_availability_header_test.go +++ b/pkg/da/data_availability_header_test.go @@ -6,7 +6,7 @@ import ( "strings" "testing" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" appns "github.com/celestiaorg/go-square/namespace" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/pkg/inclusion/get_commit.go b/pkg/inclusion/get_commit.go index f7012edddc..5d98d29a98 100644 --- a/pkg/inclusion/get_commit.go +++ b/pkg/inclusion/get_commit.go @@ -3,7 +3,7 @@ package inclusion import ( "errors" - "github.com/celestiaorg/celestia-app/v2/pkg/da" + "github.com/celestiaorg/celestia-app/v3/pkg/da" "github.com/celestiaorg/go-square/merkle" ) diff --git a/pkg/inclusion/nmt_caching.go b/pkg/inclusion/nmt_caching.go index 0fa5ccd332..feae6565da 100644 --- a/pkg/inclusion/nmt_caching.go +++ b/pkg/inclusion/nmt_caching.go @@ -4,8 +4,8 @@ import ( "fmt" "sync" - "github.com/celestiaorg/celestia-app/v2/pkg/da" - "github.com/celestiaorg/celestia-app/v2/pkg/wrapper" + "github.com/celestiaorg/celestia-app/v3/pkg/da" + "github.com/celestiaorg/celestia-app/v3/pkg/wrapper" "github.com/celestiaorg/nmt" "github.com/celestiaorg/rsmt2d" ) diff --git a/pkg/inclusion/nmt_caching_test.go b/pkg/inclusion/nmt_caching_test.go index 66f1369e37..2191d659f0 100644 --- a/pkg/inclusion/nmt_caching_test.go +++ b/pkg/inclusion/nmt_caching_test.go @@ -5,9 +5,9 @@ import ( "sort" "testing" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/pkg/da" - "github.com/celestiaorg/celestia-app/v2/pkg/wrapper" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/da" + "github.com/celestiaorg/celestia-app/v3/pkg/wrapper" appns "github.com/celestiaorg/go-square/namespace" "github.com/celestiaorg/nmt" "github.com/celestiaorg/rsmt2d" diff --git a/pkg/inclusion/paths_test.go b/pkg/inclusion/paths_test.go index f655a5fe6b..f398557da2 100644 --- a/pkg/inclusion/paths_test.go +++ b/pkg/inclusion/paths_test.go @@ -4,7 +4,7 @@ import ( "fmt" "testing" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/pkg/proof/proof.go b/pkg/proof/proof.go index 56d9726b81..06d00a49ce 100644 --- a/pkg/proof/proof.go +++ b/pkg/proof/proof.go @@ -8,9 +8,9 @@ import ( "github.com/celestiaorg/rsmt2d" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/pkg/da" - "github.com/celestiaorg/celestia-app/v2/pkg/wrapper" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/da" + "github.com/celestiaorg/celestia-app/v3/pkg/wrapper" "github.com/celestiaorg/go-square/blob" "github.com/celestiaorg/go-square/merkle" appns "github.com/celestiaorg/go-square/namespace" diff --git a/pkg/proof/proof_test.go b/pkg/proof/proof_test.go index d8559d8c24..f55064702d 100644 --- a/pkg/proof/proof_test.go +++ b/pkg/proof/proof_test.go @@ -9,15 +9,15 @@ import ( abci "github.com/tendermint/tendermint/abci/types" tmrand "github.com/tendermint/tendermint/libs/rand" - "github.com/celestiaorg/celestia-app/v2/test/util/blobfactory" - "github.com/celestiaorg/celestia-app/v2/test/util/testfactory" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" + "github.com/celestiaorg/celestia-app/v3/test/util/blobfactory" + "github.com/celestiaorg/celestia-app/v3/test/util/testfactory" + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" - "github.com/celestiaorg/celestia-app/v2/pkg/da" - "github.com/celestiaorg/celestia-app/v2/pkg/proof" + "github.com/celestiaorg/celestia-app/v3/pkg/da" + "github.com/celestiaorg/celestia-app/v3/pkg/proof" "github.com/celestiaorg/go-square/square" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" appns "github.com/celestiaorg/go-square/namespace" "github.com/celestiaorg/go-square/shares" "github.com/stretchr/testify/assert" diff --git a/pkg/proof/querier.go b/pkg/proof/querier.go index e5602d5ef7..46a9124124 100644 --- a/pkg/proof/querier.go +++ b/pkg/proof/querier.go @@ -6,7 +6,7 @@ import ( "math" "strconv" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" "github.com/celestiaorg/go-square/shares" "github.com/celestiaorg/go-square/square" diff --git a/pkg/proof/share_proof.go b/pkg/proof/share_proof.go index f24fca0914..a723b52c89 100644 --- a/pkg/proof/share_proof.go +++ b/pkg/proof/share_proof.go @@ -5,7 +5,7 @@ import ( "fmt" "math" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" "github.com/celestiaorg/nmt" ) diff --git a/pkg/user/e2e_test.go b/pkg/user/e2e_test.go index 7caf8c42a6..2cd506aa69 100644 --- a/pkg/user/e2e_test.go +++ b/pkg/user/e2e_test.go @@ -7,10 +7,10 @@ import ( "testing" "time" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/pkg/user" - "github.com/celestiaorg/celestia-app/v2/test/util/blobfactory" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/user" + "github.com/celestiaorg/celestia-app/v3/test/util/blobfactory" + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" "github.com/celestiaorg/go-square/blob" "github.com/stretchr/testify/require" tmrand "github.com/tendermint/tendermint/libs/rand" diff --git a/pkg/user/signer.go b/pkg/user/signer.go index 2beaa277d0..ecb1673733 100644 --- a/pkg/user/signer.go +++ b/pkg/user/signer.go @@ -12,7 +12,7 @@ import ( "github.com/cosmos/cosmos-sdk/types/tx/signing" authsigning "github.com/cosmos/cosmos-sdk/x/auth/signing" - blobtypes "github.com/celestiaorg/celestia-app/v2/x/blob/types" + blobtypes "github.com/celestiaorg/celestia-app/v3/x/blob/types" ) // Signer is struct for building and signing Celestia transactions diff --git a/pkg/user/tx_client.go b/pkg/user/tx_client.go index 7897f0e578..caaed72f82 100644 --- a/pkg/user/tx_client.go +++ b/pkg/user/tx_client.go @@ -23,12 +23,12 @@ import ( abci "github.com/tendermint/tendermint/abci/types" "google.golang.org/grpc" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - apperrors "github.com/celestiaorg/celestia-app/v2/app/errors" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/x/blob/types" - "github.com/celestiaorg/celestia-app/v2/x/minfee" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + apperrors "github.com/celestiaorg/celestia-app/v3/app/errors" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/x/minfee" ) const ( diff --git a/pkg/user/tx_client_test.go b/pkg/user/tx_client_test.go index ebdb6e1c66..0c4821b2c4 100644 --- a/pkg/user/tx_client_test.go +++ b/pkg/user/tx_client_test.go @@ -12,12 +12,12 @@ import ( abci "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/libs/rand" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/pkg/user" - "github.com/celestiaorg/celestia-app/v2/test/util/blobfactory" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/user" + "github.com/celestiaorg/celestia-app/v3/test/util/blobfactory" + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" ) func TestTxClientTestSuite(t *testing.T) { diff --git a/pkg/user/tx_options.go b/pkg/user/tx_options.go index 53ec78513f..106702ffca 100644 --- a/pkg/user/tx_options.go +++ b/pkg/user/tx_options.go @@ -3,7 +3,7 @@ package user import ( "math" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" sdkclient "github.com/cosmos/cosmos-sdk/client" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/tx" diff --git a/pkg/wrapper/nmt_wrapper.go b/pkg/wrapper/nmt_wrapper.go index 41587a17a0..ad0cdf2a48 100644 --- a/pkg/wrapper/nmt_wrapper.go +++ b/pkg/wrapper/nmt_wrapper.go @@ -3,7 +3,7 @@ package wrapper import ( "fmt" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" appns "github.com/celestiaorg/go-square/namespace" "github.com/celestiaorg/nmt" "github.com/celestiaorg/nmt/namespace" diff --git a/pkg/wrapper/nmt_wrapper_test.go b/pkg/wrapper/nmt_wrapper_test.go index ff48cb2dbf..92c9cb8e11 100644 --- a/pkg/wrapper/nmt_wrapper_test.go +++ b/pkg/wrapper/nmt_wrapper_test.go @@ -6,9 +6,9 @@ import ( "sort" "testing" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/pkg/wrapper" - "github.com/celestiaorg/celestia-app/v2/test/util/testfactory" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/wrapper" + "github.com/celestiaorg/celestia-app/v3/test/util/testfactory" appns "github.com/celestiaorg/go-square/namespace" "github.com/celestiaorg/nmt" nmtnamespace "github.com/celestiaorg/nmt/namespace" diff --git a/test/cmd/txsim/cli.go b/test/cmd/txsim/cli.go index 344ec44574..62988c3eae 100644 --- a/test/cmd/txsim/cli.go +++ b/test/cmd/txsim/cli.go @@ -11,10 +11,10 @@ import ( "strings" "time" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/pkg/user" - "github.com/celestiaorg/celestia-app/v2/test/txsim" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/pkg/user" + "github.com/celestiaorg/celestia-app/v3/test/txsim" "github.com/cosmos/cosmos-sdk/crypto/hd" "github.com/cosmos/cosmos-sdk/crypto/keyring" "github.com/spf13/cobra" @@ -24,7 +24,6 @@ import ( // A set of environment variables that can be used instead of flags const ( TxsimGRPC = "TXSIM_GRPC" - TxsimRPC = "TXSIM_RPC" TxsimSeed = "TXSIM_SEED" TxsimPoll = "TXSIM_POLL" TxsimKeypath = "TXSIM_KEYPATH" @@ -60,7 +59,7 @@ func command() *cobra.Command { Long: ` Txsim is a tool for randomized transaction generation on celestia networks. The tool relies on defined sequences; recursive patterns between one or more accounts which will continually submit -transactions. You can use flags or environment variables (TXSIM_RPC, TXSIM_GRPC, TXSIM_SEED, +transactions. You can use flags or environment variables (TXSIM_GRPC, TXSIM_SEED, TXSIM_POLL, TXSIM_KEYPATH) to configure the client. The keyring provided should have at least one well funded account that can act as the master account. The command runs until all sequences error.`, Example: "txsim --key-path /path/to/keyring --grpc-endpoint localhost:9090 --seed 1234 --poll-time 1s --blob 5", diff --git a/test/cmd/txsim/cli_test.go b/test/cmd/txsim/cli_test.go index e9f8185796..bf637dfb06 100644 --- a/test/cmd/txsim/cli_test.go +++ b/test/cmd/txsim/cli_test.go @@ -6,12 +6,12 @@ import ( "testing" "time" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/test/util/genesis" - "github.com/celestiaorg/celestia-app/v2/test/util/testfactory" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/test/util/genesis" + "github.com/celestiaorg/celestia-app/v3/test/util/testfactory" + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" "github.com/cosmos/cosmos-sdk/crypto/keyring" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" diff --git a/test/e2e/benchmark/benchmark.go b/test/e2e/benchmark/benchmark.go index baee5a2881..cac428fac9 100644 --- a/test/e2e/benchmark/benchmark.go +++ b/test/e2e/benchmark/benchmark.go @@ -7,9 +7,9 @@ import ( "log" "time" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/test/e2e/testnet" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/test/e2e/testnet" + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" "github.com/tendermint/tendermint/pkg/trace" ) diff --git a/test/e2e/benchmark/manifest.go b/test/e2e/benchmark/manifest.go index 979d009e98..f130069657 100644 --- a/test/e2e/benchmark/manifest.go +++ b/test/e2e/benchmark/manifest.go @@ -4,11 +4,11 @@ import ( "fmt" "time" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/test/e2e/testnet" - "github.com/celestiaorg/celestia-app/v2/test/util/genesis" - blobtypes "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/test/e2e/testnet" + "github.com/celestiaorg/celestia-app/v3/test/util/genesis" + blobtypes "github.com/celestiaorg/celestia-app/v3/x/blob/types" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" ) diff --git a/test/e2e/benchmark/throughput.go b/test/e2e/benchmark/throughput.go index 4fe0d84250..b919093d8a 100644 --- a/test/e2e/benchmark/throughput.go +++ b/test/e2e/benchmark/throughput.go @@ -4,8 +4,8 @@ import ( "log" "time" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/test/e2e/testnet" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/test/e2e/testnet" ) const ( diff --git a/test/e2e/major_upgrade_v2.go b/test/e2e/major_upgrade_v2.go index 92a794f755..f595be542d 100644 --- a/test/e2e/major_upgrade_v2.go +++ b/test/e2e/major_upgrade_v2.go @@ -8,10 +8,10 @@ import ( "log" "time" - "github.com/celestiaorg/celestia-app/v2/app" - v1 "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/v1" - v2 "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/v2" - "github.com/celestiaorg/celestia-app/v2/test/e2e/testnet" + "github.com/celestiaorg/celestia-app/v3/app" + v1 "github.com/celestiaorg/celestia-app/v3/pkg/appconsts/v1" + v2 "github.com/celestiaorg/celestia-app/v3/pkg/appconsts/v2" + "github.com/celestiaorg/celestia-app/v3/test/e2e/testnet" "github.com/celestiaorg/knuu/pkg/knuu" "github.com/tendermint/tendermint/rpc/client/http" ) diff --git a/test/e2e/minor_version_compatibility.go b/test/e2e/minor_version_compatibility.go index f9e3fb4710..d0fd6314e9 100644 --- a/test/e2e/minor_version_compatibility.go +++ b/test/e2e/minor_version_compatibility.go @@ -11,10 +11,10 @@ import ( "strings" "time" - "github.com/celestiaorg/celestia-app/v2/app" - v1 "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/v1" - v2 "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/v2" - "github.com/celestiaorg/celestia-app/v2/test/e2e/testnet" + "github.com/celestiaorg/celestia-app/v3/app" + v1 "github.com/celestiaorg/celestia-app/v3/pkg/appconsts/v1" + v2 "github.com/celestiaorg/celestia-app/v3/pkg/appconsts/v2" + "github.com/celestiaorg/celestia-app/v3/test/e2e/testnet" "github.com/celestiaorg/knuu/pkg/knuu" ) diff --git a/test/e2e/simple.go b/test/e2e/simple.go index 9cb2699310..3bba82156e 100644 --- a/test/e2e/simple.go +++ b/test/e2e/simple.go @@ -6,9 +6,9 @@ import ( "log" "time" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/test/e2e/testnet" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/test/e2e/testnet" + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" ) // This test runs a simple testnet with 4 validators. It submits both MsgPayForBlobs diff --git a/test/e2e/testnet/node.go b/test/e2e/testnet/node.go index 3005686bbb..addbc98066 100644 --- a/test/e2e/testnet/node.go +++ b/test/e2e/testnet/node.go @@ -6,7 +6,7 @@ import ( "os" "path/filepath" - "github.com/celestiaorg/celestia-app/v2/test/util/genesis" + "github.com/celestiaorg/celestia-app/v3/test/util/genesis" "github.com/celestiaorg/knuu/pkg/knuu" serverconfig "github.com/cosmos/cosmos-sdk/server/config" "github.com/rs/zerolog/log" diff --git a/test/e2e/testnet/setup.go b/test/e2e/testnet/setup.go index ffdd3ffd50..758299ef90 100644 --- a/test/e2e/testnet/setup.go +++ b/test/e2e/testnet/setup.go @@ -5,7 +5,7 @@ import ( "strings" "time" - "github.com/celestiaorg/celestia-app/v2/app" + "github.com/celestiaorg/celestia-app/v3/app" serverconfig "github.com/cosmos/cosmos-sdk/server/config" "github.com/tendermint/tendermint/config" "github.com/tendermint/tendermint/p2p" diff --git a/test/e2e/testnet/testnet.go b/test/e2e/testnet/testnet.go index 9a37d87e7a..a5cab85b98 100644 --- a/test/e2e/testnet/testnet.go +++ b/test/e2e/testnet/testnet.go @@ -8,9 +8,9 @@ import ( "path/filepath" "time" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/test/util/genesis" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/test/util/genesis" "github.com/celestiaorg/knuu/pkg/knuu" "github.com/cosmos/cosmos-sdk/crypto/hd" "github.com/cosmos/cosmos-sdk/crypto/keyring" diff --git a/test/e2e/testnet/versions_test.go b/test/e2e/testnet/versions_test.go index 71ddcaad27..7d4d3fc614 100644 --- a/test/e2e/testnet/versions_test.go +++ b/test/e2e/testnet/versions_test.go @@ -3,7 +3,7 @@ package testnet_test import ( "testing" - "github.com/celestiaorg/celestia-app/v2/test/e2e/testnet" + "github.com/celestiaorg/celestia-app/v3/test/e2e/testnet" "github.com/stretchr/testify/require" ) diff --git a/test/pfm/pfm_test.go b/test/pfm/pfm_test.go index db83ea59d3..aae0fd5e5b 100644 --- a/test/pfm/pfm_test.go +++ b/test/pfm/pfm_test.go @@ -7,8 +7,8 @@ import ( "testing" "time" - "github.com/celestiaorg/celestia-app/v2/app" - utils "github.com/celestiaorg/celestia-app/v2/test/tokenfilter" + "github.com/celestiaorg/celestia-app/v3/app" + utils "github.com/celestiaorg/celestia-app/v3/test/tokenfilter" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/ibc-go/v6/modules/apps/transfer/types" clienttypes "github.com/cosmos/ibc-go/v6/modules/core/02-client/types" diff --git a/test/tokenfilter/setup.go b/test/tokenfilter/setup.go index 4e2764eeb4..0d6c8a4fd3 100644 --- a/test/tokenfilter/setup.go +++ b/test/tokenfilter/setup.go @@ -6,11 +6,11 @@ import ( "time" "cosmossdk.io/math" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" - "github.com/celestiaorg/celestia-app/v2/x/minfee" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" + "github.com/celestiaorg/celestia-app/v3/x/minfee" codectypes "github.com/cosmos/cosmos-sdk/codec/types" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" diff --git a/test/tokenfilter/tokenfilter_test.go b/test/tokenfilter/tokenfilter_test.go index d79d2b4fef..3b00e5e808 100644 --- a/test/tokenfilter/tokenfilter_test.go +++ b/test/tokenfilter/tokenfilter_test.go @@ -4,7 +4,7 @@ import ( "testing" "time" - "github.com/celestiaorg/celestia-app/v2/app" + "github.com/celestiaorg/celestia-app/v3/app" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/ibc-go/v6/modules/apps/transfer/types" clienttypes "github.com/cosmos/ibc-go/v6/modules/core/02-client/types" diff --git a/test/txsim/account.go b/test/txsim/account.go index ea1a45f251..ac3eee2797 100644 --- a/test/txsim/account.go +++ b/test/txsim/account.go @@ -9,9 +9,9 @@ import ( "sync" "time" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/pkg/user" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/user" "github.com/celestiaorg/go-square/blob" "github.com/cosmos/cosmos-sdk/client/grpc/tmservice" "github.com/cosmos/cosmos-sdk/crypto/hd" diff --git a/test/txsim/blob.go b/test/txsim/blob.go index 23b954c6ad..88f0570a85 100644 --- a/test/txsim/blob.go +++ b/test/txsim/blob.go @@ -5,9 +5,9 @@ import ( "fmt" "math/rand" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/test/util/blobfactory" - blob "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/test/util/blobfactory" + blob "github.com/celestiaorg/celestia-app/v3/x/blob/types" ns "github.com/celestiaorg/go-square/namespace" "github.com/cosmos/cosmos-sdk/types" "github.com/gogo/protobuf/grpc" diff --git a/test/txsim/run.go b/test/txsim/run.go index 00390b2ee2..a8d57c6a0e 100644 --- a/test/txsim/run.go +++ b/test/txsim/run.go @@ -7,8 +7,8 @@ import ( "math/rand" "time" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/pkg/user" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/pkg/user" "github.com/cosmos/cosmos-sdk/crypto/keyring" "github.com/rs/zerolog" "github.com/rs/zerolog/log" diff --git a/test/txsim/run_test.go b/test/txsim/run_test.go index 0c595befd9..46e4523710 100644 --- a/test/txsim/run_test.go +++ b/test/txsim/run_test.go @@ -10,14 +10,14 @@ import ( "testing" "time" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/test/txsim" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/test/txsim" + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" "github.com/cosmos/cosmos-sdk/crypto/keyring" sdk "github.com/cosmos/cosmos-sdk/types" - blob "github.com/celestiaorg/celestia-app/v2/x/blob/types" + blob "github.com/celestiaorg/celestia-app/v3/x/blob/types" bank "github.com/cosmos/cosmos-sdk/x/bank/types" distribution "github.com/cosmos/cosmos-sdk/x/distribution/types" staking "github.com/cosmos/cosmos-sdk/x/staking/types" diff --git a/test/txsim/send.go b/test/txsim/send.go index 6742e3ccbd..d7998b2280 100644 --- a/test/txsim/send.go +++ b/test/txsim/send.go @@ -4,7 +4,7 @@ import ( "context" "math/rand" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" "github.com/cosmos/cosmos-sdk/types" bank "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/gogo/protobuf/grpc" diff --git a/test/txsim/stake.go b/test/txsim/stake.go index 7b7f870f99..5254624739 100644 --- a/test/txsim/stake.go +++ b/test/txsim/stake.go @@ -4,7 +4,7 @@ import ( "context" "math/rand" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" "github.com/cosmos/cosmos-sdk/types" distribution "github.com/cosmos/cosmos-sdk/x/distribution/types" staking "github.com/cosmos/cosmos-sdk/x/staking/types" diff --git a/test/util/blobfactory/payforblob_factory.go b/test/util/blobfactory/payforblob_factory.go index 9860999940..0f4583ef46 100644 --- a/test/util/blobfactory/payforblob_factory.go +++ b/test/util/blobfactory/payforblob_factory.go @@ -5,11 +5,11 @@ import ( "context" "testing" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/pkg/user" - "github.com/celestiaorg/celestia-app/v2/test/util/testfactory" - blobtypes "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/user" + "github.com/celestiaorg/celestia-app/v3/test/util/testfactory" + blobtypes "github.com/celestiaorg/celestia-app/v3/x/blob/types" "github.com/celestiaorg/go-square/blob" appns "github.com/celestiaorg/go-square/namespace" "github.com/cosmos/cosmos-sdk/client" diff --git a/test/util/blobfactory/payforblob_factory_test.go b/test/util/blobfactory/payforblob_factory_test.go index 4e2955755f..c084943c08 100644 --- a/test/util/blobfactory/payforblob_factory_test.go +++ b/test/util/blobfactory/payforblob_factory_test.go @@ -3,11 +3,11 @@ package blobfactory_test import ( "testing" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/test/util/blobfactory" - "github.com/celestiaorg/celestia-app/v2/test/util/testfactory" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/test/util/blobfactory" + "github.com/celestiaorg/celestia-app/v3/test/util/testfactory" + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" tmrand "github.com/tendermint/tendermint/libs/rand" diff --git a/test/util/blobfactory/test_util.go b/test/util/blobfactory/test_util.go index 868d5dcbce..0496ba1735 100644 --- a/test/util/blobfactory/test_util.go +++ b/test/util/blobfactory/test_util.go @@ -1,9 +1,9 @@ package blobfactory import ( - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/pkg/user" - "github.com/celestiaorg/celestia-app/v2/test/util/testfactory" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/user" + "github.com/celestiaorg/celestia-app/v3/test/util/testfactory" sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" tmrand "github.com/tendermint/tendermint/libs/rand" diff --git a/test/util/blobfactory/test_util_test.go b/test/util/blobfactory/test_util_test.go index df8e864378..586bce0501 100644 --- a/test/util/blobfactory/test_util_test.go +++ b/test/util/blobfactory/test_util_test.go @@ -3,13 +3,13 @@ package blobfactory_test import ( "testing" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/pkg/user" - "github.com/celestiaorg/celestia-app/v2/test/util/blobfactory" - "github.com/celestiaorg/celestia-app/v2/test/util/testfactory" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/user" + "github.com/celestiaorg/celestia-app/v3/test/util/blobfactory" + "github.com/celestiaorg/celestia-app/v3/test/util/testfactory" + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" tmrand "github.com/tendermint/tendermint/libs/rand" diff --git a/test/util/common.go b/test/util/common.go index e4fa050661..3b0cfcea52 100644 --- a/test/util/common.go +++ b/test/util/common.go @@ -5,12 +5,12 @@ import ( "testing" "time" - "github.com/celestiaorg/celestia-app/v2/x/blobstream" + "github.com/celestiaorg/celestia-app/v3/x/blobstream" cosmosmath "cosmossdk.io/math" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/x/blobstream/keeper" - blobstreamtypes "github.com/celestiaorg/celestia-app/v2/x/blobstream/types" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/x/blobstream/keeper" + blobstreamtypes "github.com/celestiaorg/celestia-app/v3/x/blobstream/types" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" ccodec "github.com/cosmos/cosmos-sdk/crypto/codec" diff --git a/test/util/direct_tx_gen.go b/test/util/direct_tx_gen.go index ef0b47c24b..87372e7f5d 100644 --- a/test/util/direct_tx_gen.go +++ b/test/util/direct_tx_gen.go @@ -6,11 +6,11 @@ import ( tmrand "github.com/tendermint/tendermint/libs/rand" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/pkg/user" - "github.com/celestiaorg/celestia-app/v2/test/util/blobfactory" - "github.com/celestiaorg/celestia-app/v2/test/util/testfactory" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/user" + "github.com/celestiaorg/celestia-app/v3/test/util/blobfactory" + "github.com/celestiaorg/celestia-app/v3/test/util/testfactory" "github.com/celestiaorg/go-square/blob" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/crypto/keyring" diff --git a/test/util/genesis/accounts.go b/test/util/genesis/accounts.go index 94c0b83610..a6942edc54 100644 --- a/test/util/genesis/accounts.go +++ b/test/util/genesis/accounts.go @@ -6,8 +6,8 @@ import ( mrand "math/rand" "time" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" "github.com/cosmos/cosmos-sdk/client/tx" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/cosmos/cosmos-sdk/crypto/keyring" diff --git a/test/util/genesis/document.go b/test/util/genesis/document.go index 3823e10be8..3cc61f08b9 100644 --- a/test/util/genesis/document.go +++ b/test/util/genesis/document.go @@ -5,9 +5,9 @@ import ( "fmt" "time" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" diff --git a/test/util/genesis/genesis.go b/test/util/genesis/genesis.go index 80a14d11ea..5a52fdbb29 100644 --- a/test/util/genesis/genesis.go +++ b/test/util/genesis/genesis.go @@ -6,8 +6,8 @@ import ( "fmt" "time" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" "github.com/cosmos/cosmos-sdk/crypto/hd" "github.com/cosmos/cosmos-sdk/crypto/keyring" sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/test/util/genesis/modifier.go b/test/util/genesis/modifier.go index b7a419b848..d59e21d1fd 100644 --- a/test/util/genesis/modifier.go +++ b/test/util/genesis/modifier.go @@ -4,9 +4,9 @@ import ( "encoding/json" "time" - "github.com/celestiaorg/celestia-app/v2/app" - blobtypes "github.com/celestiaorg/celestia-app/v2/x/blob/types" - bstypes "github.com/celestiaorg/celestia-app/v2/x/blobstream/types" + "github.com/celestiaorg/celestia-app/v3/app" + blobtypes "github.com/celestiaorg/celestia-app/v3/x/blob/types" + bstypes "github.com/celestiaorg/celestia-app/v3/x/blobstream/types" "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" diff --git a/test/util/malicious/app.go b/test/util/malicious/app.go index 9212e966d7..2b708a08f0 100644 --- a/test/util/malicious/app.go +++ b/test/util/malicious/app.go @@ -3,8 +3,8 @@ package malicious import ( "io" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" "github.com/cosmos/cosmos-sdk/baseapp" servertypes "github.com/cosmos/cosmos-sdk/server/types" abci "github.com/tendermint/tendermint/abci/types" diff --git a/test/util/malicious/app_test.go b/test/util/malicious/app_test.go index c14ec79df4..5aee076304 100644 --- a/test/util/malicious/app_test.go +++ b/test/util/malicious/app_test.go @@ -3,12 +3,12 @@ package malicious import ( "testing" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/pkg/da" - "github.com/celestiaorg/celestia-app/v2/pkg/wrapper" - "github.com/celestiaorg/celestia-app/v2/test/util/blobfactory" - "github.com/celestiaorg/celestia-app/v2/test/util/testfactory" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/da" + "github.com/celestiaorg/celestia-app/v3/pkg/wrapper" + "github.com/celestiaorg/celestia-app/v3/test/util/blobfactory" + "github.com/celestiaorg/celestia-app/v3/test/util/testfactory" + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" "github.com/celestiaorg/go-square/shares" "github.com/celestiaorg/go-square/square" "github.com/stretchr/testify/require" diff --git a/test/util/malicious/out_of_order_builder.go b/test/util/malicious/out_of_order_builder.go index bf744c09c7..6f98c1e4a2 100644 --- a/test/util/malicious/out_of_order_builder.go +++ b/test/util/malicious/out_of_order_builder.go @@ -5,7 +5,7 @@ import ( "fmt" "sort" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" "github.com/celestiaorg/go-square/blob" "github.com/celestiaorg/go-square/inclusion" "github.com/celestiaorg/go-square/namespace" diff --git a/test/util/malicious/out_of_order_prepare.go b/test/util/malicious/out_of_order_prepare.go index 63c4fbb39d..50ea5660da 100644 --- a/test/util/malicious/out_of_order_prepare.go +++ b/test/util/malicious/out_of_order_prepare.go @@ -1,9 +1,9 @@ package malicious import ( - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/ante" - "github.com/celestiaorg/celestia-app/v2/pkg/da" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/ante" + "github.com/celestiaorg/celestia-app/v3/pkg/da" "github.com/celestiaorg/go-square/shares" abci "github.com/tendermint/tendermint/abci/types" core "github.com/tendermint/tendermint/proto/tendermint/types" diff --git a/test/util/malicious/test_app.go b/test/util/malicious/test_app.go index 35943f611f..a8988f9977 100644 --- a/test/util/malicious/test_app.go +++ b/test/util/malicious/test_app.go @@ -4,10 +4,10 @@ import ( "io" "path/filepath" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/test/util" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/test/util" + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/server" diff --git a/test/util/malicious/tree.go b/test/util/malicious/tree.go index 03ac8faf4a..cb2c4528ca 100644 --- a/test/util/malicious/tree.go +++ b/test/util/malicious/tree.go @@ -3,8 +3,8 @@ package malicious import ( "fmt" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/pkg/wrapper" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/wrapper" "github.com/celestiaorg/go-square/shares" "github.com/celestiaorg/go-square/square" "github.com/celestiaorg/nmt" diff --git a/test/util/sdkutil/proposals.go b/test/util/sdkutil/proposals.go index 515ada09ae..46f5e93f85 100644 --- a/test/util/sdkutil/proposals.go +++ b/test/util/sdkutil/proposals.go @@ -3,7 +3,7 @@ package sdkutil import ( "fmt" - blobtypes "github.com/celestiaorg/celestia-app/v2/x/blob/types" + blobtypes "github.com/celestiaorg/celestia-app/v3/x/blob/types" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/x/params/types/proposal" diff --git a/test/util/test_app.go b/test/util/test_app.go index a4ca8e6208..2a9acf2bab 100644 --- a/test/util/test_app.go +++ b/test/util/test_app.go @@ -6,14 +6,14 @@ import ( "testing" "time" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - v1 "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/v1" - v2 "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/v2" - "github.com/celestiaorg/celestia-app/v2/test/util/genesis" - "github.com/celestiaorg/celestia-app/v2/test/util/testfactory" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + v1 "github.com/celestiaorg/celestia-app/v3/pkg/appconsts/v1" + v2 "github.com/celestiaorg/celestia-app/v3/pkg/appconsts/v2" + "github.com/celestiaorg/celestia-app/v3/test/util/genesis" + "github.com/celestiaorg/celestia-app/v3/test/util/testfactory" + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" diff --git a/test/util/testfactory/blob.go b/test/util/testfactory/blob.go index 9b250eb40f..ddbf9c5edc 100644 --- a/test/util/testfactory/blob.go +++ b/test/util/testfactory/blob.go @@ -4,7 +4,7 @@ import ( "bytes" "encoding/binary" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" "github.com/celestiaorg/go-square/blob" appns "github.com/celestiaorg/go-square/namespace" tmrand "github.com/tendermint/tendermint/libs/rand" diff --git a/test/util/testfactory/common.go b/test/util/testfactory/common.go index a25a9002b8..9f9ea65fc9 100644 --- a/test/util/testfactory/common.go +++ b/test/util/testfactory/common.go @@ -4,7 +4,7 @@ import ( "bytes" "sort" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" "github.com/celestiaorg/go-square/namespace" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/crypto/hd" diff --git a/test/util/testfactory/common_test.go b/test/util/testfactory/common_test.go index 2ce3197318..c485125a9b 100644 --- a/test/util/testfactory/common_test.go +++ b/test/util/testfactory/common_test.go @@ -3,10 +3,10 @@ package testfactory_test import ( "testing" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/test/util/testfactory" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/test/util/testfactory" + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" "github.com/stretchr/testify/require" ) diff --git a/test/util/testnode/config.go b/test/util/testnode/config.go index efaaf10ac6..cbeaf22d2a 100644 --- a/test/util/testnode/config.go +++ b/test/util/testnode/config.go @@ -5,10 +5,10 @@ import ( "io" "time" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/test/util/genesis" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/test/util/genesis" "github.com/cosmos/cosmos-sdk/baseapp" srvconfig "github.com/cosmos/cosmos-sdk/server/config" srvtypes "github.com/cosmos/cosmos-sdk/server/types" diff --git a/test/util/testnode/full_node_test.go b/test/util/testnode/full_node_test.go index b217ffeee7..68d4328330 100644 --- a/test/util/testnode/full_node_test.go +++ b/test/util/testnode/full_node_test.go @@ -6,11 +6,11 @@ import ( "testing" "time" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/test/util/genesis" - blobtypes "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/test/util/genesis" + blobtypes "github.com/celestiaorg/celestia-app/v3/x/blob/types" appns "github.com/celestiaorg/go-square/namespace" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/stretchr/testify/require" diff --git a/test/util/testnode/network.go b/test/util/testnode/network.go index aec39cbc4c..34a013a524 100644 --- a/test/util/testnode/network.go +++ b/test/util/testnode/network.go @@ -5,7 +5,7 @@ import ( "net" "testing" - "github.com/celestiaorg/celestia-app/v2/test/util/genesis" + "github.com/celestiaorg/celestia-app/v3/test/util/genesis" "github.com/stretchr/testify/require" ) diff --git a/test/util/testnode/node_interaction_api.go b/test/util/testnode/node_interaction_api.go index 44d997ea5a..2d44015d1f 100644 --- a/test/util/testnode/node_interaction_api.go +++ b/test/util/testnode/node_interaction_api.go @@ -7,12 +7,12 @@ import ( "strings" "time" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/pkg/user" - "github.com/celestiaorg/celestia-app/v2/test/util/blobfactory" - "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/user" + "github.com/celestiaorg/celestia-app/v3/test/util/blobfactory" + "github.com/celestiaorg/celestia-app/v3/x/blob/types" "github.com/celestiaorg/go-square/blob" appns "github.com/celestiaorg/go-square/namespace" "github.com/celestiaorg/go-square/shares" diff --git a/test/util/testnode/read.go b/test/util/testnode/read.go index 1e5983480c..05dc491a9a 100644 --- a/test/util/testnode/read.go +++ b/test/util/testnode/read.go @@ -4,8 +4,8 @@ import ( "context" "fmt" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" "github.com/celestiaorg/go-square/blob" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/tendermint/tendermint/rpc/client/http" diff --git a/test/util/testnode/rpc_client.go b/test/util/testnode/rpc_client.go index fdf4086783..835ced0eb5 100644 --- a/test/util/testnode/rpc_client.go +++ b/test/util/testnode/rpc_client.go @@ -7,7 +7,7 @@ import ( "strings" "time" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/server/api" srvconfig "github.com/cosmos/cosmos-sdk/server/config" diff --git a/test/util/testnode/signer.go b/test/util/testnode/signer.go index b7227792c8..65e8128b20 100644 --- a/test/util/testnode/signer.go +++ b/test/util/testnode/signer.go @@ -1,11 +1,11 @@ package testnode import ( - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/pkg/user" - "github.com/celestiaorg/celestia-app/v2/test/util/testfactory" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/user" + "github.com/celestiaorg/celestia-app/v3/test/util/testfactory" ) func NewOfflineSigner() (*user.Signer, error) { diff --git a/test/util/testnode/utils.go b/test/util/testnode/utils.go index bcdabcfa55..bf71aaa951 100644 --- a/test/util/testnode/utils.go +++ b/test/util/testnode/utils.go @@ -4,10 +4,10 @@ import ( "context" "encoding/hex" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/test/util/testfactory" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/test/util/testfactory" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/crypto/hd" "github.com/cosmos/cosmos-sdk/crypto/keyring" diff --git a/tools/blockscan/main.go b/tools/blockscan/main.go index b880f52df6..c1f683054c 100644 --- a/tools/blockscan/main.go +++ b/tools/blockscan/main.go @@ -9,7 +9,7 @@ import ( "os/signal" "strconv" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" sdk "github.com/cosmos/cosmos-sdk/types" authsigning "github.com/cosmos/cosmos-sdk/x/auth/signing" "github.com/tendermint/tendermint/rpc/client/http" diff --git a/x/blob/ante/ante.go b/x/blob/ante/ante.go index 55aa8a1f40..fe58eae87c 100644 --- a/x/blob/ante/ante.go +++ b/x/blob/ante/ante.go @@ -1,7 +1,7 @@ package ante import ( - "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/x/blob/types" "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/x/blob/ante/ante_test.go b/x/blob/ante/ante_test.go index a45dcbf9ce..0f7bf39b02 100644 --- a/x/blob/ante/ante_test.go +++ b/x/blob/ante/ante_test.go @@ -3,11 +3,11 @@ package ante_test import ( "testing" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - ante "github.com/celestiaorg/celestia-app/v2/x/blob/ante" - blob "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + ante "github.com/celestiaorg/celestia-app/v3/x/blob/ante" + blob "github.com/celestiaorg/celestia-app/v3/x/blob/types" "github.com/celestiaorg/go-square/shares" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" diff --git a/x/blob/ante/blob_share_decorator.go b/x/blob/ante/blob_share_decorator.go index 68c361bc16..40c9c7c9cc 100644 --- a/x/blob/ante/blob_share_decorator.go +++ b/x/blob/ante/blob_share_decorator.go @@ -1,9 +1,9 @@ package ante import ( - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - v1 "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/v1" - blobtypes "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + v1 "github.com/celestiaorg/celestia-app/v3/pkg/appconsts/v1" + blobtypes "github.com/celestiaorg/celestia-app/v3/x/blob/types" "github.com/celestiaorg/go-square/shares" "cosmossdk.io/errors" diff --git a/x/blob/ante/blob_share_decorator_test.go b/x/blob/ante/blob_share_decorator_test.go index ec6f73e703..77b2bcfda6 100644 --- a/x/blob/ante/blob_share_decorator_test.go +++ b/x/blob/ante/blob_share_decorator_test.go @@ -3,12 +3,12 @@ package ante_test import ( "testing" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - v1 "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/v1" - v2 "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/v2" - ante "github.com/celestiaorg/celestia-app/v2/x/blob/ante" - blob "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + v1 "github.com/celestiaorg/celestia-app/v3/pkg/appconsts/v1" + v2 "github.com/celestiaorg/celestia-app/v3/pkg/appconsts/v2" + ante "github.com/celestiaorg/celestia-app/v3/x/blob/ante" + blob "github.com/celestiaorg/celestia-app/v3/x/blob/types" "github.com/celestiaorg/go-square/shares" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/assert" diff --git a/x/blob/ante/max_total_blob_size_ante.go b/x/blob/ante/max_total_blob_size_ante.go index 7c947fd059..c92be31996 100644 --- a/x/blob/ante/max_total_blob_size_ante.go +++ b/x/blob/ante/max_total_blob_size_ante.go @@ -2,9 +2,9 @@ package ante import ( "cosmossdk.io/errors" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - v1 "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/v1" - blobtypes "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + v1 "github.com/celestiaorg/celestia-app/v3/pkg/appconsts/v1" + blobtypes "github.com/celestiaorg/celestia-app/v3/x/blob/types" "github.com/celestiaorg/go-square/shares" sdk "github.com/cosmos/cosmos-sdk/types" ) diff --git a/x/blob/ante/max_total_blob_size_ante_test.go b/x/blob/ante/max_total_blob_size_ante_test.go index 296971eadd..fc14f21d0a 100644 --- a/x/blob/ante/max_total_blob_size_ante_test.go +++ b/x/blob/ante/max_total_blob_size_ante_test.go @@ -3,12 +3,12 @@ package ante_test import ( "testing" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - v1 "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/v1" - v2 "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/v2" - ante "github.com/celestiaorg/celestia-app/v2/x/blob/ante" - blob "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + v1 "github.com/celestiaorg/celestia-app/v3/pkg/appconsts/v1" + v2 "github.com/celestiaorg/celestia-app/v3/pkg/appconsts/v2" + ante "github.com/celestiaorg/celestia-app/v3/x/blob/ante" + blob "github.com/celestiaorg/celestia-app/v3/x/blob/types" "github.com/celestiaorg/go-square/shares" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/assert" diff --git a/x/blob/client/cli/payforblob.go b/x/blob/client/cli/payforblob.go index 76ff9d6926..667d9e3969 100644 --- a/x/blob/client/cli/payforblob.go +++ b/x/blob/client/cli/payforblob.go @@ -11,8 +11,8 @@ import ( "github.com/spf13/cobra" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/x/blob/types" "github.com/celestiaorg/go-square/blob" appns "github.com/celestiaorg/go-square/namespace" "github.com/cosmos/cosmos-sdk/client" diff --git a/x/blob/client/cli/query.go b/x/blob/client/cli/query.go index db38daefa8..720df7ce32 100644 --- a/x/blob/client/cli/query.go +++ b/x/blob/client/cli/query.go @@ -3,7 +3,7 @@ package cli import ( "fmt" - "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/x/blob/types" "github.com/cosmos/cosmos-sdk/client" "github.com/spf13/cobra" ) diff --git a/x/blob/client/cli/query_params.go b/x/blob/client/cli/query_params.go index e25709bed8..b07c97dd02 100644 --- a/x/blob/client/cli/query_params.go +++ b/x/blob/client/cli/query_params.go @@ -3,7 +3,7 @@ package cli import ( "context" - "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/x/blob/types" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/spf13/cobra" diff --git a/x/blob/client/cli/tx.go b/x/blob/client/cli/tx.go index 0b916aee3f..2ac38a5852 100644 --- a/x/blob/client/cli/tx.go +++ b/x/blob/client/cli/tx.go @@ -3,7 +3,7 @@ package cli import ( "fmt" - "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/x/blob/types" "github.com/cosmos/cosmos-sdk/client" "github.com/spf13/cobra" ) diff --git a/x/blob/client/testutil/integration_test.go b/x/blob/client/testutil/integration_test.go index 4adc9cf52a..6ff896a189 100644 --- a/x/blob/client/testutil/integration_test.go +++ b/x/blob/client/testutil/integration_test.go @@ -15,11 +15,11 @@ import ( clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/x/blob/types" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" - paycli "github.com/celestiaorg/celestia-app/v2/x/blob/client/cli" + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" + paycli "github.com/celestiaorg/celestia-app/v3/x/blob/client/cli" appns "github.com/celestiaorg/go-square/namespace" abci "github.com/tendermint/tendermint/abci/types" ) diff --git a/x/blob/genesis.go b/x/blob/genesis.go index 8076f9eb9b..da8ae56a0a 100644 --- a/x/blob/genesis.go +++ b/x/blob/genesis.go @@ -1,8 +1,8 @@ package blob import ( - "github.com/celestiaorg/celestia-app/v2/x/blob/keeper" - "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/x/blob/keeper" + "github.com/celestiaorg/celestia-app/v3/x/blob/types" sdk "github.com/cosmos/cosmos-sdk/types" ) diff --git a/x/blob/handler.go b/x/blob/handler.go index d0ce2fb40d..c3669aecb3 100644 --- a/x/blob/handler.go +++ b/x/blob/handler.go @@ -4,8 +4,8 @@ import ( "fmt" "cosmossdk.io/errors" - "github.com/celestiaorg/celestia-app/v2/x/blob/keeper" - "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/x/blob/keeper" + "github.com/celestiaorg/celestia-app/v3/x/blob/types" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" ) diff --git a/x/blob/keeper/gas_test.go b/x/blob/keeper/gas_test.go index 06311a92f8..8c3b6c1c8c 100644 --- a/x/blob/keeper/gas_test.go +++ b/x/blob/keeper/gas_test.go @@ -3,8 +3,8 @@ package keeper_test import ( "testing" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/x/blob/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" diff --git a/x/blob/keeper/genesis_test.go b/x/blob/keeper/genesis_test.go index f791f9095d..d291deebf8 100644 --- a/x/blob/keeper/genesis_test.go +++ b/x/blob/keeper/genesis_test.go @@ -3,8 +3,8 @@ package keeper_test import ( "testing" - "github.com/celestiaorg/celestia-app/v2/x/blob" - "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/x/blob" + "github.com/celestiaorg/celestia-app/v3/x/blob/types" "github.com/stretchr/testify/require" ) diff --git a/x/blob/keeper/grpc_query.go b/x/blob/keeper/grpc_query.go index 0db537b1eb..f20fdd2dd5 100644 --- a/x/blob/keeper/grpc_query.go +++ b/x/blob/keeper/grpc_query.go @@ -1,7 +1,7 @@ package keeper import ( - "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/x/blob/types" ) var _ types.QueryServer = Keeper{} diff --git a/x/blob/keeper/grpc_query_params.go b/x/blob/keeper/grpc_query_params.go index 9e4708a6d8..79187352ad 100644 --- a/x/blob/keeper/grpc_query_params.go +++ b/x/blob/keeper/grpc_query_params.go @@ -3,7 +3,7 @@ package keeper import ( "context" - "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/x/blob/types" sdk "github.com/cosmos/cosmos-sdk/types" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" diff --git a/x/blob/keeper/grpc_query_params_test.go b/x/blob/keeper/grpc_query_params_test.go index a531d173fd..70f60860ee 100644 --- a/x/blob/keeper/grpc_query_params_test.go +++ b/x/blob/keeper/grpc_query_params_test.go @@ -3,7 +3,7 @@ package keeper_test import ( "testing" - "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/x/blob/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" ) diff --git a/x/blob/keeper/keeper.go b/x/blob/keeper/keeper.go index 871c947634..72a3fb7605 100644 --- a/x/blob/keeper/keeper.go +++ b/x/blob/keeper/keeper.go @@ -4,7 +4,7 @@ import ( "context" "fmt" - "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/x/blob/types" "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" diff --git a/x/blob/keeper/keeper_test.go b/x/blob/keeper/keeper_test.go index c1c83959ad..1ad3fbb923 100644 --- a/x/blob/keeper/keeper_test.go +++ b/x/blob/keeper/keeper_test.go @@ -5,10 +5,10 @@ import ( "fmt" "testing" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - testutil "github.com/celestiaorg/celestia-app/v2/test/util" - "github.com/celestiaorg/celestia-app/v2/x/blob/keeper" - "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + testutil "github.com/celestiaorg/celestia-app/v3/test/util" + "github.com/celestiaorg/celestia-app/v3/x/blob/keeper" + "github.com/celestiaorg/celestia-app/v3/x/blob/types" "github.com/celestiaorg/go-square/blob" appns "github.com/celestiaorg/go-square/namespace" "github.com/cosmos/cosmos-sdk/codec" diff --git a/x/blob/keeper/msg_server.go b/x/blob/keeper/msg_server.go index 81ea4b1d62..02a4860452 100644 --- a/x/blob/keeper/msg_server.go +++ b/x/blob/keeper/msg_server.go @@ -1,7 +1,7 @@ package keeper import ( - "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/x/blob/types" ) var _ types.MsgServer = msgServer{} diff --git a/x/blob/keeper/params.go b/x/blob/keeper/params.go index e4e4eee3c1..c82ca3d9f2 100644 --- a/x/blob/keeper/params.go +++ b/x/blob/keeper/params.go @@ -1,7 +1,7 @@ package keeper import ( - "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/x/blob/types" sdk "github.com/cosmos/cosmos-sdk/types" ) diff --git a/x/blob/keeper/params_test.go b/x/blob/keeper/params_test.go index 0fc5d4c746..9431ef3828 100644 --- a/x/blob/keeper/params_test.go +++ b/x/blob/keeper/params_test.go @@ -3,7 +3,7 @@ package keeper_test import ( "testing" - "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/x/blob/types" "github.com/stretchr/testify/require" ) diff --git a/x/blob/module.go b/x/blob/module.go index a5414cbc3e..b8caa4c7c2 100644 --- a/x/blob/module.go +++ b/x/blob/module.go @@ -11,9 +11,9 @@ import ( abci "github.com/tendermint/tendermint/abci/types" - "github.com/celestiaorg/celestia-app/v2/x/blob/client/cli" - "github.com/celestiaorg/celestia-app/v2/x/blob/keeper" - "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/x/blob/client/cli" + "github.com/celestiaorg/celestia-app/v3/x/blob/keeper" + "github.com/celestiaorg/celestia-app/v3/x/blob/types" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" cdctypes "github.com/cosmos/cosmos-sdk/codec/types" diff --git a/x/blob/test/decode_blob_tx_test.go b/x/blob/test/decode_blob_tx_test.go index cc683b44f5..219b012ff9 100644 --- a/x/blob/test/decode_blob_tx_test.go +++ b/x/blob/test/decode_blob_tx_test.go @@ -9,9 +9,9 @@ import ( "strings" "testing" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - blobtypes "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + blobtypes "github.com/celestiaorg/celestia-app/v3/x/blob/types" "github.com/celestiaorg/go-square/blob" "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/assert" diff --git a/x/blob/types/blob_tx_test.go b/x/blob/types/blob_tx_test.go index 47e0bfea48..9b861273ee 100644 --- a/x/blob/types/blob_tx_test.go +++ b/x/blob/types/blob_tx_test.go @@ -4,13 +4,13 @@ import ( "bytes" "testing" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/test/util/blobfactory" - "github.com/celestiaorg/celestia-app/v2/test/util/testfactory" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" - "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/test/util/blobfactory" + "github.com/celestiaorg/celestia-app/v3/test/util/testfactory" + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" + "github.com/celestiaorg/celestia-app/v3/x/blob/types" "github.com/celestiaorg/go-square/blob" "github.com/celestiaorg/go-square/inclusion" "github.com/celestiaorg/go-square/merkle" diff --git a/x/blob/types/estimate_gas_test.go b/x/blob/types/estimate_gas_test.go index bb13c4b9ed..75a08b8c3d 100644 --- a/x/blob/types/estimate_gas_test.go +++ b/x/blob/types/estimate_gas_test.go @@ -4,17 +4,17 @@ import ( "fmt" "testing" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/pkg/user" - testutil "github.com/celestiaorg/celestia-app/v2/test/util" - "github.com/celestiaorg/celestia-app/v2/test/util/blobfactory" - "github.com/celestiaorg/celestia-app/v2/test/util/testfactory" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/user" + testutil "github.com/celestiaorg/celestia-app/v3/test/util" + "github.com/celestiaorg/celestia-app/v3/test/util/blobfactory" + "github.com/celestiaorg/celestia-app/v3/test/util/testfactory" "github.com/celestiaorg/go-square/blob" "github.com/stretchr/testify/require" - blobtypes "github.com/celestiaorg/celestia-app/v2/x/blob/types" + blobtypes "github.com/celestiaorg/celestia-app/v3/x/blob/types" abci "github.com/tendermint/tendermint/abci/types" tmrand "github.com/tendermint/tendermint/libs/rand" ) diff --git a/x/blob/types/genesis_test.go b/x/blob/types/genesis_test.go index 0f8364d88b..11af617e73 100644 --- a/x/blob/types/genesis_test.go +++ b/x/blob/types/genesis_test.go @@ -3,8 +3,8 @@ package types_test import ( "testing" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/x/blob/types" "github.com/stretchr/testify/require" ) diff --git a/x/blob/types/params.go b/x/blob/types/params.go index 3fc2bb724d..b9289c8940 100644 --- a/x/blob/types/params.go +++ b/x/blob/types/params.go @@ -3,7 +3,7 @@ package types import ( "fmt" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" "github.com/celestiaorg/go-square/shares" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" "gopkg.in/yaml.v2" diff --git a/x/blob/types/params_test.go b/x/blob/types/params_test.go index 5e77f9bc7d..f98e45ad17 100644 --- a/x/blob/types/params_test.go +++ b/x/blob/types/params_test.go @@ -3,7 +3,7 @@ package types import ( "testing" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" "github.com/stretchr/testify/assert" ) diff --git a/x/blob/types/payforblob.go b/x/blob/types/payforblob.go index 2ea0e07834..e1db0c7cf6 100644 --- a/x/blob/types/payforblob.go +++ b/x/blob/types/payforblob.go @@ -5,7 +5,7 @@ import ( "cosmossdk.io/errors" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" "github.com/celestiaorg/go-square/blob" "github.com/celestiaorg/go-square/inclusion" "github.com/celestiaorg/go-square/merkle" diff --git a/x/blob/types/payforblob_test.go b/x/blob/types/payforblob_test.go index a665c3da53..c5390acc35 100644 --- a/x/blob/types/payforblob_test.go +++ b/x/blob/types/payforblob_test.go @@ -5,10 +5,10 @@ import ( "testing" sdkerrors "cosmossdk.io/errors" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/test/util/testfactory" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" - "github.com/celestiaorg/celestia-app/v2/x/blob/types" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/test/util/testfactory" + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" + "github.com/celestiaorg/celestia-app/v3/x/blob/types" "github.com/celestiaorg/go-square/blob" "github.com/celestiaorg/go-square/inclusion" appns "github.com/celestiaorg/go-square/namespace" diff --git a/x/blobstream/abci.go b/x/blobstream/abci.go index d35b4e60ab..2110eacbc0 100644 --- a/x/blobstream/abci.go +++ b/x/blobstream/abci.go @@ -6,8 +6,8 @@ import ( sdkerrors "cosmossdk.io/errors" - "github.com/celestiaorg/celestia-app/v2/x/blobstream/keeper" - "github.com/celestiaorg/celestia-app/v2/x/blobstream/types" + "github.com/celestiaorg/celestia-app/v3/x/blobstream/keeper" + "github.com/celestiaorg/celestia-app/v3/x/blobstream/types" sdk "github.com/cosmos/cosmos-sdk/types" ) diff --git a/x/blobstream/abci_test.go b/x/blobstream/abci_test.go index ad54571ae8..16f0f9d575 100644 --- a/x/blobstream/abci_test.go +++ b/x/blobstream/abci_test.go @@ -4,13 +4,13 @@ import ( "testing" "time" - "github.com/celestiaorg/celestia-app/v2/x/blobstream" + "github.com/celestiaorg/celestia-app/v3/x/blobstream" - "github.com/celestiaorg/celestia-app/v2/x/blobstream/keeper" - "github.com/celestiaorg/celestia-app/v2/x/blobstream/types" + "github.com/celestiaorg/celestia-app/v3/x/blobstream/keeper" + "github.com/celestiaorg/celestia-app/v3/x/blobstream/types" - testutil "github.com/celestiaorg/celestia-app/v2/test/util" - "github.com/celestiaorg/celestia-app/v2/test/util/testfactory" + testutil "github.com/celestiaorg/celestia-app/v3/test/util" + "github.com/celestiaorg/celestia-app/v3/test/util/testfactory" "github.com/cosmos/cosmos-sdk/x/staking" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" "github.com/stretchr/testify/assert" diff --git a/x/blobstream/client/query.go b/x/blobstream/client/query.go index 04a37a50bb..cb1f25bdcc 100644 --- a/x/blobstream/client/query.go +++ b/x/blobstream/client/query.go @@ -5,7 +5,7 @@ import ( "fmt" "strconv" - "github.com/celestiaorg/celestia-app/v2/x/blobstream/types" + "github.com/celestiaorg/celestia-app/v3/x/blobstream/types" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" codectypes "github.com/cosmos/cosmos-sdk/codec/types" diff --git a/x/blobstream/client/query_test.go b/x/blobstream/client/query_test.go index 7a29df9a5b..4f1da37113 100644 --- a/x/blobstream/client/query_test.go +++ b/x/blobstream/client/query_test.go @@ -4,7 +4,7 @@ import ( "testing" "time" - "github.com/celestiaorg/celestia-app/v2/x/blobstream/client" + "github.com/celestiaorg/celestia-app/v3/x/blobstream/client" clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" ) diff --git a/x/blobstream/client/suite_test.go b/x/blobstream/client/suite_test.go index 78898ac3f7..a9be1c9903 100644 --- a/x/blobstream/client/suite_test.go +++ b/x/blobstream/client/suite_test.go @@ -3,8 +3,8 @@ package client_test import ( "testing" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" "github.com/stretchr/testify/suite" tmrand "github.com/tendermint/tendermint/libs/rand" ) diff --git a/x/blobstream/client/tx.go b/x/blobstream/client/tx.go index ca2fe5009a..fec3f528c1 100644 --- a/x/blobstream/client/tx.go +++ b/x/blobstream/client/tx.go @@ -3,7 +3,7 @@ package client import ( "fmt" - "github.com/celestiaorg/celestia-app/v2/x/blobstream/types" + "github.com/celestiaorg/celestia-app/v3/x/blobstream/types" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/client/tx" diff --git a/x/blobstream/client/verify.go b/x/blobstream/client/verify.go index 7cce38db70..8aa1896947 100644 --- a/x/blobstream/client/verify.go +++ b/x/blobstream/client/verify.go @@ -13,8 +13,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" wrapper "github.com/celestiaorg/blobstream-contracts/v3/wrappers/Blobstream.sol" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/x/blobstream/types" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/x/blobstream/types" "github.com/celestiaorg/go-square/square" "github.com/ethereum/go-ethereum/ethclient" "github.com/spf13/cobra" diff --git a/x/blobstream/genesis.go b/x/blobstream/genesis.go index a61b3d8000..d3136496eb 100644 --- a/x/blobstream/genesis.go +++ b/x/blobstream/genesis.go @@ -1,8 +1,8 @@ package blobstream import ( - "github.com/celestiaorg/celestia-app/v2/x/blobstream/keeper" - "github.com/celestiaorg/celestia-app/v2/x/blobstream/types" + "github.com/celestiaorg/celestia-app/v3/x/blobstream/keeper" + "github.com/celestiaorg/celestia-app/v3/x/blobstream/types" sdk "github.com/cosmos/cosmos-sdk/types" ) diff --git a/x/blobstream/integration_test.go b/x/blobstream/integration_test.go index c30d1ed439..08a96ecd56 100644 --- a/x/blobstream/integration_test.go +++ b/x/blobstream/integration_test.go @@ -3,13 +3,13 @@ package blobstream_test import ( "testing" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - "github.com/celestiaorg/celestia-app/v2/pkg/user" - "github.com/celestiaorg/celestia-app/v2/test/util/blobfactory" - "github.com/celestiaorg/celestia-app/v2/test/util/testfactory" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" - blobstreamtypes "github.com/celestiaorg/celestia-app/v2/x/blobstream/types" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/pkg/user" + "github.com/celestiaorg/celestia-app/v3/test/util/blobfactory" + "github.com/celestiaorg/celestia-app/v3/test/util/testfactory" + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" + blobstreamtypes "github.com/celestiaorg/celestia-app/v3/x/blobstream/types" sdk "github.com/cosmos/cosmos-sdk/types" staking "github.com/cosmos/cosmos-sdk/x/staking/types" gethcommon "github.com/ethereum/go-ethereum/common" diff --git a/x/blobstream/keeper/hooks.go b/x/blobstream/keeper/hooks.go index 38aaaa691c..4c106e8b76 100644 --- a/x/blobstream/keeper/hooks.go +++ b/x/blobstream/keeper/hooks.go @@ -2,7 +2,7 @@ package keeper import ( "cosmossdk.io/errors" - "github.com/celestiaorg/celestia-app/v2/x/blobstream/types" + "github.com/celestiaorg/celestia-app/v3/x/blobstream/types" sdk "github.com/cosmos/cosmos-sdk/types" ) diff --git a/x/blobstream/keeper/hooks_test.go b/x/blobstream/keeper/hooks_test.go index e8e769074d..5fa9fb7c17 100644 --- a/x/blobstream/keeper/hooks_test.go +++ b/x/blobstream/keeper/hooks_test.go @@ -3,7 +3,7 @@ package keeper_test import ( "testing" - "github.com/celestiaorg/celestia-app/v2/test/util" + "github.com/celestiaorg/celestia-app/v3/test/util" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/assert" diff --git a/x/blobstream/keeper/keeper.go b/x/blobstream/keeper/keeper.go index e63c0b66e8..70c7820b02 100644 --- a/x/blobstream/keeper/keeper.go +++ b/x/blobstream/keeper/keeper.go @@ -4,7 +4,7 @@ import ( "encoding/binary" "fmt" - "github.com/celestiaorg/celestia-app/v2/x/blobstream/types" + "github.com/celestiaorg/celestia-app/v3/x/blobstream/types" "github.com/cosmos/cosmos-sdk/codec" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/x/blobstream/keeper/keeper_attestation.go b/x/blobstream/keeper/keeper_attestation.go index ed25417ddd..d2d186934d 100644 --- a/x/blobstream/keeper/keeper_attestation.go +++ b/x/blobstream/keeper/keeper_attestation.go @@ -3,7 +3,7 @@ package keeper import ( "fmt" - "github.com/celestiaorg/celestia-app/v2/x/blobstream/types" + "github.com/celestiaorg/celestia-app/v3/x/blobstream/types" sdk "github.com/cosmos/cosmos-sdk/types" ) diff --git a/x/blobstream/keeper/keeper_attestation_test.go b/x/blobstream/keeper/keeper_attestation_test.go index 107c446fc5..947d774da8 100644 --- a/x/blobstream/keeper/keeper_attestation_test.go +++ b/x/blobstream/keeper/keeper_attestation_test.go @@ -3,8 +3,8 @@ package keeper_test import ( "testing" - testutil "github.com/celestiaorg/celestia-app/v2/test/util" - "github.com/celestiaorg/celestia-app/v2/x/blobstream" + testutil "github.com/celestiaorg/celestia-app/v3/test/util" + "github.com/celestiaorg/celestia-app/v3/x/blobstream" "github.com/stretchr/testify/assert" ) diff --git a/x/blobstream/keeper/keeper_data_commitment.go b/x/blobstream/keeper/keeper_data_commitment.go index 6795f79f89..0b0d656992 100644 --- a/x/blobstream/keeper/keeper_data_commitment.go +++ b/x/blobstream/keeper/keeper_data_commitment.go @@ -4,7 +4,7 @@ import ( "fmt" "cosmossdk.io/errors" - "github.com/celestiaorg/celestia-app/v2/x/blobstream/types" + "github.com/celestiaorg/celestia-app/v3/x/blobstream/types" sdk "github.com/cosmos/cosmos-sdk/types" ) diff --git a/x/blobstream/keeper/keeper_data_commitment_test.go b/x/blobstream/keeper/keeper_data_commitment_test.go index 52510b5654..6bb3b446cb 100644 --- a/x/blobstream/keeper/keeper_data_commitment_test.go +++ b/x/blobstream/keeper/keeper_data_commitment_test.go @@ -3,10 +3,10 @@ package keeper_test import ( "testing" - "github.com/celestiaorg/celestia-app/v2/x/blobstream" + "github.com/celestiaorg/celestia-app/v3/x/blobstream" - testutil "github.com/celestiaorg/celestia-app/v2/test/util" - "github.com/celestiaorg/celestia-app/v2/x/blobstream/types" + testutil "github.com/celestiaorg/celestia-app/v3/test/util" + "github.com/celestiaorg/celestia-app/v3/x/blobstream/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/x/blobstream/keeper/keeper_valset.go b/x/blobstream/keeper/keeper_valset.go index cb8897ddd4..2c699eb16c 100644 --- a/x/blobstream/keeper/keeper_valset.go +++ b/x/blobstream/keeper/keeper_valset.go @@ -7,7 +7,7 @@ import ( "cosmossdk.io/errors" cosmosmath "cosmossdk.io/math" - "github.com/celestiaorg/celestia-app/v2/x/blobstream/types" + "github.com/celestiaorg/celestia-app/v3/x/blobstream/types" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" gethcommon "github.com/ethereum/go-ethereum/common" diff --git a/x/blobstream/keeper/keeper_valset_test.go b/x/blobstream/keeper/keeper_valset_test.go index 4a00d20188..d4b72406bf 100644 --- a/x/blobstream/keeper/keeper_valset_test.go +++ b/x/blobstream/keeper/keeper_valset_test.go @@ -5,10 +5,10 @@ import ( "errors" "testing" - "github.com/celestiaorg/celestia-app/v2/x/blobstream" + "github.com/celestiaorg/celestia-app/v3/x/blobstream" - testutil "github.com/celestiaorg/celestia-app/v2/test/util" - "github.com/celestiaorg/celestia-app/v2/x/blobstream/types" + testutil "github.com/celestiaorg/celestia-app/v3/test/util" + "github.com/celestiaorg/celestia-app/v3/x/blobstream/types" "github.com/cosmos/cosmos-sdk/x/staking" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" gethcommon "github.com/ethereum/go-ethereum/common" diff --git a/x/blobstream/keeper/msg_server.go b/x/blobstream/keeper/msg_server.go index c9de3174c2..66135b2d71 100644 --- a/x/blobstream/keeper/msg_server.go +++ b/x/blobstream/keeper/msg_server.go @@ -4,7 +4,7 @@ import ( "context" "cosmossdk.io/errors" - "github.com/celestiaorg/celestia-app/v2/x/blobstream/types" + "github.com/celestiaorg/celestia-app/v3/x/blobstream/types" sdk "github.com/cosmos/cosmos-sdk/types" staking "github.com/cosmos/cosmos-sdk/x/staking/types" gethcommon "github.com/ethereum/go-ethereum/common" diff --git a/x/blobstream/keeper/msg_server_test.go b/x/blobstream/keeper/msg_server_test.go index 13d47b430b..af9dee5627 100644 --- a/x/blobstream/keeper/msg_server_test.go +++ b/x/blobstream/keeper/msg_server_test.go @@ -3,8 +3,8 @@ package keeper_test import ( "testing" - testutil "github.com/celestiaorg/celestia-app/v2/test/util" - "github.com/celestiaorg/celestia-app/v2/x/blobstream/types" + testutil "github.com/celestiaorg/celestia-app/v3/test/util" + "github.com/celestiaorg/celestia-app/v3/x/blobstream/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/require" diff --git a/x/blobstream/keeper/query_attestation.go b/x/blobstream/keeper/query_attestation.go index 60069e73ff..dc62e89bd6 100644 --- a/x/blobstream/keeper/query_attestation.go +++ b/x/blobstream/keeper/query_attestation.go @@ -5,7 +5,7 @@ import ( codectypes "github.com/cosmos/cosmos-sdk/codec/types" - "github.com/celestiaorg/celestia-app/v2/x/blobstream/types" + "github.com/celestiaorg/celestia-app/v3/x/blobstream/types" sdk "github.com/cosmos/cosmos-sdk/types" ) diff --git a/x/blobstream/keeper/query_data_commitment.go b/x/blobstream/keeper/query_data_commitment.go index 7028270c7c..442d2365a5 100644 --- a/x/blobstream/keeper/query_data_commitment.go +++ b/x/blobstream/keeper/query_data_commitment.go @@ -3,7 +3,7 @@ package keeper import ( "context" - "github.com/celestiaorg/celestia-app/v2/x/blobstream/types" + "github.com/celestiaorg/celestia-app/v3/x/blobstream/types" sdk "github.com/cosmos/cosmos-sdk/types" ) diff --git a/x/blobstream/keeper/query_general.go b/x/blobstream/keeper/query_general.go index a7bd3672df..b95b3ad05f 100644 --- a/x/blobstream/keeper/query_general.go +++ b/x/blobstream/keeper/query_general.go @@ -3,7 +3,7 @@ package keeper import ( "context" - "github.com/celestiaorg/celestia-app/v2/x/blobstream/types" + "github.com/celestiaorg/celestia-app/v3/x/blobstream/types" sdk "github.com/cosmos/cosmos-sdk/types" ) diff --git a/x/blobstream/keeper/query_valset.go b/x/blobstream/keeper/query_valset.go index f22b9fa2d1..a3ac644890 100644 --- a/x/blobstream/keeper/query_valset.go +++ b/x/blobstream/keeper/query_valset.go @@ -3,7 +3,7 @@ package keeper import ( "context" - "github.com/celestiaorg/celestia-app/v2/x/blobstream/types" + "github.com/celestiaorg/celestia-app/v3/x/blobstream/types" sdk "github.com/cosmos/cosmos-sdk/types" ) diff --git a/x/blobstream/module.go b/x/blobstream/module.go index a6669ec2f2..4e87731eeb 100644 --- a/x/blobstream/module.go +++ b/x/blobstream/module.go @@ -11,8 +11,8 @@ import ( abci "github.com/tendermint/tendermint/abci/types" - "github.com/celestiaorg/celestia-app/v2/x/blobstream/keeper" - "github.com/celestiaorg/celestia-app/v2/x/blobstream/types" + "github.com/celestiaorg/celestia-app/v3/x/blobstream/keeper" + "github.com/celestiaorg/celestia-app/v3/x/blobstream/types" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" cdctypes "github.com/cosmos/cosmos-sdk/codec/types" diff --git a/x/blobstream/types/genesis.go b/x/blobstream/types/genesis.go index 1a2213d575..4ebc365aa8 100644 --- a/x/blobstream/types/genesis.go +++ b/x/blobstream/types/genesis.go @@ -3,7 +3,7 @@ package types import ( "fmt" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" "cosmossdk.io/errors" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" diff --git a/x/blobstream/types/genesis_test.go b/x/blobstream/types/genesis_test.go index 3a9267213c..341b77982f 100644 --- a/x/blobstream/types/genesis_test.go +++ b/x/blobstream/types/genesis_test.go @@ -3,9 +3,9 @@ package types_test import ( "testing" - "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" + "github.com/celestiaorg/celestia-app/v3/pkg/appconsts" - "github.com/celestiaorg/celestia-app/v2/x/blobstream/types" + "github.com/celestiaorg/celestia-app/v3/x/blobstream/types" "github.com/stretchr/testify/require" ) diff --git a/x/blobstream/types/types_test.go b/x/blobstream/types/types_test.go index 98d2373e88..e9fbba2bc8 100644 --- a/x/blobstream/types/types_test.go +++ b/x/blobstream/types/types_test.go @@ -7,7 +7,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/celestiaorg/celestia-app/v2/x/blobstream/types" + "github.com/celestiaorg/celestia-app/v3/x/blobstream/types" gethcommon "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/assert" ) diff --git a/x/minfee/grpc_query_test.go b/x/minfee/grpc_query_test.go index 08f9e6e834..a7ab0fdfef 100644 --- a/x/minfee/grpc_query_test.go +++ b/x/minfee/grpc_query_test.go @@ -3,10 +3,10 @@ package minfee_test import ( "testing" - "github.com/celestiaorg/celestia-app/v2/app" - v2 "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/v2" - testutil "github.com/celestiaorg/celestia-app/v2/test/util" - "github.com/celestiaorg/celestia-app/v2/x/minfee" + "github.com/celestiaorg/celestia-app/v3/app" + v2 "github.com/celestiaorg/celestia-app/v3/pkg/appconsts/v2" + testutil "github.com/celestiaorg/celestia-app/v3/test/util" + "github.com/celestiaorg/celestia-app/v3/x/minfee" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" diff --git a/x/minfee/module_test.go b/x/minfee/module_test.go index 5a5ea953a9..d5cccb9c84 100644 --- a/x/minfee/module_test.go +++ b/x/minfee/module_test.go @@ -3,7 +3,7 @@ package minfee_test import ( "testing" - "github.com/celestiaorg/celestia-app/v2/x/minfee" + "github.com/celestiaorg/celestia-app/v3/x/minfee" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/store" diff --git a/x/minfee/params.go b/x/minfee/params.go index 42db4947ef..ef17044d7c 100644 --- a/x/minfee/params.go +++ b/x/minfee/params.go @@ -3,7 +3,7 @@ package minfee import ( "fmt" - v2 "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/v2" + v2 "github.com/celestiaorg/celestia-app/v3/pkg/appconsts/v2" sdk "github.com/cosmos/cosmos-sdk/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" ) diff --git a/x/mint/abci.go b/x/mint/abci.go index 08c3bee17c..8246de78c4 100644 --- a/x/mint/abci.go +++ b/x/mint/abci.go @@ -3,8 +3,8 @@ package mint import ( "time" - "github.com/celestiaorg/celestia-app/v2/x/mint/keeper" - "github.com/celestiaorg/celestia-app/v2/x/mint/types" + "github.com/celestiaorg/celestia-app/v3/x/mint/keeper" + "github.com/celestiaorg/celestia-app/v3/x/mint/types" "github.com/cosmos/cosmos-sdk/telemetry" sdk "github.com/cosmos/cosmos-sdk/types" ) diff --git a/x/mint/abci_test.go b/x/mint/abci_test.go index b4d9d09a5e..0a43c7c832 100644 --- a/x/mint/abci_test.go +++ b/x/mint/abci_test.go @@ -5,10 +5,10 @@ import ( "testing" "time" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/test/util" - "github.com/celestiaorg/celestia-app/v2/x/mint" - minttypes "github.com/celestiaorg/celestia-app/v2/x/mint/types" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/test/util" + "github.com/celestiaorg/celestia-app/v3/x/mint" + minttypes "github.com/celestiaorg/celestia-app/v3/x/mint/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/x/mint/client/cli/query.go b/x/mint/client/cli/query.go index 61357e5d08..e402c08e91 100644 --- a/x/mint/client/cli/query.go +++ b/x/mint/client/cli/query.go @@ -5,7 +5,7 @@ import ( "github.com/spf13/cobra" - "github.com/celestiaorg/celestia-app/v2/x/mint/types" + "github.com/celestiaorg/celestia-app/v3/x/mint/types" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" ) diff --git a/x/mint/client/testutil/grpc_test.go b/x/mint/client/testutil/grpc_test.go index b1736f42c5..84f993d6ef 100644 --- a/x/mint/client/testutil/grpc_test.go +++ b/x/mint/client/testutil/grpc_test.go @@ -10,8 +10,8 @@ import ( "github.com/gogo/protobuf/proto" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" - mint "github.com/celestiaorg/celestia-app/v2/x/mint/types" + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" + mint "github.com/celestiaorg/celestia-app/v3/x/mint/types" ) func (s *IntegrationTestSuite) TestQueryGRPC() { diff --git a/x/mint/client/testutil/suite_test.go b/x/mint/client/testutil/suite_test.go index 8e5cc8bf35..9be2f45fc8 100644 --- a/x/mint/client/testutil/suite_test.go +++ b/x/mint/client/testutil/suite_test.go @@ -9,13 +9,13 @@ import ( "github.com/stretchr/testify/suite" tmcli "github.com/tendermint/tendermint/libs/cli" - "github.com/celestiaorg/celestia-app/v2/x/mint/client/cli" - mint "github.com/celestiaorg/celestia-app/v2/x/mint/types" + "github.com/celestiaorg/celestia-app/v3/x/mint/client/cli" + mint "github.com/celestiaorg/celestia-app/v3/x/mint/types" "github.com/cosmos/cosmos-sdk/client/flags" clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" ) type IntegrationTestSuite struct { diff --git a/x/mint/keeper/genesis.go b/x/mint/keeper/genesis.go index 47944c3ce6..6714e36280 100644 --- a/x/mint/keeper/genesis.go +++ b/x/mint/keeper/genesis.go @@ -1,7 +1,7 @@ package keeper import ( - "github.com/celestiaorg/celestia-app/v2/x/mint/types" + "github.com/celestiaorg/celestia-app/v3/x/mint/types" sdk "github.com/cosmos/cosmos-sdk/types" ) diff --git a/x/mint/keeper/grpc_query.go b/x/mint/keeper/grpc_query.go index d735525d68..735e2cffd9 100644 --- a/x/mint/keeper/grpc_query.go +++ b/x/mint/keeper/grpc_query.go @@ -3,7 +3,7 @@ package keeper import ( "context" - "github.com/celestiaorg/celestia-app/v2/x/mint/types" + "github.com/celestiaorg/celestia-app/v3/x/mint/types" sdk "github.com/cosmos/cosmos-sdk/types" ) diff --git a/x/mint/keeper/grpc_query_test.go b/x/mint/keeper/grpc_query_test.go index b2e4ae7dae..0db925a124 100644 --- a/x/mint/keeper/grpc_query_test.go +++ b/x/mint/keeper/grpc_query_test.go @@ -7,9 +7,9 @@ import ( "github.com/stretchr/testify/suite" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - "github.com/celestiaorg/celestia-app/v2/app" - testutil "github.com/celestiaorg/celestia-app/v2/test/util" - "github.com/celestiaorg/celestia-app/v2/x/mint/types" + "github.com/celestiaorg/celestia-app/v3/app" + testutil "github.com/celestiaorg/celestia-app/v3/test/util" + "github.com/celestiaorg/celestia-app/v3/x/mint/types" "github.com/cosmos/cosmos-sdk/baseapp" sdk "github.com/cosmos/cosmos-sdk/types" ) diff --git a/x/mint/keeper/keeper.go b/x/mint/keeper/keeper.go index 4824ae1518..7c5201dc9b 100644 --- a/x/mint/keeper/keeper.go +++ b/x/mint/keeper/keeper.go @@ -4,7 +4,7 @@ import ( "cosmossdk.io/math" "github.com/tendermint/tendermint/libs/log" - "github.com/celestiaorg/celestia-app/v2/x/mint/types" + "github.com/celestiaorg/celestia-app/v3/x/mint/types" "github.com/cosmos/cosmos-sdk/codec" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/x/mint/module.go b/x/mint/module.go index ce46f06112..9371616748 100644 --- a/x/mint/module.go +++ b/x/mint/module.go @@ -9,10 +9,10 @@ import ( "github.com/spf13/cobra" abci "github.com/tendermint/tendermint/abci/types" - "github.com/celestiaorg/celestia-app/v2/x/mint/client/cli" - "github.com/celestiaorg/celestia-app/v2/x/mint/keeper" - "github.com/celestiaorg/celestia-app/v2/x/mint/simulation" - "github.com/celestiaorg/celestia-app/v2/x/mint/types" + "github.com/celestiaorg/celestia-app/v3/x/mint/client/cli" + "github.com/celestiaorg/celestia-app/v3/x/mint/keeper" + "github.com/celestiaorg/celestia-app/v3/x/mint/simulation" + "github.com/celestiaorg/celestia-app/v3/x/mint/types" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" cdctypes "github.com/cosmos/cosmos-sdk/codec/types" diff --git a/x/mint/module_test.go b/x/mint/module_test.go index 874cd6da65..d7b124e3ae 100644 --- a/x/mint/module_test.go +++ b/x/mint/module_test.go @@ -10,7 +10,7 @@ import ( tmproto "github.com/tendermint/tendermint/proto/tendermint/types" dbm "github.com/tendermint/tm-db" - "github.com/celestiaorg/celestia-app/v2/x/mint/types" + "github.com/celestiaorg/celestia-app/v3/x/mint/types" "github.com/cosmos/cosmos-sdk/simapp" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" ) diff --git a/x/mint/simulation/decoder.go b/x/mint/simulation/decoder.go index ab6ebaae4a..66460853e1 100644 --- a/x/mint/simulation/decoder.go +++ b/x/mint/simulation/decoder.go @@ -4,7 +4,7 @@ import ( "bytes" "fmt" - "github.com/celestiaorg/celestia-app/v2/x/mint/types" + "github.com/celestiaorg/celestia-app/v3/x/mint/types" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/types/kv" ) diff --git a/x/mint/simulation/decoder_test.go b/x/mint/simulation/decoder_test.go index 5ebce83b47..74a634db87 100644 --- a/x/mint/simulation/decoder_test.go +++ b/x/mint/simulation/decoder_test.go @@ -7,8 +7,8 @@ import ( "github.com/stretchr/testify/require" - "github.com/celestiaorg/celestia-app/v2/x/mint/simulation" - "github.com/celestiaorg/celestia-app/v2/x/mint/types" + "github.com/celestiaorg/celestia-app/v3/x/mint/simulation" + "github.com/celestiaorg/celestia-app/v3/x/mint/types" "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/kv" diff --git a/x/mint/test/mint_test.go b/x/mint/test/mint_test.go index 3df197cf5e..d86b7ad5d4 100644 --- a/x/mint/test/mint_test.go +++ b/x/mint/test/mint_test.go @@ -6,9 +6,9 @@ import ( "testing" "time" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" - minttypes "github.com/celestiaorg/celestia-app/v2/x/mint/types" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" + minttypes "github.com/celestiaorg/celestia-app/v3/x/mint/types" sdktypes "github.com/cosmos/cosmos-sdk/types" grpctypes "github.com/cosmos/cosmos-sdk/types/grpc" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" diff --git a/x/paramfilter/test/gov_params_test.go b/x/paramfilter/test/gov_params_test.go index c9c6b83efa..c3dfaca1f4 100644 --- a/x/paramfilter/test/gov_params_test.go +++ b/x/paramfilter/test/gov_params_test.go @@ -4,12 +4,12 @@ import ( "testing" "time" - "github.com/celestiaorg/celestia-app/v2/app" - testutil "github.com/celestiaorg/celestia-app/v2/test/util" - blobtypes "github.com/celestiaorg/celestia-app/v2/x/blob/types" - bsmoduletypes "github.com/celestiaorg/celestia-app/v2/x/blobstream/types" - minfeetypes "github.com/celestiaorg/celestia-app/v2/x/minfee" - "github.com/celestiaorg/celestia-app/v2/x/paramfilter" + "github.com/celestiaorg/celestia-app/v3/app" + testutil "github.com/celestiaorg/celestia-app/v3/test/util" + blobtypes "github.com/celestiaorg/celestia-app/v3/x/blob/types" + bsmoduletypes "github.com/celestiaorg/celestia-app/v3/x/blobstream/types" + minfeetypes "github.com/celestiaorg/celestia-app/v3/x/minfee" + "github.com/celestiaorg/celestia-app/v3/x/paramfilter" "github.com/cosmos/cosmos-sdk/baseapp" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" diff --git a/x/paramfilter/test/param_filter_test.go b/x/paramfilter/test/param_filter_test.go index e4f4696ab6..33b2c21630 100644 --- a/x/paramfilter/test/param_filter_test.go +++ b/x/paramfilter/test/param_filter_test.go @@ -3,9 +3,9 @@ package test import ( "testing" - "github.com/celestiaorg/celestia-app/v2/app" - testutil "github.com/celestiaorg/celestia-app/v2/test/util" - "github.com/celestiaorg/celestia-app/v2/x/paramfilter" + "github.com/celestiaorg/celestia-app/v3/app" + testutil "github.com/celestiaorg/celestia-app/v3/test/util" + "github.com/celestiaorg/celestia-app/v3/x/paramfilter" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/params/types/proposal" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" diff --git a/x/signal/cli/cli_test.go b/x/signal/cli/cli_test.go index 36471c6eb4..0fa3399037 100644 --- a/x/signal/cli/cli_test.go +++ b/x/signal/cli/cli_test.go @@ -3,8 +3,8 @@ package cli_test import ( "testing" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" - "github.com/celestiaorg/celestia-app/v2/x/signal/cli" + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" + "github.com/celestiaorg/celestia-app/v3/x/signal/cli" testutil "github.com/cosmos/cosmos-sdk/testutil/cli" "github.com/stretchr/testify/suite" ) diff --git a/x/signal/cli/query.go b/x/signal/cli/query.go index f703e8b3c4..a0548c8376 100644 --- a/x/signal/cli/query.go +++ b/x/signal/cli/query.go @@ -4,7 +4,7 @@ import ( "fmt" "strconv" - "github.com/celestiaorg/celestia-app/v2/x/signal/types" + "github.com/celestiaorg/celestia-app/v3/x/signal/types" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/spf13/cobra" diff --git a/x/signal/cli/tx.go b/x/signal/cli/tx.go index 9f021654af..0c3e49eeaa 100644 --- a/x/signal/cli/tx.go +++ b/x/signal/cli/tx.go @@ -4,7 +4,7 @@ import ( "fmt" "strconv" - "github.com/celestiaorg/celestia-app/v2/x/signal/types" + "github.com/celestiaorg/celestia-app/v3/x/signal/types" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/client/tx" diff --git a/x/signal/integration_test.go b/x/signal/integration_test.go index edd26c3fb5..434b9cf882 100644 --- a/x/signal/integration_test.go +++ b/x/signal/integration_test.go @@ -3,10 +3,10 @@ package signal_test import ( "testing" - "github.com/celestiaorg/celestia-app/v2/app" - testutil "github.com/celestiaorg/celestia-app/v2/test/util" - "github.com/celestiaorg/celestia-app/v2/x/signal" - "github.com/celestiaorg/celestia-app/v2/x/signal/types" + "github.com/celestiaorg/celestia-app/v3/app" + testutil "github.com/celestiaorg/celestia-app/v3/test/util" + "github.com/celestiaorg/celestia-app/v3/x/signal" + "github.com/celestiaorg/celestia-app/v3/x/signal/types" "github.com/stretchr/testify/require" sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/x/signal/keeper.go b/x/signal/keeper.go index a8a6632ac8..ed280c67f4 100644 --- a/x/signal/keeper.go +++ b/x/signal/keeper.go @@ -5,7 +5,7 @@ import ( "encoding/binary" sdkmath "cosmossdk.io/math" - "github.com/celestiaorg/celestia-app/v2/x/signal/types" + "github.com/celestiaorg/celestia-app/v3/x/signal/types" "github.com/cosmos/cosmos-sdk/codec" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/x/signal/keeper_test.go b/x/signal/keeper_test.go index c63dbdbc0e..a476562696 100644 --- a/x/signal/keeper_test.go +++ b/x/signal/keeper_test.go @@ -10,17 +10,17 @@ import ( "github.com/cosmos/cosmos-sdk/store" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - v1 "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/v1" - v2 "github.com/celestiaorg/celestia-app/v2/pkg/appconsts/v2" - "github.com/celestiaorg/celestia-app/v2/x/signal" - "github.com/celestiaorg/celestia-app/v2/x/signal/types" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + v1 "github.com/celestiaorg/celestia-app/v3/pkg/appconsts/v1" + v2 "github.com/celestiaorg/celestia-app/v3/pkg/appconsts/v2" + "github.com/celestiaorg/celestia-app/v3/x/signal" + "github.com/celestiaorg/celestia-app/v3/x/signal/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - testutil "github.com/celestiaorg/celestia-app/v2/test/util" + testutil "github.com/celestiaorg/celestia-app/v3/test/util" storetypes "github.com/cosmos/cosmos-sdk/store/types" "github.com/tendermint/tendermint/libs/log" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" diff --git a/x/signal/legacy_test.go b/x/signal/legacy_test.go index 84c70a554c..3c202cd50f 100644 --- a/x/signal/legacy_test.go +++ b/x/signal/legacy_test.go @@ -6,12 +6,12 @@ import ( "testing" "time" - "github.com/celestiaorg/celestia-app/v2/app" - "github.com/celestiaorg/celestia-app/v2/app/encoding" - testutil "github.com/celestiaorg/celestia-app/v2/test/util" - "github.com/celestiaorg/celestia-app/v2/test/util/blobfactory" - "github.com/celestiaorg/celestia-app/v2/test/util/genesis" - "github.com/celestiaorg/celestia-app/v2/test/util/testnode" + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + testutil "github.com/celestiaorg/celestia-app/v3/test/util" + "github.com/celestiaorg/celestia-app/v3/test/util/blobfactory" + "github.com/celestiaorg/celestia-app/v3/test/util/genesis" + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" "github.com/cosmos/cosmos-sdk/crypto/keyring" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" diff --git a/x/signal/module.go b/x/signal/module.go index 06a60b8f67..9423824e28 100644 --- a/x/signal/module.go +++ b/x/signal/module.go @@ -8,8 +8,8 @@ import ( "github.com/spf13/cobra" abci "github.com/tendermint/tendermint/abci/types" - "github.com/celestiaorg/celestia-app/v2/x/signal/cli" - "github.com/celestiaorg/celestia-app/v2/x/signal/types" + "github.com/celestiaorg/celestia-app/v3/x/signal/cli" + "github.com/celestiaorg/celestia-app/v3/x/signal/types" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" diff --git a/x/tokenfilter/ibc_middleware_test.go b/x/tokenfilter/ibc_middleware_test.go index 12b79cdb55..7bf4041476 100644 --- a/x/tokenfilter/ibc_middleware_test.go +++ b/x/tokenfilter/ibc_middleware_test.go @@ -11,7 +11,7 @@ import ( channeltypes "github.com/cosmos/ibc-go/v6/modules/core/04-channel/types" "github.com/cosmos/ibc-go/v6/modules/core/exported" - "github.com/celestiaorg/celestia-app/v2/x/tokenfilter" + "github.com/celestiaorg/celestia-app/v3/x/tokenfilter" ) func TestOnRecvPacket(t *testing.T) { From 72168c099c04d2e7e3bc5d1b408a1ddf8265376f Mon Sep 17 00:00:00 2001 From: Callum Waters Date: Tue, 23 Jul 2024 16:38:25 +0200 Subject: [PATCH 37/40] fix: start tx clients after nodes have started (#3719) Occasionally, txsim will start before the consensus node is operational and will thus return an error and fail. This PR changes the TxClients to start after all nodes are up and running This also adds backoff when waiting for nodes to come up --- test/e2e/simple.go | 5 ++--- test/e2e/testnet/testnet.go | 39 +++++++++++++++---------------------- 2 files changed, 18 insertions(+), 26 deletions(-) diff --git a/test/e2e/simple.go b/test/e2e/simple.go index 3bba82156e..2d64458068 100644 --- a/test/e2e/simple.go +++ b/test/e2e/simple.go @@ -31,7 +31,7 @@ func E2ESimple(logger *log.Logger) error { logger.Println("Creating txsim") endpoints, err := testNet.RemoteGRPCEndpoints() testnet.NoError("failed to get remote gRPC endpoints", err) - err = testNet.CreateTxClient("txsim", testnet.TxsimVersion, 1, "100-2000", 100, testnet.DefaultResources, endpoints[0]) + err = testNet.CreateTxClient("txsim", testnet.TxsimVersion, 10, "100-2000", 1, testnet.DefaultResources, endpoints[0]) testnet.NoError("failed to create tx client", err) logger.Println("Setting up testnets") @@ -40,10 +40,9 @@ func E2ESimple(logger *log.Logger) error { logger.Println("Starting testnets") testnet.NoError("failed to start testnets", testNet.Start()) - // wait for 30 seconds + logger.Println("Waiting for 30 seconds to produce blocks") time.Sleep(30 * time.Second) - logger.Println("Reading blockchain") blockchain, err := testnode.ReadBlockchain(context.Background(), testNet.Node(0).AddressRPC()) testnet.NoError("failed to read blockchain", err) diff --git a/test/e2e/testnet/testnet.go b/test/e2e/testnet/testnet.go index a5cab85b98..2e20386ae8 100644 --- a/test/e2e/testnet/testnet.go +++ b/test/e2e/testnet/testnet.go @@ -3,6 +3,7 @@ package testnet import ( "context" + "errors" "fmt" "os" "path/filepath" @@ -336,10 +337,6 @@ func (t *Testnet) Start() error { return fmt.Errorf("node %s failed to start: %w", node.Name, err) } } - err := t.StartTxClients() - if err != nil { - return err - } log.Info().Msg("forwarding ports for genesis nodes") // wait for instances to be running for _, node := range genesisNodes { @@ -350,37 +347,33 @@ func (t *Testnet) Start() error { } // wait for nodes to sync log.Info().Msg("waiting for genesis nodes to sync") - for i, node := range genesisNodes { - log.Info().Int("Index", i).Str("name", node.Name).Msg( + for _, node := range genesisNodes { + log.Info().Str("name", node.Name).Msg( "waiting for node to sync") client, err := node.Client() if err != nil { - return fmt.Errorf("failed to initialized node %s: %w", node.Name, err) + return fmt.Errorf("failed to initialize client for node %s: %w", node.Name, err) } for i := 0; i < 10; i++ { resp, err := client.Status(context.Background()) - if err != nil { - if i == 9 { - return fmt.Errorf("node %s status response: %w", node.Name, err) + if err == nil { + if resp.SyncInfo.LatestBlockHeight > 0 { + log.Info().Int("attempts", i).Str("name", node.Name).Msg( + "node has synced") + break } - time.Sleep(time.Second) - continue - } - if resp.SyncInfo.LatestBlockHeight > 0 { - log.Info().Int("Index", i).Str("name", node.Name).Msg( - "node has synced") - break + } else { + err = errors.New("error getting status") } - log.Info().Int64("height", resp.SyncInfo.LatestBlockHeight).Msg( - "height is 0, waiting...") if i == 9 { - return fmt.Errorf("failed to start node %s", node.Name) + return fmt.Errorf("failed to start node %s: %w", node.Name, err) } - fmt.Printf("node %s is not synced yet, waiting...\n", node.Name) - time.Sleep(1 * time.Second) + log.Info().Str("name", node.Name).Int("attempt", i).Msg( + "node is not synced yet, waiting...") + time.Sleep(time.Duration(i) * time.Second) } } - return nil + return t.StartTxClients() } func (t *Testnet) Cleanup() { From c656fba103032ebdfa36048c40867d02e19c47ae Mon Sep 17 00:00:00 2001 From: Rootul P Date: Tue, 23 Jul 2024 10:45:19 -0400 Subject: [PATCH 38/40] chore: upgrade to golangci-lint 1.59.1 (#3724) Potentially closes https://github.com/celestiaorg/celestia-app/issues/3723 --- .github/workflows/lint.yml | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 73923e88be..bbd6b87d3a 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -22,7 +22,7 @@ jobs: go.sum - uses: golangci/golangci-lint-action@v6.0.1 with: - version: v1.57.0 + version: v1.59.1 args: --timeout 10m github-token: ${{ secrets.github_token }} skip-pkg-cache: true diff --git a/README.md b/README.md index c82f1f5f82..52d3733fab 100644 --- a/README.md +++ b/README.md @@ -118,7 +118,7 @@ This repo contains multiple go modules. When using it, rename `go.work.example` ### Tools -1. Install [golangci-lint](https://golangci-lint.run/welcome/install) 1.57.0 +1. Install [golangci-lint](https://golangci-lint.run/welcome/install) 1.59.1 1. Install [markdownlint](https://github.com/DavidAnson/markdownlint) 0.39.0 1. Install [hadolint](https://github.com/hadolint/hadolint) 1. Install [yamllint](https://yamllint.readthedocs.io/en/stable/quickstart.html) From 978c38b09338d914acfeee9fae854676cf8723f1 Mon Sep 17 00:00:00 2001 From: Sanaz Taheri <35961250+staheri14@users.noreply.github.com> Date: Tue, 23 Jul 2024 17:08:55 -0700 Subject: [PATCH 39/40] test: improves e2e tests performance by reading the block metadata instead of the entire block data (#3672) Closes #3667 I also used this PR to make a change to E2ESimple to address a flaky behavior. The sequence count of the txclient has been increased to 10 to ensure there are sufficient transactions at the end of the test. --- test/e2e/benchmark/benchmark.go | 14 ++++---- test/e2e/simple.go | 17 +++++---- test/util/testnode/read.go | 57 ++++++++++++++++++++++++++++++ test/util/testnode/read_test.go | 62 +++++++++++++++++++++++++++++++++ 4 files changed, 136 insertions(+), 14 deletions(-) create mode 100644 test/util/testnode/read_test.go diff --git a/test/e2e/benchmark/benchmark.go b/test/e2e/benchmark/benchmark.go index cac428fac9..39872f1da8 100644 --- a/test/e2e/benchmark/benchmark.go +++ b/test/e2e/benchmark/benchmark.go @@ -148,18 +148,18 @@ func (b *BenchmarkTest) CheckResults(expectedBlockSizeBytes int64) error { } } - log.Println("Reading blockchain") - blockchain, err := testnode.ReadBlockchain(context.Background(), + log.Println("Reading blockchain headers") + blockchain, err := testnode.ReadBlockchainHeaders(context.Background(), b.Node(0).AddressRPC()) - testnet.NoError("failed to read blockchain", err) + testnet.NoError("failed to read blockchain headers", err) targetSizeReached := false maxBlockSize := int64(0) - for _, block := range blockchain { - if appconsts.LatestVersion != block.Version.App { - return fmt.Errorf("expected app version %d, got %d", appconsts.LatestVersion, block.Version.App) + for _, blockMeta := range blockchain { + if appconsts.LatestVersion != blockMeta.Header.Version.App { + return fmt.Errorf("expected app version %d, got %d", appconsts.LatestVersion, blockMeta.Header.Version.App) } - size := int64(block.Size()) + size := int64(blockMeta.BlockSize) if size > maxBlockSize { maxBlockSize = size } diff --git a/test/e2e/simple.go b/test/e2e/simple.go index 2d64458068..6673129f41 100644 --- a/test/e2e/simple.go +++ b/test/e2e/simple.go @@ -31,7 +31,8 @@ func E2ESimple(logger *log.Logger) error { logger.Println("Creating txsim") endpoints, err := testNet.RemoteGRPCEndpoints() testnet.NoError("failed to get remote gRPC endpoints", err) - err = testNet.CreateTxClient("txsim", testnet.TxsimVersion, 10, "100-2000", 1, testnet.DefaultResources, endpoints[0]) + err = testNet.CreateTxClient("txsim", testnet.TxsimVersion, 10, + "100-2000", 100, testnet.DefaultResources, endpoints[0]) testnet.NoError("failed to create tx client", err) logger.Println("Setting up testnets") @@ -43,15 +44,17 @@ func E2ESimple(logger *log.Logger) error { logger.Println("Waiting for 30 seconds to produce blocks") time.Sleep(30 * time.Second) - blockchain, err := testnode.ReadBlockchain(context.Background(), testNet.Node(0).AddressRPC()) - testnet.NoError("failed to read blockchain", err) + logger.Println("Reading blockchain headers") + blockchain, err := testnode.ReadBlockchainHeaders(context.Background(), testNet.Node(0).AddressRPC()) + testnet.NoError("failed to read blockchain headers", err) totalTxs := 0 - for _, block := range blockchain { - if appconsts.LatestVersion != block.Version.App { - return fmt.Errorf("expected app version %d, got %d in block %d", appconsts.LatestVersion, block.Version.App, block.Height) + for _, blockMeta := range blockchain { + version := blockMeta.Header.Version.App + if appconsts.LatestVersion != version { + return fmt.Errorf("expected app version %d, got %d in blockMeta %d", appconsts.LatestVersion, version, blockMeta.Header.Height) } - totalTxs += len(block.Data.Txs) + totalTxs += blockMeta.NumTxs } if totalTxs < 10 { return fmt.Errorf("expected at least 10 transactions, got %d", totalTxs) diff --git a/test/util/testnode/read.go b/test/util/testnode/read.go index 05dc491a9a..6363b2195a 100644 --- a/test/util/testnode/read.go +++ b/test/util/testnode/read.go @@ -39,6 +39,63 @@ func ReadBlockchain(ctx context.Context, rpcAddress string) ([]*types.Block, err return ReadBlockHeights(ctx, rpcAddress, 1, status.SyncInfo.LatestBlockHeight) } +// ReadBlockchainHeaders retrieves the blockchain headers from height 1 up to +// latest available height from the node at rpcAddress and returns it. +// The headers are returned in ascending order (lowest first). +func ReadBlockchainHeaders(ctx context.Context, rpcAddress string) ([]*types.BlockMeta, error) { + client, err := http.New(rpcAddress, "/websocket") + if err != nil { + return nil, err + } + + // fetch the latest height + resp, err := client.Status(ctx) + if err != nil { + return nil, err + } + maxHeight := resp.SyncInfo.LatestBlockHeight + + blockHeaders := make([]*types.BlockMeta, 0) + // fetch headers up to maxHeight + lastFetchedHeight := int64(0) + for { + // BlockchainInfo may apply a limit on the range of blocks to fetch, + // so we need to request them iteratively. + // note that block headers returned by BlockchainInfo are in descending + // order (highest first). + + res, err := client.BlockchainInfo(ctx, 1, maxHeight) + if err != nil { + return nil, err + } + + blockHeaders = append(blockHeaders, res.BlockMetas...) + + lastFetchedHeight = res.BlockMetas[len(res.BlockMetas)-1].Header.Height + + // fetch until the first block + if lastFetchedHeight <= 1 { + break + } + + // set the new maxHeight to fetch the next batch of headers + maxHeight = lastFetchedHeight - 1 + + } + + // reverse the order of headers to be ascending (lowest first). + reverseSlice(blockHeaders) + + return blockHeaders, nil +} + +// reverseSlice reverses the order of elements in a slice in place. +func reverseSlice[T any](s []T) { + for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 { + s[i], s[j] = s[j], s[i] + } +} + func ReadBlockHeights(ctx context.Context, rpcAddress string, fromHeight, toHeight int64) ([]*types.Block, error) { client, err := http.New(rpcAddress, "/websocket") if err != nil { diff --git a/test/util/testnode/read_test.go b/test/util/testnode/read_test.go new file mode 100644 index 0000000000..e0bebe5abc --- /dev/null +++ b/test/util/testnode/read_test.go @@ -0,0 +1,62 @@ +package testnode + +import ( + "context" + "reflect" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestReverseSlice(t *testing.T) { + tests := []struct { + input interface{} + expected interface{} + }{ + {[]int{1, 2, 3, 4, 5}, []int{5, 4, 3, 2, 1}}, + {[]string{"a", "b", "c", "d"}, []string{"d", "c", "b", "a"}}, + {[]int{1, 2}, []int{2, 1}}, + {[]int{1}, []int{1}}, + {[]string{}, []string{}}, + } + + for _, tt := range tests { + switch v := tt.input.(type) { + case []int: + // reverseSlice modifies the input slice, so we need to make a copy + original := make([]int, len(tt.input.([]int))) + copy(original, tt.input.([]int)) + reverseSlice(v) + require.True(t, reflect.DeepEqual(v, tt.expected), "reverseSlice(%v) = %v, want %v", original, tt.input, tt.expected) + case []string: + // reverseSlice modifies the input slice, so we need to make a copy + original := make([]string, len(tt.input.([]string))) + copy(original, tt.input.([]string)) + reverseSlice(v) + require.True(t, reflect.DeepEqual(v, tt.expected), "reverseSlice(%v) = %v, want %v", original, tt.input, tt.expected) + } + } +} + +func TestReadBlockchainHeaders(t *testing.T) { + cfg := DefaultConfig() + cctx, rpcAddr, _ := NewNetwork(t, cfg) + // wait for 30 blocks to be produced + err := cctx.WaitForBlocks(30) + require.NoError(t, err) + + // fetch headers + headers, err := ReadBlockchainHeaders(context.Background(), rpcAddr) + require.NoError(t, err) + // we should have at least 30 headers + require.True(t, len(headers) >= 30) + + // check that the headers are in ascending order, starting from 1 + i := int64(1) + for _, header := range headers { + got := header.Header.Height + require.Equal(t, i, got, + "expected height %d, got %d", i, got) + i++ + } +} From 85bf2aed06b9f232dd6628cab377376748d0b1eb Mon Sep 17 00:00:00 2001 From: Rootul P Date: Wed, 24 Jul 2024 06:54:24 -0400 Subject: [PATCH 40/40] chore(deps): upgrade to cosmos-sdk v1.24.0-sdk-v0.46.16 (#3725) Upgrade to https://github.com/celestiaorg/cosmos-sdk/releases/tag/v1.24.0-sdk-v0.46.16 --- go.mod | 2 +- go.sum | 4 ++-- test/interchain/go.mod | 2 +- test/interchain/go.sum | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 0cf00b84ae..f00f22ebbc 100644 --- a/go.mod +++ b/go.mod @@ -247,7 +247,7 @@ require ( ) replace ( - github.com/cosmos/cosmos-sdk => github.com/celestiaorg/cosmos-sdk v1.23.0-sdk-v0.46.16 + github.com/cosmos/cosmos-sdk => github.com/celestiaorg/cosmos-sdk v1.24.0-sdk-v0.46.16 // Pin to ledger-cosmos-go v0.12.4 to avoid a breaking change introduced in v0.13.0 // The following replace statement can be removed when we upgrade to cosmos-sdk >= v0.50.0 github.com/cosmos/ledger-cosmos-go => github.com/cosmos/ledger-cosmos-go v0.12.4 diff --git a/go.sum b/go.sum index 42ba33e2ce..65226ef709 100644 --- a/go.sum +++ b/go.sum @@ -320,8 +320,8 @@ github.com/celestiaorg/blobstream-contracts/v3 v3.1.0 h1:h1Y4V3EMQ2mFmNtWt2sIhZI github.com/celestiaorg/blobstream-contracts/v3 v3.1.0/go.mod h1:x4DKyfKOSv1ZJM9NwV+Pw01kH2CD7N5zTFclXIVJ6GQ= github.com/celestiaorg/celestia-core v1.38.0-tm-v0.34.29 h1:HwbA4OegRvXX0aNchBA7Cmu+oIxnH7xRcOhISuDP0ak= github.com/celestiaorg/celestia-core v1.38.0-tm-v0.34.29/go.mod h1:MyElURdWAOJkOp84WZnfEUJ+OLvTwOOHG2lbK9E8XRI= -github.com/celestiaorg/cosmos-sdk v1.23.0-sdk-v0.46.16 h1:N2uETI13szEKnGAdKhtTR0EsrpcW0AwRKYER74WLnuw= -github.com/celestiaorg/cosmos-sdk v1.23.0-sdk-v0.46.16/go.mod h1:Bpl1LSWiDpQumgOhhMTZBMopqa0j7fRasIhvTZB44P0= +github.com/celestiaorg/cosmos-sdk v1.24.0-sdk-v0.46.16 h1:AlBZS4WykzrwfcNbKD+yQQM1RTMz7lYDC1NS7ClAidM= +github.com/celestiaorg/cosmos-sdk v1.24.0-sdk-v0.46.16/go.mod h1:Bpl1LSWiDpQumgOhhMTZBMopqa0j7fRasIhvTZB44P0= github.com/celestiaorg/go-square v1.1.0 h1:K4tBL5PCJwDtpBfyDxxZ3N962aC9VYb5/bw3LjagEtY= github.com/celestiaorg/go-square v1.1.0/go.mod h1:1EXMErhDrWJM8B8V9hN7dqJ2kUTClfwdqMOmF9yQUa0= github.com/celestiaorg/go-square/merkle v0.0.0-20240117232118-fd78256df076 h1:PYInrsYzrDIsZW9Yb86OTi2aEKuPcpgJt6Mc0Jlc/yg= diff --git a/test/interchain/go.mod b/test/interchain/go.mod index 5cb5dadc03..106c76a2fa 100644 --- a/test/interchain/go.mod +++ b/test/interchain/go.mod @@ -224,7 +224,7 @@ replace ( // These replace statements were inspired by celestia-app. replace ( - github.com/cosmos/cosmos-sdk => github.com/celestiaorg/cosmos-sdk v1.23.0-sdk-v0.46.16 + github.com/cosmos/cosmos-sdk => github.com/celestiaorg/cosmos-sdk v1.24.0-sdk-v0.46.16 github.com/cosmos/ledger-cosmos-go => github.com/cosmos/ledger-cosmos-go v0.12.4 github.com/docker/docker => github.com/docker/docker v24.0.1+incompatible github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 diff --git a/test/interchain/go.sum b/test/interchain/go.sum index 4b2e1eacf9..3f306fe454 100644 --- a/test/interchain/go.sum +++ b/test/interchain/go.sum @@ -251,8 +251,8 @@ github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce h1:YtWJF7RHm2pY github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= github.com/celestiaorg/celestia-core v1.38.0-tm-v0.34.29 h1:HwbA4OegRvXX0aNchBA7Cmu+oIxnH7xRcOhISuDP0ak= github.com/celestiaorg/celestia-core v1.38.0-tm-v0.34.29/go.mod h1:MyElURdWAOJkOp84WZnfEUJ+OLvTwOOHG2lbK9E8XRI= -github.com/celestiaorg/cosmos-sdk v1.23.0-sdk-v0.46.16 h1:N2uETI13szEKnGAdKhtTR0EsrpcW0AwRKYER74WLnuw= -github.com/celestiaorg/cosmos-sdk v1.23.0-sdk-v0.46.16/go.mod h1:Bpl1LSWiDpQumgOhhMTZBMopqa0j7fRasIhvTZB44P0= +github.com/celestiaorg/cosmos-sdk v1.24.0-sdk-v0.46.16 h1:AlBZS4WykzrwfcNbKD+yQQM1RTMz7lYDC1NS7ClAidM= +github.com/celestiaorg/cosmos-sdk v1.24.0-sdk-v0.46.16/go.mod h1:Bpl1LSWiDpQumgOhhMTZBMopqa0j7fRasIhvTZB44P0= github.com/celestiaorg/nmt v0.21.0 h1:81MBqxNn3orByoiCtdNVjwi5WsLgMkzHwP02ZMhTBHM= github.com/celestiaorg/nmt v0.21.0/go.mod h1:ia/EpCk0enD5yO5frcxoNoFToz2Ghtk2i+blmCRjIY8= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4=