From 6ac58c532f1c4a53d2b83aab7adb4dd8a63723ce Mon Sep 17 00:00:00 2001 From: Tim B <79199034+timbrinded@users.noreply.github.com> Date: Thu, 22 May 2025 21:02:12 +0100 Subject: [PATCH] =?UTF-8?q?test:=20=E2=9C=A8=20New=20CLI=20functions=20(#8?= =?UTF-8?q?4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Changes - New option: `--kurtosis-enclave-name` to allow you to specify a new ethereum network with a different enclave name. Neccesary step for setting up local testing with multiple enclaves running at once - Refactor: all single dash options (e.g. `-i`) have been renamed to have double dashes `--` for consistency others - sad times: CLI now must be invoked `bun cli launch` since we have multiple fns now - Package Update - New Function: `stop` which allows you to kill all components (eth, dh, relayers) or only a single part - Gonza's mac target build fix - Misc fixes to ci like caching and rate limits ## Additional Comment The CLI needs multiple commands and this PR adds the first new one `stop`. This syntax is faily extensible so @ffarall 's k8 command can follow suite. Originally we were going to have an `exec` command to expose internal fns to be callable by command line, i.e. generate beacon checkpoint - however the need for it has since been superceded by the deploy to k8 command that's going to be added. I've left the code in place though so when another usecase comes up we can just plug that in. --------- Co-authored-by: Facundo Farall <37149322+ffarall@users.noreply.github.com> --- .github/workflows/CI.yml | 2 + .../workflows/actions/setup-env/action.yml | 2 + .github/workflows/task-docker.yml | 10 +- .github/workflows/task-ts-build.yml | 2 - contracts/config/anvil.json | 12 +- operator/rust-toolchain.toml | 2 +- test/.papi/descriptors/package.json | 4 +- test/.papi/metadata/datahaven.scale | Bin 356318 -> 358035 bytes test/.papi/polkadot-api.json | 2 +- test/bun.lock | 164 +++++++++---- test/cli/handlers/consts.ts | 13 + test/cli/handlers/exec/index.ts | 1 + test/cli/handlers/index.ts | 3 + test/cli/handlers/launch/datahaven.ts | 3 +- test/cli/handlers/launch/index.ts | 15 +- test/cli/handlers/launch/kurtosis.ts | 31 ++- test/cli/handlers/launch/relayer.ts | 12 +- test/cli/handlers/launch/summary.ts | 2 +- test/cli/handlers/launch/validator.ts | 6 +- test/cli/handlers/stop/index.ts | 228 ++++++++++++++++++ test/cli/index.ts | 62 +++-- test/package.json | 46 ++-- test/scripts/cargo-crossbuild.ts | 8 +- test/tsconfig.json | 4 +- test/utils/docker.ts | 6 + test/utils/kurtosis.ts | 21 +- 26 files changed, 517 insertions(+), 144 deletions(-) create mode 100644 test/cli/handlers/consts.ts create mode 100644 test/cli/handlers/exec/index.ts create mode 100644 test/cli/handlers/stop/index.ts diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index aee450bb..17930af6 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -24,10 +24,12 @@ jobs: uses: ./.github/workflows/task-ts-lint.yml unit-tests: uses: ./.github/workflows/task-rust-tests.yml + secrets: inherit contract-tests: uses: ./.github/workflows/task-foundry-tests.yml rust-lint: uses: ./.github/workflows/task-rust-lint.yml + secrets: inherit docker-build: uses: ./.github/workflows/task-docker.yml secrets: inherit diff --git a/.github/workflows/actions/setup-env/action.yml b/.github/workflows/actions/setup-env/action.yml index 7e3bad1e..f69920ac 100644 --- a/.github/workflows/actions/setup-env/action.yml +++ b/.github/workflows/actions/setup-env/action.yml @@ -57,3 +57,5 @@ runs: run: sudo apt-get update && sudo apt-get install -y libpq-dev libclang-dev - name: Install Protoc uses: arduino/setup-protoc@v3 + with: + repo-token: ${{ github.token }} diff --git a/.github/workflows/task-docker.yml b/.github/workflows/task-docker.yml index af97ad5e..3788ca62 100644 --- a/.github/workflows/task-docker.yml +++ b/.github/workflows/task-docker.yml @@ -62,12 +62,12 @@ jobs: id: cache with: path: | - cargo-registry - cargo-git - sccache - key: cache-mount-${{ hashFiles('./operator/Dockerfile', './operator/Cargo.lock') }}-${{hashFiles('./operator/runtime/**/*.rs','./operator/pallets/**/*.rs', './operator/node/**/*.rs')}} + **/cargo-registry + **/cargo-git + **/sccache + key: cache-mount-${{ hashFiles('./operator/Dockerfile') }}-${{ hashFiles('./operator/Cargo.lock') }}-${{hashFiles('./operator/runtime/**/*.rs','./operator/pallets/**/*.rs', './operator/node/**/*.rs')}} restore-keys: | - cache-mount-${{ hashFiles('./operator/Dockerfile', './operator/Cargo.lock') }} + cache-mount-${{ hashFiles('./operator/Dockerfile') }}-${{ hashFiles('./operator/Cargo.lock') }} cache-mount-${{ hashFiles('./operator/Dockerfile') }} cache-mount- - name: Inject cache into docker diff --git a/.github/workflows/task-ts-build.yml b/.github/workflows/task-ts-build.yml index 6be6683c..2449fb91 100644 --- a/.github/workflows/task-ts-build.yml +++ b/.github/workflows/task-ts-build.yml @@ -31,8 +31,6 @@ jobs: - name: Generate Wagmi Bindings working-directory: test run: bun generate:wagmi - - run: bun fmt:fix - working-directory: test - name: Check no local changes run: | changes=$(git status --porcelain .) diff --git a/contracts/config/anvil.json b/contracts/config/anvil.json index 230aa0a5..6931d469 100644 --- a/contracts/config/anvil.json +++ b/contracts/config/anvil.json @@ -41,19 +41,11 @@ "rewardsMessageOrigin": "0x0000000000000000000000000000000000000000000000000000000000000000", "initialValidators": [ "0xaeb47a269393297f4b0a3c9c9cfd00c7a4195255274cf39d83dabc2fcc9ff3d7", - "0xf68aec7304bf37f340dae2ea20fb5271ee28a3128812b84a615da4789e458bde", - "0x3eb799651607280e854bd2e42c1df1c8e4a6167772dfb3c64a813e40f6e87136", - "0x50bdd3ac4f54a04702a055c33303025b2038446c7334ed3b3341f310f052116f", - "0x55ca68207e72b7a7cd012364e03ac9ee560eb1b26de63f0ee42a649d74f3bf58", - "0x0c7d65cd92edbbe78113c7e966f65ad65bb55d8d9134d9f395ac340d62b04732" + "0xf68aec7304bf37f340dae2ea20fb5271ee28a3128812b84a615da4789e458bde" ], "nextValidators": [ "0xaeb47a269393297f4b0a3c9c9cfd00c7a4195255274cf39d83dabc2fcc9ff3d7", - "0xf68aec7304bf37f340dae2ea20fb5271ee28a3128812b84a615da4789e458bde", - "0x3eb799651607280e854bd2e42c1df1c8e4a6167772dfb3c64a813e40f6e87136", - "0x50bdd3ac4f54a04702a055c33303025b2038446c7334ed3b3341f310f052116f", - "0x55ca68207e72b7a7cd012364e03ac9ee560eb1b26de63f0ee42a649d74f3bf58", - "0x0c7d65cd92edbbe78113c7e966f65ad65bb55d8d9134d9f395ac340d62b04732" + "0xf68aec7304bf37f340dae2ea20fb5271ee28a3128812b84a615da4789e458bde" ] } } \ No newline at end of file diff --git a/operator/rust-toolchain.toml b/operator/rust-toolchain.toml index dcd8e577..926c88e4 100644 --- a/operator/rust-toolchain.toml +++ b/operator/rust-toolchain.toml @@ -11,4 +11,4 @@ components = [ "rustfmt", ] profile = "minimal" -targets = ["wasm32-unknown-unknown"] +targets = ["wasm32-unknown-unknown", "x86_64-unknown-linux-gnu"] diff --git a/test/.papi/descriptors/package.json b/test/.papi/descriptors/package.json index 5e953133..f734406b 100644 --- a/test/.papi/descriptors/package.json +++ b/test/.papi/descriptors/package.json @@ -1,5 +1,5 @@ { - "version": "0.1.0-autogenerated.1703141872484974895", + "version": "0.1.0-autogenerated.13919917606265561517", "name": "@polkadot-api/descriptors", "files": [ "dist" @@ -19,6 +19,6 @@ "types": "./dist/index.d.ts", "sideEffects": false, "peerDependencies": { - "polkadot-api": ">=1.9.11" + "polkadot-api": ">=1.11.2" } } diff --git a/test/.papi/metadata/datahaven.scale b/test/.papi/metadata/datahaven.scale index 24a3b57750e9c2485ea97bd2015e72429c73584b..ae3f2fcd71e43b7e59d0c081aaaa4a5f4cf43f7b 100644 GIT binary patch delta 21329 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 delta 18985 zcmbt+4_sAMw*Oh@&%GB#y(lOs=s`h21wp|CK}DrR0YQa8CA`7`ZUPtXAC+kgt+C0< zMmyQg${C%>(q2|RvYS(8zL%3$Hae59oHV5wP3L7#XYx%>IsLx-oXejJ_UH3^ey;cK zwa?mXuf6u(Yp=ETI_Q@pJ~@qd$L*!d%nLb~>XLd@dquyEV@VeX! zHLol@N}HM-_4S&!a%D$-rAPB-X6CNc8ogNye2rdbgEmdD3egKSkH_h1l!eFjSS6mG z(r;5H(DV8#WrFlN?PA-{(op?Bl^A+cZ&yasd%De%LLccFmI-uPcjEgm`c_LSeXhT2 zNuoskx+O(UCECPhJW1htj&(TY>dUMn$*JFKy+!sBy~SFeqgef{HBMYZ?EQ;0Mjvk* zN$d3awtRUT(RSAEqDb9uOQ1acoNXQz=;K2sxA{Zv8`xTOvoS@QmEp$7WOT@s%1f-ltr1DIaO6I3_Pz|5abUEwN+}TY*YuwOICAhYP2e^bET#_8&!`f7}ZhZ z)!b^MwtBHQc}6GY1zLk^<;`f5{9Y%L>Nc@{h_Y9oku{PY*EbEnfC-rXT9m$NL=tV+ z-x%=(J*}6k8&UpD%^mQxAc(t!UEtp)2*UGvPV97gNnaQH+JKkv{d7p%{!x)4y`}#leqQQZa^wQd4vQQ7<3A_SQd{2Mzn<(8e`rqlezG+N6eV}KK83tOVV=_8xUKz8t zvs{r-)>%HCu&T5Clf;(J^3btuo#ijbE(v>8@~OM3-I0k+X#LB%q02? z`~4))T6W8S(nWo5Mv?BF(qNWCDAH}n;Vpe?hR>*b3g3m93$U(tWTr`1Fv!fQ$+~4~ zB1P#bQ|~msr|W;3dcSzZ&YIWIFugTvI(?}h%vvda8QD=Y1wQYHr94Dk_95_St*FZ zl)$F;6lv~Uw?h^bqM*7~w?mMGtOZ(=%k9l~HP&h?o!%B%2m!esm6-Uoxy?T3N>`P^ zsQDO#ov!LGruz~7AeNvAWd)AaP*8cSG+i8^$U+zqD@+%M%n&TXvYDDz)54!t2iVVT z^tzoIL=r*toll{|gs-|wd<6S+9u3x0vrA*XLy!sBd!Gk6V)gTtzUJSSsf+)HiA3_b;^o z4rCp#+h-==NLw>A9oxU}?CJX7W~NY*K5Euy2D}C39kb)5R0?I&pQH%=li8J&t{=)9 ztiOBfFx{1Fp`5mrxzot3YP7KRtgeHR#r&si9q?lwW?NI9y*|luGgXqeaW`eXVFY zzRQa51Mb=45d*t$BfYLBXO*W}w=akZX$Ci9n&2b0<~bU#FJEvUwXheLK`nf{Ae~zD z^o9A{{5ba_=J2J3f9ZJmZ;R4liL@^&ruA);O1>boK2p!Ty@l56+ZRvNFWf$jHt6wX zDdGkSoGilzZX|gjKOnb4tCVV0S&OFW+ZLzm@0X1PuUE^GXtO?|Jdw8OdF4qFT^z@` zwJK+m69!ql{$TmDz@4->1>e<+r=rF7#cpW}*;wo=sLEWD(Pt|k(?$}u5sTeVqx9`d zVh!@K`gM0C?a;qjvWRx-#Y^4&vLWqRb&keHtv;_>cPt&OUszfg5mYOXy}?zjfu)M2 zVC!ys{3|OP0lh`d!PW+joQdTwf#XBv+$H z5O(YDEK8?7k2qrJm_FPQBc33Adts!pkxCcv!OgJDX1G3_N`uijoYRQI_eX`lYEYlOI;^ee6i-L+z@S)AHY zb9Q+q9n#k{EgE6Y-2y9*>`e~0_o%+MO3gU{rVBOiDwlf&o`eX(K6GKR3;Riq zoZrNU!dEh|Z1zG|BiD%bg{}ro77hRpp9A3J6Wbx)C{j4Azg;~GEcMmu=&0`1ZbA8Z zEz-V^Oa(*X)mo#gVW0ki7Tdd0sTtYY6En~dHr6q8A&KVjPw+A}2N%UjUdD4?KE=z5 zSw6$d7PH*W%lwo8&Us$uRwBxm$d=XQb~ZSPMxZz zRS1C4jCYeFT-D#LnG<;pg1gnZTB|Neoj66HXt%b?;jZ>v*T>by#$Up@V9=q22AGk~ zrh2F54sIb_)0=B2(RC0TsvoSK(6_UVa6`XdtBNG*!|H}5M~IZNGA%PRKVW8nGh1o8 zEbJuIr+2HzxY4A#ZjN0MgBGHqzh0Nr8X}U~v8FI_wz7#fA*e1G5`i%(G`Q~jAPM+s z_V31MZG=(KorPcsgDOi853c+Fg%r@59ND9F@c4T?{2s=FF)bi{OLTDEkAqsVlfG91 z!DOuHXo?zK_kV&CJLmrU$Y5WD=>1oWHPs6B)Bndcm}?cIlofz~NT+0mVf_W^lzw7& zWrD{&l}Q*jHa1w8ezE=_)gak;5$SA z7~k3Yb$sXOLtHUqa>egbq%r8sP^7V<5UXc5cT=R$^&KPTrK|w_gCkDtIpX-B5#w>s z5ht1>PDKAVN|HE7_%DE?R9@z~4drxR=1K?U3|{8C4drZJ=DH2#9A4(S4dq;3=DH2# zJpC8$Ii2UAhO?~Fv&=ZT+T{WcGgoEY1U%mq1-e0MTST40a{j{4`4teGgs?eW% zW;n`6pLrYz%bz_%U>Dp~=p&wp)Ju1#kfZJAyBA9^gFbyevvrqXBh`f<18iXTE>hreCvTakA&|nmxf0`xRO@kqEouLQ0yE#sFL8dtk zi=B-;3RJm5Yw=Vr=k8_?t6lI(p*N))2(s8`A*f`;SVGefGU*B~$@ zfnZ6u;7T&g!bNpXkGjfPUyr~_6@ntLc~n?{T@jcu9<|BsTIqyb5HzXL+*)ImrW)~@ z@hUoXt%BPd+(h-dj#uH4x@4I-sMZ$GvWkR2j3^Mj$;>P=;$WGX9Rp8H7V@ab?5ny5 zMNZD62FQUL4+HT)*?0pFBgP5pYBUGpb*#`-%?KFrr}-W&+z6y~#f!YjaKQAvFUGf; zJYkH>ARjYwG~ey4bv7&CYsPfjgs0|KpRh=>J zz{FIm^-hl$%eQORJjp^r=hS9?l$xy0)3hd#03x5S04J?3w+ECQUe)0?LTh~LosCUC zuR-#?iOH%dl#T{L_>C^FF%Lm)o}QGf^0gMU(mZO7+tpz3+(rFI&p{ad_(`a7xmC>p z`2_W^IvT6vyHhboWlUx(54?7p&A_8XwUdFs~It+nO*^9jmufx_ql8rxm)qIi2VN$&YseYAYIdTlT>XXD@QO3LK3so#-Axl%oi{p|^@O zmx!UN_@3(`WN22^u^ch%?n@_GUdtuU-hQ2;2d%+rBd(JKe0acly(FyHbDoURkF+hK zSM`{eXCf-S?B(h3hqu3ci?~73XPgPwFTWg_vJpp^R#okBK>PZZLpXx45j3P&9N9Ku zGbd{owir~mN?F2IJ$>Ie+NL}9O@iOOW#0t}{-$GJWZR?r=MkLFbHB}u+irT;yQK~f z8;&QZvt8I@(6PhO(WkvO6^HvzUK>aI^=DqYjPj$eZx{DVh@FqtmmU~R2Y@nE-*(_0 z9NFp{k0A!;f1?^MT=c;)_G1#onVw))ARyxT!9o87+D)$1{R`@wkegoN1p5dD*b zY4S;lj_An`57svwn$_ld(@LE+ZJQ2lRiu-WO<#93LeF_Si%#ixzdb}c6{y+s_DDLT zAAj3Nm-SnZ)T5kwbdY}b=)gX&%B9pU$qVVc{`Jw3Nw1QPyR+dnPPfN<2_i@+9j`7- z6e!Z8RUsnWtx9MIkpi@9J(?4G$q-GubY2oJ2hqOz9kj3YrroUy9wBG2;+?F1*9^*6 zIpynI6j5yl-}$pB-jG<)af;U8Jf;%DBgax>HlQc09zl`2M2NVrfaL-ce8T(ls9)P% z?>|Pcx$k=a;kNC^pB7>8p84RhwvYda*mi2$nGd`oOx+_NRkywJA;QHuZAU&@CIVeO z9idPASdHEw#VvH!HafgMw?<)bumW<5lIecE_-v&9$j5`^4xnErDyBG0pME9+3$~wr z<>US^$G`nJA~XWLNjb(kjY1a_hW8{NN(oi22AtX4hKbP|P7fWqK{Dqj&eOq1m`q(v z2||p~(Ho~zaq)HKbRoW{pGkzx>O3=Qcsv(IqAcKpO_n5Q2}zs<*pS#Nsm3S|o*98r zrscpQ@_5}Xuw7g=1lKr}>?>VfEsEVZLo>y6ndN*!ac~r>KAD2M!KXgSO~{aG2Dc>> z;NOo|=Quodi5PbV?=o8!@IjX;X+nm5SR^{@f~2N!v>oejx&yamgdbo>FMhOxJ2|YnV2d$Fy-^Z`iqERieLi zVU+%l|JD&#O!@PuwiiB!@53wO+CKkcDuontwn}87q%GyjNO4e)8%>{t-P(S2X_tiy z3ue4})0@m~`qjVPO?&mGzu!$KP_EPqzl@ecWZDf175ckh4igJx{mS3(&~Lq_%H=ZD zMd~*d`rFr3(IM;2sK4!hRZ-)`O8v*z=wYHAH&5MMQ^_X?5|Wg zRx$b0-~K92j5qNM{%O+}ULPbEC{SouucL?Sqv0}qaeXu5du#vskbFP^f1FtT*AwJJ z3Y`QW^?KiLMxvDbO)FfI7rt3c6WrcbD~eFaPbh;jlXV18nrIM9pkKD4izF|9L3I5IOyQ z`coazWxrHh zA14wntj@9XW2pr{mE-7N__<>|eTbjQNz_J8_E$vEsez48rqpRZtnJx|cte%eYqhxf z=!8R8Y0JAHJMOl;U0}G@01L{;o=m2wj7!*3fn#EcZ^~44VhX~R6z*(r)M{N#qP?q} zUU+kzH9`Ydhq2AFsSeL~Q-{sQHuT9pS@6kh-2*g)l}?}`t+m8J`)o~-g)IR4njm=C3MkZsz{EB{{Y(g4>;Tl?guup5Km$w&jO+$vHz9Dc z35wSQz{wsw8fZdbWiOyXCX^wI!amlJLPJ~kqjs=SI}zO;05rse(Cr~WktT$04+Dxa zA#{5b&`=XXx5oetGa>YQ0#LLGq2H5$VoV4!I0b090ZoDk&h!U3!UQ3Mb{3vWWyaj# z2;^eqGh>8VY{pa=F%1|?yq1SCY=-EKD2B}tyb;8J6~qw`hXw+dved^YauG{?jUtz? z6lxT?aHW1mkxN$U&##YdhFqlqMv===3Nwmah|)l#xQ`bH8AUEcDZ(gn2}*;FA{U=D z#3*vvNs&g83r>nMid<^aP@~92CJi%+Cn0M=iZ;qzT2hQrJj08_jbb}5jxdVnQ52hH z;S&4hM2Zi;%)zU&fDbn+eX?*Zu;{;-NNdJk57I|B0g{iUlXr8Fpc6#VLzQr$>w?E|NUgTYz=;t=ntJv^DMlwESE+Y zNdT(<@m%^^N>G&UO7dbao-P_Jg(%1s7|KrOp|^hQ>pZ$H^;5d;U0LEhJP2d+=TRzt z*3F|z^MW->>`DrVP$(s!UHE+~4(so@aJ7ARnt%XHHa|e5+m$S|RImI2n*bZD^Xj`b zkcxmy2&q%ab==ragZk-l0d5nN9%%(`htaku(0ljm+-Wz-H$Y^*d%i)dnT3EotkC!X z2^cQZpx%D)&fJD;_8*af(2I0eN<#HQR+cXIQ*50{3D{*2L?&ZNdt8by~_a~Tc758Xk726kTMP$XhTh>WGOcS|W6k1ulMbQXF$ z+NXB5x3S#YVIRaZ$L$n>#|GVpZ%0=dZ13&hIinNR`dAsNvpGD1%`C&t{jpuYU50Iz z!!DQ6RBH}2u$Zf`*fL0?sNCqgzMP`$&A8R#hVdL+f?<>8@qUJ}m&$1(`Z>6SMh@#5 zTNc79l`vZ>5m2eDb$EVo@ZC6|0`}Ho5RGU5SWI<6x77}Jt>%qq%}XF~gXFkC*Hp}k z?jTr3?4L_uWtFhVrL-Otez}y?AHbYlK^slXq3rVt3jYE0`|hB7vWtTjA%@*Egn!9g zgC$&+<%)n06n8u|lTe}X>-DkBRSA(h*p^Cq7&qo|%jf~~;(P}xiybtJG`7V-39!cA zaKNH#X5Tt!QO`Nh*oiyA`~A!5r$9t`G#gii<sV_KToaE+$+WOR+m+%Gh$u&)DGoi3#ytTQ+n(7g(F7)z<4 zsI>K*g=L%tVMCC}H!8hEz7e>P`bI9jG3@CYYz;$pBiTP{XjoW})w@~Yi45adVJ*(S zEzDU937Xjs?3-G85LNAUknEm1iW;_6q0oF+Ei6_v6bd)|NkQ1kvC@Nz6%G$nVnR^{W{KR{^*xR-4WVuL8`G^gepCpgpCkUJsi z-E7L8G){sW!kjB;B)k7k3Y*enM7x6ow5PX#_Lu_N!^!7jo`$S|UfgST2C7N&K84Cy z)15Q~##H!htx;Pp3;WsYE8rmSW9=)b3Icia*U+e6{Te*{te$l2mB|;&PS!Tw^VSjNG{ermco8hZmWgFe} zC%WXX^UyzuZZPLv;N+P9ejm2>*uz1?J=%M?N6q0Lg@v&=fmN=eJUYg9ucAac!R)Ik z-4^L-X;|*6H=tZpQY+N%gr{hrcv8_fx#QTu)t#(u_S;+N=bW|2e*)GFUZUBuyU5nX z*TZ+wITBAPdg_&E_Rtz^!!zueHI%HjE40)Mz*cIAD7rOYLuRJw=L-`B;SBq74K1N| zR&+O|ccm*~)t^^*_9=VrZYt$k3H)VWR!nDzEM2i7)OE|pxY}D3S4~k|Wv*5lN7vYs ztu#F0loHpO+>3n^PPn~jS*}$&t3T+prwSbnn!fJagqUjz8TVKMO);^c*OANUtg4Xd z(Je)o`MkB%Hyq)Nw4gYKAY5a0YbnWEBFl5=y274XO9|o)h5c?VWr=|0bvX2Hbjd!% zxD33k2nzGAqiQk4!t-bSe_w~g6Bgovduag-!JYR~CPlDw_tK=?p5_L|5{3&!*vXMX zgr&P=!YsX%2FFB$C|33}O2^86_-ELrvFzEO5$s=f;b$}@;wJQCEc&}cV_4C8nl>rc z>?_71#0Pa2+q*N4ip~<*q4hLNOtKhxy8hw!Q7htiZ0!TcCVb_7N)L1LFjc~xzUo@z z($AC5zPX<&203L)$wQKi7g?uyjWsSoNavJNQ!^~)n#k_9CNd1R?AH*nLP-ReW7I_E zT7+Dq8T)nvS^MF(E0BK0PjpT$yC6WWq#HTZbz5S^y~kE;j;)vvm z6|Cq%T7iQNKT+)DgLG@8W}(?oea7Ww)=Wpe1A#gi6`CoAc@NS2K2FYXs9@JDEcGD@ zXa5Q%tN-9bG~U{$*%*s3Mewm}IyT2emj5UfL4j|36h~%D*ZBH(AKw~_kD}xRBk#8d4lHSR4adi@)9=$4SZwofp0VizR{%c=@T?; zMmkbxkVoa#R;ClB72u8ragM-#Cp(hjy}j#&&Bl<@aqGN=lhSD`JMknG^j1TJ(l$$H z!eoel`BSt(>c7K~PolEZvd@A;4H7zucw8aTsLZO6eXHAW>3K?82U7SXm zcaEmD8{So~!UV4Ld9>b#+BffLFp^>v$AE+ zQXG3>H$`b-RaM!zDn}Eq?W*C4hT8HjI9jX6 z3oPy~3?VGgU(s_oE+hOueU6@#D9RuC0z@iC84riEx)*6B#rV&@Nb_WvF|Xo0n(;DC z$LX>5Wzze^gLN^{DkNHAf26X)eKZ$d;nsaLT}-leWWf$jwVJ9s-P)ywQ_U8|uh4BF z>6}WcRmfmFUZJ1#J%rprAI~WivU$a5Hs3{7*7qgq%kJ0}Du4Z}iOSPS8ks1JdSL z@h3DWmJ*sD(o6J;x! zL67bLUe}99Z{fwGoxnBTJbH_d)qL}4r-{6iO+N_}{lET5qv1Q;_#95~tE|pk{@6=FbT0R%bJ?VG z*~;SoL{k&42H_v+H7iGqNx5ca_y36!O0NfDU+Yc%no0cz@VX{34U&KZVNN0rgAPHE z%^*(9@-e;Ms@S@>N$K8(JLdu61=@rJA@{R&$LAwPMTiaRo4*>@Ik+RedX5LO zX^|L*Go;WXhddEPvFsDsj5CxHhC5bU_arTatvf^G#3Y*@dpcad>18iO9(>u0$>Nv2 zQmV~-zmMJf33;US4k-LAB_WtL^DIpqml4EWc5m*oP42Qg8vphz-I&krd(P6Vi)-+XWD;uC#5$9mX+i5tC znEz>q1Fx~ue}nvT%hypZPZc- z`|5%bZy);^pa!;t|EysTeFl_uY(F4*nR# z#5#;&$1c)bG25ya*%DaJB^o8?S_7|Av$dBHrht9aZd2Jimne+Z`cGei)s0O%_!>>3 zd^YzQz3CtPzl0;{19s&GeM!gt=l@0P6tPV7*U4hr00<&FTy$c=-xn@=C8yNPZiI_J z2j}Y}#1(X$U5yZDwFZfaf}qfZZs}@-%iU%qe9K92*g6yDcv74?3$HEJYRDFKAuX*V zXSjQ+EzihBhT2WC1=Cvb?qMf653bJbd^5|BtEk62i9NC>L8vR|*0U_RtPrNuY^TSu zyk4vBA_MP06pqM3^tmop1IetOIwJvdxu#Yd&03L$8DNh)#vME+3k}_e*^vav2j%HV zApY)Ab@dwP#Ypn&*0usW6LFM!)vFIwBU+Qy+mV*c?K>oDnxiqKS%pkLw;{Ujyr~YP zWy7UV6PCAtONW_5xUyqTJSw+>%#`C*9m6yd1{)Gp51%6B^co4t9l4{e_zMI)^>Mk& zTi4M)GQu0H%gIdtG-U**z6o!Sfs_jm&6M~mGtC zae;RDmyZ-ziL{gbDNZcLMjRh6*7n&WnQPw`!BXSJ6m~3LoGb5@=qWaAG~UlUz%Gv# zW9Sg;I|lR)v)nP_I&As3$B18vbdo^$wHbHsZ{Jm>UFvqZcL za?bzUZ1f{*GM)B+kc&VEbl|_{ile1wi;s<&CytXzp}+V`=ZRG!=I^%!;@A;aVhGAE zUtNgJf%T7&1!B?sU5{i6QRs6f6^hxm7zMVe0PR1gP)t$MX}!hECe~ac4rU8W#7HY~kg@#Fma%su8|8G+wzL z=xy+3h1TGYg4~7_?NyGJK+rIrQL-|Rjq4rs1=0hxAxxjBOzI$+%|=gBCMh^NWG~w^ z2~T~KltEH9*4l%UlqpzwZ%tAj#KtX3Q);B0l*WqFfOI@f$>6Dg+gQJJ<(Fcvm2JL6 z5q$+ZsZgFM5DxMIAw$_`>FB9|4V$c73PH-Gd_yj_#<8mhXi!~=^~j7_bz0Smg-u#j zK)mHv`xK*Y(ds}=h1H&7)ZB&$k_QKcHO<5*z-vg*|K1kOnwDT-7-5YD>yhyWbi3xP zt@AcpkFeqlC2E+@dStdyUw}VMgFisy;8~_E)(_TM^V#|gC0|+(%nve@$P z3Jzu}voSt-s`4pR+hS<@eHF>t=RewsL2m^;SElw%2-y{WDv+9Ddkp z^RC`tO)&IsWgR+6JL>;>nle*_z^COXtLcQ_pQEURmHyF8}9( zYn?Ka-R4wAQJ#N=Q@Kh~f$fC9a)nYMQL+C(qw*v{1(mQRP3ZU%)0>nW2;gKBc4|C} zZB`bB#3R>|{{@LlY)!MWbW*(Wmk`KUD_P+`{+Wfh(N9d6ZdL>XW_7J6BPvGpa#me*o6NF1(E@@ diff --git a/test/.papi/polkadot-api.json b/test/.papi/polkadot-api.json index 2f88d685..5acf5979 100644 --- a/test/.papi/polkadot-api.json +++ b/test/.papi/polkadot-api.json @@ -6,4 +6,4 @@ "metadata": ".papi/metadata/datahaven.scale" } } -} \ No newline at end of file +} diff --git a/test/bun.lock b/test/bun.lock index a7b2fb32..36784437 100644 --- a/test/bun.lock +++ b/test/bun.lock @@ -6,29 +6,29 @@ "dependencies": { "@biomejs/biome": "^2.0.0-beta.5", "@commander-js/extra-typings": "^13.1.0", - "@dotenvx/dotenvx": "^1.41.0", - "@inquirer/prompts": "^7.5.0", - "@noble/curves": "^1.9.0", + "@dotenvx/dotenvx": "^1.44.1", + "@inquirer/prompts": "^7.5.1", + "@noble/curves": "^1.9.1", "@noble/hashes": "^1.8.0", "@polkadot-api/descriptors": "file:.papi/descriptors", - "@types/dockerode": "^3.3.38", - "@types/node": "^22.14.1", - "@wagmi/cli": "^2.3.0", - "@wagmi/core": "^2.17.0", + "@types/dockerode": "^3.3.39", + "@types/node": "^22.15.21", + "@wagmi/cli": "^2.3.1", + "@wagmi/core": "^2.17.2", "chalk": "^5.4.1", "commander": "^13.1.0", "dockerode": "^4.0.6", "dotenv": "^16.5.0", - "octokit": "^4.1.3", + "octokit": "^4.1.4", "ora": "^8.2.0", - "pino": "^9.6.0", + "pino": "^9.7.0", "pino-pretty": "^13.0.0", - "polkadot-api": "^1.10.2", + "polkadot-api": "^1.12.0", "tiny-invariant": "^1.3.3", - "viem": "^2.28.0", - "wagmi": "^2.15.0", - "yaml": "^2.7.1", - "zod": "^3.24.3", + "viem": "^2.30.0", + "wagmi": "^2.15.4", + "yaml": "^2.8.0", + "zod": "^3.25.17", }, "devDependencies": { "@types/bun": "latest", @@ -81,7 +81,7 @@ "@commander-js/extra-typings": ["@commander-js/extra-typings@13.1.0", "", { "peerDependencies": { "commander": "~13.1.0" } }, "sha512-q5P52BYb1hwVWE6dtID7VvuJWrlfbCv4klj7BjUUOqMz4jbSZD4C9fJ9lRjL2jnBGTg+gDDlaXN51rkWcLk4fg=="], - "@dotenvx/dotenvx": ["@dotenvx/dotenvx@1.44.0", "", { "dependencies": { "commander": "^11.1.0", "dotenv": "^16.4.5", "eciesjs": "^0.4.10", "execa": "^5.1.1", "fdir": "^6.2.0", "ignore": "^5.3.0", "object-treeify": "1.1.33", "picomatch": "^4.0.2", "which": "^4.0.0" }, "bin": { "dotenvx": "src/cli/dotenvx.js", "git-dotenvx": "src/cli/dotenvx.js" } }, "sha512-18Aa+7KP/L2Kj9lxmT4EJZnsCq/xGIHgzU26rdzsKMhjpeT3YY+qin/dNAnIaVHPZnee7kXpZL55M9htd30r7Q=="], + "@dotenvx/dotenvx": ["@dotenvx/dotenvx@1.44.1", "", { "dependencies": { "commander": "^11.1.0", "dotenv": "^16.4.5", "eciesjs": "^0.4.10", "execa": "^5.1.1", "fdir": "^6.2.0", "ignore": "^5.3.0", "object-treeify": "1.1.33", "picomatch": "^4.0.2", "which": "^4.0.0" }, "bin": { "dotenvx": "src/cli/dotenvx.js", "git-dotenvx": "src/cli/dotenvx.js" } }, "sha512-j1QImCqf/XJmhIjC1OPpgiZV9g370HG9MNT9s/CDwCKsoYzNCPEKK+GfsidahJx7yIlBbm+4dPLlGec+bKn7oA=="], "@ecies/ciphers": ["@ecies/ciphers@0.2.3", "", { "peerDependencies": { "@noble/ciphers": "^1.0.0" } }, "sha512-tapn6XhOueMwht3E2UzY0ZZjYokdaw9XtL9kEyjhQ/Fb9vL9xTFbOaI+fV0AWvTpYu4BNloC6getKW6NtSg4mA=="], @@ -221,7 +221,7 @@ "@noble/ciphers": ["@noble/ciphers@1.3.0", "", {}, "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw=="], - "@noble/curves": ["@noble/curves@1.9.0", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-7YDlXiNMdO1YZeH6t/kvopHHbIZzlxrCV9WLqCY6QhcXOoXiNCMDqJIglZ9Yjx5+w7Dz30TITFrlTjnRg7sKEg=="], + "@noble/curves": ["@noble/curves@1.9.1", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA=="], "@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], @@ -279,43 +279,45 @@ "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], - "@polkadot-api/cli": ["@polkadot-api/cli@0.11.13", "", { "dependencies": { "@commander-js/extra-typings": "^13.1.0", "@polkadot-api/codegen": "0.14.0", "@polkadot-api/ink-contracts": "0.3.0", "@polkadot-api/json-rpc-provider": "0.0.4", "@polkadot-api/known-chains": "0.7.4", "@polkadot-api/metadata-compatibility": "0.2.1", "@polkadot-api/observable-client": "0.9.1", "@polkadot-api/polkadot-sdk-compat": "2.3.2", "@polkadot-api/sm-provider": "0.1.7", "@polkadot-api/smoldot": "0.3.8", "@polkadot-api/substrate-bindings": "0.12.0", "@polkadot-api/substrate-client": "0.3.0", "@polkadot-api/utils": "0.1.2", "@polkadot-api/wasm-executor": "^0.1.2", "@polkadot-api/ws-provider": "0.4.0", "@types/node": "^22.14.1", "commander": "^13.1.0", "execa": "^9.5.2", "fs.promises.exists": "^1.1.4", "ora": "^8.2.0", "read-pkg": "^9.0.1", "rxjs": "^7.8.2", "tsc-prog": "^2.3.0", "tsup": "^8.4.0", "typescript": "^5.8.3", "write-package": "^7.1.0" }, "bin": { "papi": "dist/main.js", "polkadot-api": "dist/main.js" } }, "sha512-ZIU3HrG7zlXCdjYOawjkRe7E94fODjWCXtyyFkclhwVlCHIUYcuc5OrP9jwo95pwhwRysmhdJ4lBEAm2Z1ry2w=="], + "@polkadot-api/cli": ["@polkadot-api/cli@0.13.0", "", { "dependencies": { "@commander-js/extra-typings": "^13.1.0", "@polkadot-api/codegen": "0.16.0", "@polkadot-api/ink-contracts": "0.3.2", "@polkadot-api/json-rpc-provider": "0.0.4", "@polkadot-api/known-chains": "0.7.6", "@polkadot-api/metadata-compatibility": "0.2.3", "@polkadot-api/observable-client": "0.11.0", "@polkadot-api/polkadot-sdk-compat": "2.3.2", "@polkadot-api/sm-provider": "0.1.7", "@polkadot-api/smoldot": "0.3.8", "@polkadot-api/substrate-bindings": "0.13.0", "@polkadot-api/substrate-client": "0.3.0", "@polkadot-api/utils": "0.1.2", "@polkadot-api/wasm-executor": "^0.1.2", "@polkadot-api/ws-provider": "0.4.0", "@types/node": "^22.15.18", "commander": "^13.1.0", "execa": "^9.5.3", "fs.promises.exists": "^1.1.4", "ora": "^8.2.0", "read-pkg": "^9.0.1", "rxjs": "^7.8.2", "tsc-prog": "^2.3.0", "tsup": "^8.4.0", "typescript": "^5.8.3", "write-package": "^7.1.0" }, "bin": { "papi": "dist/main.js", "polkadot-api": "dist/main.js" } }, "sha512-uumqacO1+YxuhHYOr75czxvV0KmRxm3DaZtRKzxIf2zpICnj/QnBTpJwlxU56g+pQDU5P/hTR0Thh0vrnUTNVw=="], - "@polkadot-api/codegen": ["@polkadot-api/codegen@0.14.0", "", { "dependencies": { "@polkadot-api/ink-contracts": "0.3.0", "@polkadot-api/metadata-builders": "0.11.0", "@polkadot-api/metadata-compatibility": "0.2.1", "@polkadot-api/substrate-bindings": "0.12.0", "@polkadot-api/utils": "0.1.2" } }, "sha512-X9wSdkp4Adfy0SD22QbY1zMIt47TmdeSwbluxQjiHlhqTAxGz/WD3nBCOl7An0DnQlCvstcXdtsHfBIKSm19xA=="], + "@polkadot-api/codegen": ["@polkadot-api/codegen@0.16.0", "", { "dependencies": { "@polkadot-api/ink-contracts": "0.3.2", "@polkadot-api/metadata-builders": "0.12.1", "@polkadot-api/metadata-compatibility": "0.2.3", "@polkadot-api/substrate-bindings": "0.13.0", "@polkadot-api/utils": "0.1.2" } }, "sha512-2Sq/fkB7a9Oi3t7nGc0EbTt1Nd8Pb8XGiKKS9i/wwFAdCLN2oXd33DxmRQTX0Hm2/nrBzXYh1zBuyxRUb9+Sdw=="], "@polkadot-api/descriptors": ["@polkadot-api/descriptors@file:.papi/descriptors", { "peerDependencies": { "polkadot-api": ">=1.9.11" } }], - "@polkadot-api/ink-contracts": ["@polkadot-api/ink-contracts@0.3.0", "", { "dependencies": { "@polkadot-api/metadata-builders": "0.11.0", "@polkadot-api/substrate-bindings": "0.12.0", "@polkadot-api/utils": "0.1.2" } }, "sha512-OjFeOIAE1DGzBjnDXExg7DuBbjnz/xgiN1WuKpmF3CC6TqIW55Ay6rhLah4/i1yMKvFmj4VfyqSwhF78JLsk5A=="], + "@polkadot-api/ink-contracts": ["@polkadot-api/ink-contracts@0.3.2", "", { "dependencies": { "@polkadot-api/metadata-builders": "0.12.1", "@polkadot-api/substrate-bindings": "0.13.0", "@polkadot-api/utils": "0.1.2" } }, "sha512-ipWuClaySrPI7XHIomiswXhIZfU4q/EmHmLFIwLdn9iNhLd7YLuUtGF6kacSQu76YtWd3tkLe2rGx4cRRaLjOA=="], "@polkadot-api/json-rpc-provider": ["@polkadot-api/json-rpc-provider@0.0.4", "", {}, "sha512-9cDijLIxzHOBuq6yHqpqjJ9jBmXrctjc1OFqU+tQrS96adQze3mTIH6DTgfb/0LMrqxzxffz1HQGrIlEH00WrA=="], "@polkadot-api/json-rpc-provider-proxy": ["@polkadot-api/json-rpc-provider-proxy@0.2.4", "", {}, "sha512-nuGoY9QpBAiRU7xmXN3nugFvPcnSu3IxTLm1OWcNTGlZ1LW5bvdQHz3JLk56+Jlyb3GJ971hqdg2DJsMXkKCOg=="], - "@polkadot-api/known-chains": ["@polkadot-api/known-chains@0.7.4", "", {}, "sha512-Vpwfk+XA+ZVTzPxakgWzb5VTHRrYyWKiWgAf5mY1VsNbRXyUUuhzxCFS4OGLyuo3uu3xQ4DuZXR20VB7ZR8KuA=="], + "@polkadot-api/known-chains": ["@polkadot-api/known-chains@0.7.6", "", {}, "sha512-em+p9AVfTYulC4U10I+nO42wdczN9ZSAEyb5ppQsxxsKAxaJVPVe4xsDkWzlhheheEN6OBojNHnoYNBVG6X2bg=="], "@polkadot-api/logs-provider": ["@polkadot-api/logs-provider@0.0.6", "", { "dependencies": { "@polkadot-api/json-rpc-provider": "0.0.4" } }, "sha512-4WgHlvy+xee1ADaaVf6+MlK/+jGMtsMgAzvbQOJZnP4PfQuagoTqaeayk8HYKxXGphogLlPbD06tANxcb+nvAg=="], - "@polkadot-api/metadata-builders": ["@polkadot-api/metadata-builders@0.11.0", "", { "dependencies": { "@polkadot-api/substrate-bindings": "0.12.0", "@polkadot-api/utils": "0.1.2" } }, "sha512-OoKF/mViUJMEk4DUOauHBuGLGa0tKi5sIiPfWTsXdVczjmb6+JumqWBhS0JU/KGJkK2VuKTCsqeZMJxZtuSgMQ=="], + "@polkadot-api/merkleize-metadata": ["@polkadot-api/merkleize-metadata@1.1.17", "", { "dependencies": { "@polkadot-api/metadata-builders": "0.12.1", "@polkadot-api/substrate-bindings": "0.13.0", "@polkadot-api/utils": "0.1.2" } }, "sha512-3wlLrYjpBluN5l8M1H9zgXlFHfJhqIXYvSVXTvkBYcEVKxZt0PO0f43Zgskeabg29Lx83OiPINcEHFWF8ndAzg=="], - "@polkadot-api/metadata-compatibility": ["@polkadot-api/metadata-compatibility@0.2.1", "", { "dependencies": { "@polkadot-api/metadata-builders": "0.11.0", "@polkadot-api/substrate-bindings": "0.12.0" } }, "sha512-OGgMoS0JMKBqTnNoh8wCwWjJQcdMD8bG7fEXGDUaQaSp4qklsEqqSuEJh6ZhzdEFIZT2gFe+JaOIIEmOgIrkKA=="], + "@polkadot-api/metadata-builders": ["@polkadot-api/metadata-builders@0.12.1", "", { "dependencies": { "@polkadot-api/substrate-bindings": "0.13.0", "@polkadot-api/utils": "0.1.2" } }, "sha512-heGt+WgcxrS1CqMm9XwD2DC+fI6azMKJf2ToMP+H12yw6FAy++nijASDZ3MlV/0ZpA/QGZpuZmgQmxKh6jbxVg=="], - "@polkadot-api/observable-client": ["@polkadot-api/observable-client@0.9.1", "", { "dependencies": { "@polkadot-api/metadata-builders": "0.11.0", "@polkadot-api/substrate-bindings": "0.12.0", "@polkadot-api/utils": "0.1.2" }, "peerDependencies": { "@polkadot-api/substrate-client": "0.3.0", "rxjs": ">=7.8.0" } }, "sha512-XPZUx8h0xrZTWWeNwk+074OK9jHF4P6e5iwHN9T2Q37cquls/+7DNKKIhbKFpoQeLrNGa2viAC6/aio8Au1JFQ=="], + "@polkadot-api/metadata-compatibility": ["@polkadot-api/metadata-compatibility@0.2.3", "", { "dependencies": { "@polkadot-api/metadata-builders": "0.12.1", "@polkadot-api/substrate-bindings": "0.13.0" } }, "sha512-rtym491RA2yl8qGdEDJVujiCya+DK0CW5AwB6InSo85Um04/WWMq7oboRiXQZmspwLkfm2vYBusl/Q9k4Rxshw=="], - "@polkadot-api/pjs-signer": ["@polkadot-api/pjs-signer@0.6.6", "", { "dependencies": { "@polkadot-api/metadata-builders": "0.11.0", "@polkadot-api/polkadot-signer": "0.1.6", "@polkadot-api/signers-common": "0.1.7", "@polkadot-api/substrate-bindings": "0.12.0", "@polkadot-api/utils": "0.1.2" } }, "sha512-xlETsRLsrH/DcRh2pD9j9Go8uVR8rUFffTpF4zGzA4eCxyE7rqJO6td6N7/KuEMmLRrl/VddbxQ1ttXY9U0N6w=="], + "@polkadot-api/observable-client": ["@polkadot-api/observable-client@0.11.0", "", { "dependencies": { "@polkadot-api/metadata-builders": "0.12.1", "@polkadot-api/substrate-bindings": "0.13.0", "@polkadot-api/utils": "0.1.2" }, "peerDependencies": { "@polkadot-api/substrate-client": "0.3.0", "rxjs": ">=7.8.0" } }, "sha512-cyXyih+RI73vPcUQ6GxyMelm1Z3bGDvBIow8W3MqBdpUy4mZ87QGQXGpyBC0Op/qnIxrUFP1cLyT38fUe0i6KQ=="], + + "@polkadot-api/pjs-signer": ["@polkadot-api/pjs-signer@0.6.8", "", { "dependencies": { "@polkadot-api/metadata-builders": "0.12.1", "@polkadot-api/polkadot-signer": "0.1.6", "@polkadot-api/signers-common": "0.1.9", "@polkadot-api/substrate-bindings": "0.13.0", "@polkadot-api/utils": "0.1.2" } }, "sha512-YBp+uF2mPZFH4VjT5xgIU462EXbdLrFz09D6vY4SgoS2FRbPV7ktnqiNK2BykKJPGV4TiqpEjNB4OtX6ZLzafg=="], "@polkadot-api/polkadot-sdk-compat": ["@polkadot-api/polkadot-sdk-compat@2.3.2", "", { "dependencies": { "@polkadot-api/json-rpc-provider": "0.0.4" } }, "sha512-rLCveP3a6Xd0r218yRqVY34lJ8bXVmE12cArbU4JFp9p8e8Jbb6xdqOdu7bQtjlZUsahhcmfIHYQSXKziST7PA=="], "@polkadot-api/polkadot-signer": ["@polkadot-api/polkadot-signer@0.1.6", "", {}, "sha512-X7ghAa4r7doETtjAPTb50IpfGtrBmy3BJM5WCfNKa1saK04VFY9w+vDn+hwEcM4p0PcDHt66Ts74hzvHq54d9A=="], - "@polkadot-api/signer": ["@polkadot-api/signer@0.1.16", "", { "dependencies": { "@noble/hashes": "^1.8.0", "@polkadot-api/polkadot-signer": "0.1.6", "@polkadot-api/signers-common": "0.1.7", "@polkadot-api/substrate-bindings": "0.12.0", "@polkadot-api/utils": "0.1.2" } }, "sha512-xF48AKpzUEtswkzeV8Tn09B4Nmgg/TXPl2BSZkepnCTZuNynpAdyuEnjdFnv683RO3UHmwRD/prqfzInsZyrZw=="], + "@polkadot-api/signer": ["@polkadot-api/signer@0.2.1", "", { "dependencies": { "@noble/hashes": "^1.8.0", "@polkadot-api/merkleize-metadata": "1.1.17", "@polkadot-api/polkadot-signer": "0.1.6", "@polkadot-api/signers-common": "0.1.9", "@polkadot-api/substrate-bindings": "0.13.0", "@polkadot-api/utils": "0.1.2" } }, "sha512-z3BPDIglLh/hghQExQVVHR3xgIijjEVcIA2P+xLan5vO4cglGm4U6vIBXgKBuU2oxKlG494ixH8BkXSv5F79zw=="], - "@polkadot-api/signers-common": ["@polkadot-api/signers-common@0.1.7", "", { "dependencies": { "@polkadot-api/metadata-builders": "0.11.0", "@polkadot-api/polkadot-signer": "0.1.6", "@polkadot-api/substrate-bindings": "0.12.0", "@polkadot-api/utils": "0.1.2" } }, "sha512-dZSffjs/JjDmdInVp3Is55A2Vf67hUY0I7zTq7jSwPyOgSrHn//6o9PLKbCq1EI0pqFHzWPN5i+dzI0hy00SSw=="], + "@polkadot-api/signers-common": ["@polkadot-api/signers-common@0.1.9", "", { "dependencies": { "@polkadot-api/metadata-builders": "0.12.1", "@polkadot-api/polkadot-signer": "0.1.6", "@polkadot-api/substrate-bindings": "0.13.0", "@polkadot-api/utils": "0.1.2" } }, "sha512-eOAPfnNpa0kJrtM/OPHOt+jlFP97c4CWZmzfcPzOqfrLUgyyLzVCFzgBipffpzPXNPQsToM6FM+7DQEgQmoDuA=="], "@polkadot-api/sm-provider": ["@polkadot-api/sm-provider@0.1.7", "", { "dependencies": { "@polkadot-api/json-rpc-provider": "0.0.4", "@polkadot-api/json-rpc-provider-proxy": "0.2.4" }, "peerDependencies": { "@polkadot-api/smoldot": ">=0.3" } }, "sha512-BhNKVeIFZdawpPVadXszLl8IP4EDjcLHe/GchfRRFkvoNFuwS2nNv/npYIqCviXV+dd2R8VnEELxwScsf380Og=="], "@polkadot-api/smoldot": ["@polkadot-api/smoldot@0.3.8", "", { "dependencies": { "@types/node": "^22.9.0", "smoldot": "2.0.34" } }, "sha512-dbJSMRFtELDW+rZIWRwKE/K8oy7+gYaGl+DvaOjARoBW2n80rJ7RAMOCCu+b5h2zgl3elftFBwMNAuAWgHT/Zg=="], - "@polkadot-api/substrate-bindings": ["@polkadot-api/substrate-bindings@0.12.0", "", { "dependencies": { "@noble/hashes": "^1.8.0", "@polkadot-api/utils": "0.1.2", "@scure/base": "^1.2.5", "scale-ts": "^1.6.1" } }, "sha512-cIjDeJRHW6g3z+/55UzpoG4LG1N0HbT4x3NvZsQkYg4eoio9Sw7Pw2aZZX86pWemxc7vQbNw7WSz2Gz+ckdX6Q=="], + "@polkadot-api/substrate-bindings": ["@polkadot-api/substrate-bindings@0.13.0", "", { "dependencies": { "@noble/hashes": "^1.8.0", "@polkadot-api/utils": "0.1.2", "@scure/base": "^1.2.5", "scale-ts": "^1.6.1" } }, "sha512-M/60lXtHr4flwx4K7L4xv2jLk44EhD8UB4jvah+jbZM195I89nZGXKo2JOkgyR5DHoLj//TAoBkLedZmaaAiaQ=="], "@polkadot-api/substrate-client": ["@polkadot-api/substrate-client@0.3.0", "", { "dependencies": { "@polkadot-api/json-rpc-provider": "0.0.4", "@polkadot-api/utils": "0.1.2" } }, "sha512-0hEvQLKH2zhaFzE8DPkWehvJilec8u2O2wbIEUStm0OJ8jIFtJ40MFjXQfB01dXBWUz1KaVBqS6xd3sZA90Dpw=="], @@ -433,13 +435,13 @@ "@types/docker-modem": ["@types/docker-modem@3.0.6", "", { "dependencies": { "@types/node": "*", "@types/ssh2": "*" } }, "sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg=="], - "@types/dockerode": ["@types/dockerode@3.3.38", "", { "dependencies": { "@types/docker-modem": "*", "@types/node": "*", "@types/ssh2": "*" } }, "sha512-nnrcfUe2iR+RyOuz0B4bZgQwD9djQa9ADEjp7OAgBs10pYT0KSCtplJjcmBDJz0qaReX5T7GbE5i4VplvzUHvA=="], + "@types/dockerode": ["@types/dockerode@3.3.39", "", { "dependencies": { "@types/docker-modem": "*", "@types/node": "*", "@types/ssh2": "*" } }, "sha512-uMPmxehH6ofeYjaslASPtjvyH8FRJdM9fZ+hjhGzL4Jq3bGjr9D7TKmp9soSwgFncNk0HOwmyBxjqOb3ikjjsA=="], "@types/estree": ["@types/estree@1.0.7", "", {}, "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ=="], "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], - "@types/node": ["@types/node@22.15.17", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw=="], + "@types/node": ["@types/node@22.15.21", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-EV/37Td6c+MgKAbkcLG6vqZ2zEYHD7bvSrzqqs2RIhbA6w3x+Dqz8MZM3sP6kGTeLrdoOgKZe+Xja7tUB2DNkQ=="], "@types/normalize-package-data": ["@types/normalize-package-data@2.4.4", "", {}, "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA=="], @@ -449,15 +451,15 @@ "@wagmi/cli": ["@wagmi/cli@2.3.1", "", { "dependencies": { "abitype": "^1.0.4", "bundle-require": "^5.1.0", "cac": "^6.7.14", "change-case": "^5.4.4", "chokidar": "4.0.1", "dedent": "^0.7.0", "dotenv": "^16.3.1", "dotenv-expand": "^10.0.0", "esbuild": "~0.25.4", "escalade": "3.2.0", "fdir": "^6.1.1", "nanospinner": "1.2.2", "pathe": "^1.1.2", "picocolors": "^1.0.0", "picomatch": "^3.0.0", "prettier": "^3.0.3", "viem": "2.x", "zod": "^3.22.2" }, "peerDependencies": { "typescript": ">=5.0.4" }, "optionalPeers": ["typescript"], "bin": { "wagmi": "dist/esm/cli.js" } }, "sha512-o7s4MJ7Lnd+DEVNP4+Mbtm22FU1bxv4stJSgWqlCfpIAk0TpqNhdYXXW18wreRGLUewEZfif4q7M3JfRSTce0g=="], - "@wagmi/connectors": ["@wagmi/connectors@5.8.1", "", { "dependencies": { "@coinbase/wallet-sdk": "4.3.0", "@metamask/sdk": "0.32.0", "@safe-global/safe-apps-provider": "0.18.6", "@safe-global/safe-apps-sdk": "9.1.0", "@walletconnect/ethereum-provider": "2.20.0", "cbw-sdk": "npm:@coinbase/wallet-sdk@3.9.3" }, "peerDependencies": { "@wagmi/core": "2.17.1", "typescript": ">=5.0.4", "viem": "2.x" }, "optionalPeers": ["typescript"] }, "sha512-SGbodB8a/Yr3SHPzWO1cWg/PFXTpimsxbR59q1usv0Nsj+5imocVtP3ba9KnSqOfv5wEvP4ljyQhHHa7ALoJOw=="], + "@wagmi/connectors": ["@wagmi/connectors@5.8.3", "", { "dependencies": { "@coinbase/wallet-sdk": "4.3.0", "@metamask/sdk": "0.32.0", "@safe-global/safe-apps-provider": "0.18.6", "@safe-global/safe-apps-sdk": "9.1.0", "@walletconnect/ethereum-provider": "2.20.2", "cbw-sdk": "npm:@coinbase/wallet-sdk@3.9.3" }, "peerDependencies": { "@wagmi/core": "2.17.2", "typescript": ">=5.0.4", "viem": "2.x" }, "optionalPeers": ["typescript"] }, "sha512-U4SJgi91+ny/XDGQWAMmawMafDx1BofcbYkPT/WSU6XrGL+apa7VltscqY7PVmwVGi/CYTqe8nlQiK/wmQ8D3A=="], - "@wagmi/core": ["@wagmi/core@2.17.1", "", { "dependencies": { "eventemitter3": "5.0.1", "mipd": "0.0.7", "zustand": "5.0.0" }, "peerDependencies": { "@tanstack/query-core": ">=5.0.0", "typescript": ">=5.0.4", "viem": "2.x" }, "optionalPeers": ["@tanstack/query-core", "typescript"] }, "sha512-tbeNv8HquzrVj2Inv0bv229SejPABnWAmbBNvPJJedYpKStgXlbK4jnRhCf5qG5un3ZO/KYFGQYaghTzWSULGg=="], + "@wagmi/core": ["@wagmi/core@2.17.2", "", { "dependencies": { "eventemitter3": "5.0.1", "mipd": "0.0.7", "zustand": "5.0.0" }, "peerDependencies": { "@tanstack/query-core": ">=5.0.0", "typescript": ">=5.0.4", "viem": "2.x" }, "optionalPeers": ["@tanstack/query-core", "typescript"] }, "sha512-p1z8VU0YuRClx2bdPoFObDF7M2Reitz9AdByrJ+i5zcPCHuJ/UjaWPv6xD7ydhkWVK0hoa8vQ/KtaiEwEQS7Mg=="], - "@walletconnect/core": ["@walletconnect/core@2.20.0", "", { "dependencies": { "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-provider": "1.0.14", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/jsonrpc-ws-connection": "1.0.16", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/logger": "2.1.2", "@walletconnect/relay-api": "1.0.11", "@walletconnect/relay-auth": "1.1.0", "@walletconnect/safe-json": "1.0.2", "@walletconnect/time": "1.0.2", "@walletconnect/types": "2.20.0", "@walletconnect/utils": "2.20.0", "@walletconnect/window-getters": "1.0.1", "es-toolkit": "1.33.0", "events": "3.3.0", "uint8arrays": "3.1.0" } }, "sha512-MpCx9WthaAJ9pA2oHC84oTFUtntjj9mCmevwBDPVsQ2Q/pYeh2+THDPaaw6fzTbNTXyGCvJXRyLQkN9xO+Vmzw=="], + "@walletconnect/core": ["@walletconnect/core@2.20.2", "", { "dependencies": { "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-provider": "1.0.14", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/jsonrpc-ws-connection": "1.0.16", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/logger": "2.1.2", "@walletconnect/relay-api": "1.0.11", "@walletconnect/relay-auth": "1.1.0", "@walletconnect/safe-json": "1.0.2", "@walletconnect/time": "1.0.2", "@walletconnect/types": "2.20.2", "@walletconnect/utils": "2.20.2", "@walletconnect/window-getters": "1.0.1", "es-toolkit": "1.33.0", "events": "3.3.0", "uint8arrays": "3.1.0" } }, "sha512-48XnarxQQrpJ0KZJOjit56DxuzfVRYUdL8XVMvUh/ZNUiX2FB5w6YuljUUeTLfYOf04Et6qhVGEUkmX3W+9/8w=="], "@walletconnect/environment": ["@walletconnect/environment@1.0.1", "", { "dependencies": { "tslib": "1.14.1" } }, "sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg=="], - "@walletconnect/ethereum-provider": ["@walletconnect/ethereum-provider@2.20.0", "", { "dependencies": { "@reown/appkit": "1.7.3", "@walletconnect/jsonrpc-http-connection": "1.0.8", "@walletconnect/jsonrpc-provider": "1.0.14", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/sign-client": "2.20.0", "@walletconnect/types": "2.20.0", "@walletconnect/universal-provider": "2.20.0", "@walletconnect/utils": "2.20.0", "events": "3.3.0" } }, "sha512-TSu1nr+AzCjM5u7xdnWTGX8ryKuHHb1Za56BD6UU0UPS7ZC2fZ99TVa5Q3Sng9JyksY5p99Iwg7fOtlozc3QYQ=="], + "@walletconnect/ethereum-provider": ["@walletconnect/ethereum-provider@2.20.2", "", { "dependencies": { "@reown/appkit": "1.7.3", "@walletconnect/jsonrpc-http-connection": "1.0.8", "@walletconnect/jsonrpc-provider": "1.0.14", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/sign-client": "2.20.2", "@walletconnect/types": "2.20.2", "@walletconnect/universal-provider": "2.20.2", "@walletconnect/utils": "2.20.2", "events": "3.3.0" } }, "sha512-fGNJtytHuBWZcmMXRIG1djlfEiPMvPJ0R3JlfJjAx2VfVN+O+1xdF6QSWcZxFizviIUFJV+f1zWt0V2VVD61Rg=="], "@walletconnect/events": ["@walletconnect/events@1.0.1", "", { "dependencies": { "keyvaluestorage-interface": "^1.0.0", "tslib": "1.14.1" } }, "sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ=="], @@ -483,15 +485,15 @@ "@walletconnect/safe-json": ["@walletconnect/safe-json@1.0.2", "", { "dependencies": { "tslib": "1.14.1" } }, "sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA=="], - "@walletconnect/sign-client": ["@walletconnect/sign-client@2.20.0", "", { "dependencies": { "@walletconnect/core": "2.20.0", "@walletconnect/events": "1.0.1", "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/logger": "2.1.2", "@walletconnect/time": "1.0.2", "@walletconnect/types": "2.20.0", "@walletconnect/utils": "2.20.0", "events": "3.3.0" } }, "sha512-5Ao9RVGsgpMTLjVByFfjMbX7RwJM0HvKV7P9ONJwPPo4OiviNyneeOufr2KKZhuwF+QUu5mTE0Lj/euGWSNaOQ=="], + "@walletconnect/sign-client": ["@walletconnect/sign-client@2.20.2", "", { "dependencies": { "@walletconnect/core": "2.20.2", "@walletconnect/events": "1.0.1", "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/logger": "2.1.2", "@walletconnect/time": "1.0.2", "@walletconnect/types": "2.20.2", "@walletconnect/utils": "2.20.2", "events": "3.3.0" } }, "sha512-KyeDToypZ1OjCbij4Jx0cAg46bMwZ6zCKt0HzCkqENcex3Zchs7xBp9r8GtfEMGw+PUnXwqrhzmLBH0x/43oIQ=="], "@walletconnect/time": ["@walletconnect/time@1.0.2", "", { "dependencies": { "tslib": "1.14.1" } }, "sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g=="], - "@walletconnect/types": ["@walletconnect/types@2.20.0", "", { "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/logger": "2.1.2", "events": "3.3.0" } }, "sha512-oFGHRL/yQbZqBiTA8yvV+PGJYBU/laDAQWFiJZ9Xlv+qN5EzHipW39Ru6qyp8P4DGnbQI6bHPs9bizJ7hkDRKA=="], + "@walletconnect/types": ["@walletconnect/types@2.20.2", "", { "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/logger": "2.1.2", "events": "3.3.0" } }, "sha512-XPPbJM/mGU05i6jUxhC3yI/YvhSF6TYJQ5SXTWM53lVe6hs6ukvlEhPctu9ZBTGwGFhwPXIjtK/eWx+v4WY5iw=="], - "@walletconnect/universal-provider": ["@walletconnect/universal-provider@2.20.0", "", { "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/jsonrpc-http-connection": "1.0.8", "@walletconnect/jsonrpc-provider": "1.0.14", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/logger": "2.1.2", "@walletconnect/sign-client": "2.20.0", "@walletconnect/types": "2.20.0", "@walletconnect/utils": "2.20.0", "es-toolkit": "1.33.0", "events": "3.3.0" } }, "sha512-kzMWXao+RyWfv46nS/owJ99/QhObGkYHhpMxdzl4bae98JXdQ0xhmov3Rvy3GRt5csgJXldoM2VO44B/Fsuj4Q=="], + "@walletconnect/universal-provider": ["@walletconnect/universal-provider@2.20.2", "", { "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/jsonrpc-http-connection": "1.0.8", "@walletconnect/jsonrpc-provider": "1.0.14", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/logger": "2.1.2", "@walletconnect/sign-client": "2.20.2", "@walletconnect/types": "2.20.2", "@walletconnect/utils": "2.20.2", "es-toolkit": "1.33.0", "events": "3.3.0" } }, "sha512-6uVu1E88tioaXEEJCbJKwCIQlOHif1nmfY092BznZEnBn2lli5ICzQh2bxtUDNmNNLKsMDI3FV1fODFeWMVJTQ=="], - "@walletconnect/utils": ["@walletconnect/utils@2.20.0", "", { "dependencies": { "@noble/ciphers": "1.2.1", "@noble/curves": "1.8.1", "@noble/hashes": "1.7.1", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/relay-api": "1.0.11", "@walletconnect/relay-auth": "1.1.0", "@walletconnect/safe-json": "1.0.2", "@walletconnect/time": "1.0.2", "@walletconnect/types": "2.20.0", "@walletconnect/window-getters": "1.0.1", "@walletconnect/window-metadata": "1.0.1", "bs58": "6.0.0", "detect-browser": "5.3.0", "query-string": "7.1.3", "uint8arrays": "3.1.0", "viem": "2.23.2" } }, "sha512-PlglakJ/zhBRUg7yfulfedWgPC0ZoVEYCiniFkCeWfTq03ufvkB3tgBJQkNoHUV7ZgPYxAdSbO3KsKceZzjufw=="], + "@walletconnect/utils": ["@walletconnect/utils@2.20.2", "", { "dependencies": { "@noble/ciphers": "1.2.1", "@noble/curves": "1.8.1", "@noble/hashes": "1.7.1", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/relay-api": "1.0.11", "@walletconnect/relay-auth": "1.1.0", "@walletconnect/safe-json": "1.0.2", "@walletconnect/time": "1.0.2", "@walletconnect/types": "2.20.2", "@walletconnect/window-getters": "1.0.1", "@walletconnect/window-metadata": "1.0.1", "bs58": "6.0.0", "detect-browser": "5.3.0", "query-string": "7.1.3", "uint8arrays": "3.1.0", "viem": "2.23.2" } }, "sha512-2uRUDvpYSIJFYcr1WIuiFy6CEszLF030o6W8aDMkGk9/MfAZYEJQHMJcjWyaNMPHLJT0POR5lPaqkYOpuyPIQQ=="], "@walletconnect/window-getters": ["@walletconnect/window-getters@1.0.1", "", { "dependencies": { "tslib": "1.14.1" } }, "sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q=="], @@ -797,7 +799,7 @@ "isexe": ["isexe@3.1.1", "", {}, "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ=="], - "isows": ["isows@1.0.6", "", { "peerDependencies": { "ws": "*" } }, "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw=="], + "isows": ["isows@1.0.7", "", { "peerDependencies": { "ws": "*" } }, "sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg=="], "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], @@ -891,7 +893,7 @@ "object-treeify": ["object-treeify@1.1.33", "", {}, "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A=="], - "octokit": ["octokit@4.1.3", "", { "dependencies": { "@octokit/app": "^15.1.6", "@octokit/core": "^6.1.5", "@octokit/oauth-app": "^7.1.6", "@octokit/plugin-paginate-graphql": "^5.2.4", "@octokit/plugin-paginate-rest": "^12.0.0", "@octokit/plugin-rest-endpoint-methods": "^14.0.0", "@octokit/plugin-retry": "^7.2.1", "@octokit/plugin-throttling": "^10.0.0", "@octokit/request-error": "^6.1.8", "@octokit/types": "^14.0.0" } }, "sha512-PP+EL8h4xPCE9NBo6jXq6I2/EiTXsn1cg9F0IZehHBv/qhuQpyGMFElEB17miWKciuT6vRHiFFiG9+FoXOmg6A=="], + "octokit": ["octokit@4.1.4", "", { "dependencies": { "@octokit/app": "^15.1.6", "@octokit/core": "^6.1.5", "@octokit/oauth-app": "^7.1.6", "@octokit/plugin-paginate-graphql": "^5.2.4", "@octokit/plugin-paginate-rest": "^12.0.0", "@octokit/plugin-rest-endpoint-methods": "^14.0.0", "@octokit/plugin-retry": "^7.2.1", "@octokit/plugin-throttling": "^10.0.0", "@octokit/request-error": "^6.1.8", "@octokit/types": "^14.0.0", "@octokit/webhooks": "^13.8.3" } }, "sha512-cRvxRte6FU3vAHRC9+PMSY3D+mRAs2Rd9emMoqp70UGRvJRM3sbAoim2IXRZNNsf8wVfn4sGxVBHRAP+JBVX/g=="], "ofetch": ["ofetch@1.4.1", "", { "dependencies": { "destr": "^2.0.3", "node-fetch-native": "^1.6.4", "ufo": "^1.5.4" } }, "sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw=="], @@ -933,7 +935,7 @@ "pify": ["pify@3.0.0", "", {}, "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg=="], - "pino": ["pino@9.6.0", "", { "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^2.0.0", "pino-std-serializers": "^7.0.0", "process-warning": "^4.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", "sonic-boom": "^4.0.1", "thread-stream": "^3.0.0" }, "bin": { "pino": "bin.js" } }, "sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg=="], + "pino": ["pino@9.7.0", "", { "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^2.0.0", "pino-std-serializers": "^7.0.0", "process-warning": "^5.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", "sonic-boom": "^4.0.1", "thread-stream": "^3.0.0" }, "bin": { "pino": "bin.js" } }, "sha512-vnMCM6xZTb1WDmLvtG2lE/2p+t9hDEIvTWJsu6FejkE62vB7gDhvzrpFR4Cw2to+9JNQxVnkAKVPA1KPB98vWg=="], "pino-abstract-transport": ["pino-abstract-transport@2.0.0", "", { "dependencies": { "split2": "^4.0.0" } }, "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw=="], @@ -945,7 +947,7 @@ "pngjs": ["pngjs@5.0.0", "", {}, "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw=="], - "polkadot-api": ["polkadot-api@1.10.2", "", { "dependencies": { "@polkadot-api/cli": "0.11.13", "@polkadot-api/ink-contracts": "0.3.0", "@polkadot-api/json-rpc-provider": "0.0.4", "@polkadot-api/known-chains": "0.7.4", "@polkadot-api/logs-provider": "0.0.6", "@polkadot-api/metadata-builders": "0.11.0", "@polkadot-api/metadata-compatibility": "0.2.1", "@polkadot-api/observable-client": "0.9.1", "@polkadot-api/pjs-signer": "0.6.6", "@polkadot-api/polkadot-sdk-compat": "2.3.2", "@polkadot-api/polkadot-signer": "0.1.6", "@polkadot-api/signer": "0.1.16", "@polkadot-api/sm-provider": "0.1.7", "@polkadot-api/smoldot": "0.3.8", "@polkadot-api/substrate-bindings": "0.12.0", "@polkadot-api/substrate-client": "0.3.0", "@polkadot-api/utils": "0.1.2", "@polkadot-api/ws-provider": "0.4.0", "@rx-state/core": "^0.1.4" }, "peerDependencies": { "rxjs": ">=7.8.0" }, "bin": { "papi": "bin/cli.mjs", "polkadot-api": "bin/cli.mjs" } }, "sha512-WkKPBzCzMi/IBmIqdJDiYBckWiGBzr9o/lqITB+xfLXsiyrofCrmWO0gtLouDdAt2ToGqQJon8UcK8UhUAYYTQ=="], + "polkadot-api": ["polkadot-api@1.12.0", "", { "dependencies": { "@polkadot-api/cli": "0.13.0", "@polkadot-api/ink-contracts": "0.3.2", "@polkadot-api/json-rpc-provider": "0.0.4", "@polkadot-api/known-chains": "0.7.6", "@polkadot-api/logs-provider": "0.0.6", "@polkadot-api/metadata-builders": "0.12.1", "@polkadot-api/metadata-compatibility": "0.2.3", "@polkadot-api/observable-client": "0.11.0", "@polkadot-api/pjs-signer": "0.6.8", "@polkadot-api/polkadot-sdk-compat": "2.3.2", "@polkadot-api/polkadot-signer": "0.1.6", "@polkadot-api/signer": "0.2.1", "@polkadot-api/sm-provider": "0.1.7", "@polkadot-api/smoldot": "0.3.8", "@polkadot-api/substrate-bindings": "0.13.0", "@polkadot-api/substrate-client": "0.3.0", "@polkadot-api/utils": "0.1.2", "@polkadot-api/ws-provider": "0.4.0", "@rx-state/core": "^0.1.4" }, "peerDependencies": { "rxjs": ">=7.8.0" }, "bin": { "papi": "bin/cli.mjs", "polkadot-api": "bin/cli.mjs" } }, "sha512-CstKp0ySE3JRVnG4nzl6hDhYLf4Qs/XpVk1xJrypYMqVbTu8FwjBK3l3j4pHhEttVudlEjK2hoVzQ1MdxMLeEg=="], "pony-cause": ["pony-cause@2.1.11", "", {}, "sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg=="], @@ -961,7 +963,7 @@ "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], - "process-warning": ["process-warning@4.0.1", "", {}, "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q=="], + "process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], "protobufjs": ["protobufjs@7.5.1", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.4", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.0", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", "@types/node": ">=13.7.0", "long": "^5.0.0" } }, "sha512-3qx3IRjR9WPQKagdwrKjO3Gu8RgQR2qqw+1KnigWhoVjFqegIj1K3bP11sGqhxrO46/XL7lekuG4jmjL+4cLsw=="], @@ -1147,9 +1149,9 @@ "valtio": ["valtio@1.13.2", "", { "dependencies": { "derive-valtio": "0.1.0", "proxy-compare": "2.6.0", "use-sync-external-store": "1.2.0" }, "peerDependencies": { "@types/react": ">=16.8", "react": ">=16.8" }, "optionalPeers": ["@types/react", "react"] }, "sha512-Qik0o+DSy741TmkqmRfjq+0xpZBXi/Y6+fXZLn0xNF1z/waFMbE3rkivv5Zcf9RrMUp6zswf2J7sbh2KBlba5A=="], - "viem": ["viem@2.29.2", "", { "dependencies": { "@noble/curves": "1.8.2", "@noble/hashes": "1.7.2", "@scure/bip32": "1.6.2", "@scure/bip39": "1.5.4", "abitype": "1.0.8", "isows": "1.0.6", "ox": "0.6.9", "ws": "8.18.1" }, "peerDependencies": { "typescript": ">=5.0.4" }, "optionalPeers": ["typescript"] }, "sha512-cukRxab90jvQ+TDD84sU3qB3UmejYqgCw4cX8SfWzvh7JPfZXI3kAMUaT5OSR2As1Mgvx1EJawccwPjGqkSSwA=="], + "viem": ["viem@2.30.0", "", { "dependencies": { "@noble/curves": "1.8.2", "@noble/hashes": "1.7.2", "@scure/bip32": "1.6.2", "@scure/bip39": "1.5.4", "abitype": "1.0.8", "isows": "1.0.7", "ox": "0.6.9", "ws": "8.18.1" }, "peerDependencies": { "typescript": ">=5.0.4" }, "optionalPeers": ["typescript"] }, "sha512-hvO4l5JIOnYPL8imULoFQiVTSkebIqzGHmIfsdMfIHpAgBaCx8rJJH9cXAxQeWCqsFuTmjEj1cX912N7HSCgpQ=="], - "wagmi": ["wagmi@2.15.2", "", { "dependencies": { "@wagmi/connectors": "5.8.1", "@wagmi/core": "2.17.1", "use-sync-external-store": "1.4.0" }, "peerDependencies": { "@tanstack/react-query": ">=5.0.0", "react": ">=18", "typescript": ">=5.0.4", "viem": "2.x" }, "optionalPeers": ["typescript"] }, "sha512-LbPr4QnZ9ixhlLyPhN2ajzMJaLKBArD2e9oVXDIEXe2qk+X8lviNRPmwymy9eF25S8B4kL7v4eeEbxQQLNw9XQ=="], + "wagmi": ["wagmi@2.15.4", "", { "dependencies": { "@wagmi/connectors": "5.8.3", "@wagmi/core": "2.17.2", "use-sync-external-store": "1.4.0" }, "peerDependencies": { "@tanstack/react-query": ">=5.0.0", "react": ">=18", "typescript": ">=5.0.4", "viem": "2.x" }, "optionalPeers": ["typescript"] }, "sha512-0m7uo6t/oSFS+4UCUTBnmIhDSP7PGJz1qx4VtALcsBnw81UPPIXMSM8oGVrUNV9CptryiDgBlh4iYmRldg9iaA=="], "webextension-polyfill": ["webextension-polyfill@0.10.0", "", {}, "sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g=="], @@ -1183,7 +1185,7 @@ "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], - "yaml": ["yaml@2.7.1", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ=="], + "yaml": ["yaml@2.8.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ=="], "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], @@ -1193,7 +1195,7 @@ "yoctocolors-cjs": ["yoctocolors-cjs@2.1.2", "", {}, "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA=="], - "zod": ["zod@3.24.4", "", {}, "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg=="], + "zod": ["zod@3.25.17", "", {}, "sha512-8hQzQ/kMOIFbwOgPrm9Sf9rtFHpFUMy4HvN0yEB0spw14aYi0uT5xG5CE2DB9cd51GWNsz+DNO7se1kztHMKnw=="], "zustand": ["zustand@5.0.0", "", { "peerDependencies": { "@types/react": ">=18.0.0", "immer": ">=9.0.6", "react": ">=18.0.0", "use-sync-external-store": ">=1.2.0" }, "optionalPeers": ["@types/react", "immer", "react", "use-sync-external-store"] }, "sha512-LE+VcmbartOPM+auOjCCLQOsQ05zUTp8RkgwRzefUk+2jISdMMFnxvyTjA4YNWr5ZGXYbVsEMZosttuxUBkojQ=="], @@ -1219,26 +1221,44 @@ "@polkadot-api/cli/execa": ["execa@9.5.3", "", { "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "cross-spawn": "^7.0.3", "figures": "^6.1.0", "get-stream": "^9.0.0", "human-signals": "^8.0.0", "is-plain-obj": "^4.1.0", "is-stream": "^4.0.1", "npm-run-path": "^6.0.0", "pretty-ms": "^9.0.0", "signal-exit": "^4.1.0", "strip-final-newline": "^4.0.0", "yoctocolors": "^2.0.0" } }, "sha512-QFNnTvU3UjgWFy8Ef9iDHvIdcgZ344ebkwYx4/KLbR+CKQA4xBaHzv+iRpp86QfMHP8faFQLh8iOc57215y4Rg=="], + "@polkadot-api/smoldot/@types/node": ["@types/node@22.15.17", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw=="], + "@reown/appkit/@walletconnect/types": ["@walletconnect/types@2.19.2", "", { "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/logger": "2.1.2", "events": "3.3.0" } }, "sha512-/LZWhkVCUN+fcTgQUxArxhn2R8DF+LSd/6Wh9FnpjeK/Sdupx1EPS8okWG6WPAqq2f404PRoNAfQytQ82Xdl3g=="], "@reown/appkit/@walletconnect/universal-provider": ["@walletconnect/universal-provider@2.19.2", "", { "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/jsonrpc-http-connection": "1.0.8", "@walletconnect/jsonrpc-provider": "1.0.14", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/logger": "2.1.2", "@walletconnect/sign-client": "2.19.2", "@walletconnect/types": "2.19.2", "@walletconnect/utils": "2.19.2", "es-toolkit": "1.33.0", "events": "3.3.0" } }, "sha512-LkKg+EjcSUpPUhhvRANgkjPL38wJPIWumAYD8OK/g4OFuJ4W3lS/XTCKthABQfFqmiNbNbVllmywiyE44KdpQg=="], + "@reown/appkit/viem": ["viem@2.29.2", "", { "dependencies": { "@noble/curves": "1.8.2", "@noble/hashes": "1.7.2", "@scure/bip32": "1.6.2", "@scure/bip39": "1.5.4", "abitype": "1.0.8", "isows": "1.0.6", "ox": "0.6.9", "ws": "8.18.1" }, "peerDependencies": { "typescript": ">=5.0.4" }, "optionalPeers": ["typescript"] }, "sha512-cukRxab90jvQ+TDD84sU3qB3UmejYqgCw4cX8SfWzvh7JPfZXI3kAMUaT5OSR2As1Mgvx1EJawccwPjGqkSSwA=="], + + "@reown/appkit-common/viem": ["viem@2.29.2", "", { "dependencies": { "@noble/curves": "1.8.2", "@noble/hashes": "1.7.2", "@scure/bip32": "1.6.2", "@scure/bip39": "1.5.4", "abitype": "1.0.8", "isows": "1.0.6", "ox": "0.6.9", "ws": "8.18.1" }, "peerDependencies": { "typescript": ">=5.0.4" }, "optionalPeers": ["typescript"] }, "sha512-cukRxab90jvQ+TDD84sU3qB3UmejYqgCw4cX8SfWzvh7JPfZXI3kAMUaT5OSR2As1Mgvx1EJawccwPjGqkSSwA=="], + "@reown/appkit-controllers/@walletconnect/universal-provider": ["@walletconnect/universal-provider@2.19.2", "", { "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/jsonrpc-http-connection": "1.0.8", "@walletconnect/jsonrpc-provider": "1.0.14", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/logger": "2.1.2", "@walletconnect/sign-client": "2.19.2", "@walletconnect/types": "2.19.2", "@walletconnect/utils": "2.19.2", "es-toolkit": "1.33.0", "events": "3.3.0" } }, "sha512-LkKg+EjcSUpPUhhvRANgkjPL38wJPIWumAYD8OK/g4OFuJ4W3lS/XTCKthABQfFqmiNbNbVllmywiyE44KdpQg=="], + "@reown/appkit-controllers/viem": ["viem@2.29.2", "", { "dependencies": { "@noble/curves": "1.8.2", "@noble/hashes": "1.7.2", "@scure/bip32": "1.6.2", "@scure/bip39": "1.5.4", "abitype": "1.0.8", "isows": "1.0.6", "ox": "0.6.9", "ws": "8.18.1" }, "peerDependencies": { "typescript": ">=5.0.4" }, "optionalPeers": ["typescript"] }, "sha512-cukRxab90jvQ+TDD84sU3qB3UmejYqgCw4cX8SfWzvh7JPfZXI3kAMUaT5OSR2As1Mgvx1EJawccwPjGqkSSwA=="], + "@reown/appkit-utils/@walletconnect/universal-provider": ["@walletconnect/universal-provider@2.19.2", "", { "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/jsonrpc-http-connection": "1.0.8", "@walletconnect/jsonrpc-provider": "1.0.14", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/logger": "2.1.2", "@walletconnect/sign-client": "2.19.2", "@walletconnect/types": "2.19.2", "@walletconnect/utils": "2.19.2", "es-toolkit": "1.33.0", "events": "3.3.0" } }, "sha512-LkKg+EjcSUpPUhhvRANgkjPL38wJPIWumAYD8OK/g4OFuJ4W3lS/XTCKthABQfFqmiNbNbVllmywiyE44KdpQg=="], + "@reown/appkit-utils/viem": ["viem@2.29.2", "", { "dependencies": { "@noble/curves": "1.8.2", "@noble/hashes": "1.7.2", "@scure/bip32": "1.6.2", "@scure/bip39": "1.5.4", "abitype": "1.0.8", "isows": "1.0.6", "ox": "0.6.9", "ws": "8.18.1" }, "peerDependencies": { "typescript": ">=5.0.4" }, "optionalPeers": ["typescript"] }, "sha512-cukRxab90jvQ+TDD84sU3qB3UmejYqgCw4cX8SfWzvh7JPfZXI3kAMUaT5OSR2As1Mgvx1EJawccwPjGqkSSwA=="], + "@reown/appkit-wallet/zod": ["zod@3.22.4", "", {}, "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg=="], + "@safe-global/safe-apps-sdk/viem": ["viem@2.29.2", "", { "dependencies": { "@noble/curves": "1.8.2", "@noble/hashes": "1.7.2", "@scure/bip32": "1.6.2", "@scure/bip39": "1.5.4", "abitype": "1.0.8", "isows": "1.0.6", "ox": "0.6.9", "ws": "8.18.1" }, "peerDependencies": { "typescript": ">=5.0.4" }, "optionalPeers": ["typescript"] }, "sha512-cukRxab90jvQ+TDD84sU3qB3UmejYqgCw4cX8SfWzvh7JPfZXI3kAMUaT5OSR2As1Mgvx1EJawccwPjGqkSSwA=="], + "@scure/bip32/@noble/curves": ["@noble/curves@1.8.2", "", { "dependencies": { "@noble/hashes": "1.7.2" } }, "sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g=="], "@scure/bip32/@noble/hashes": ["@noble/hashes@1.7.2", "", {}, "sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ=="], "@scure/bip39/@noble/hashes": ["@noble/hashes@1.7.2", "", {}, "sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ=="], + "@types/docker-modem/@types/node": ["@types/node@22.15.17", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw=="], + "@types/ssh2/@types/node": ["@types/node@18.19.100", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-ojmMP8SZBKprc3qGrGk8Ujpo80AXkrP7G2tOT4VWr5jlr5DHjsJF+emXJz+Wm0glmy4Js62oKMdZZ6B9Y+tEcA=="], "@wagmi/cli/picomatch": ["picomatch@3.0.1", "", {}, "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag=="], + "@wagmi/cli/viem": ["viem@2.29.2", "", { "dependencies": { "@noble/curves": "1.8.2", "@noble/hashes": "1.7.2", "@scure/bip32": "1.6.2", "@scure/bip39": "1.5.4", "abitype": "1.0.8", "isows": "1.0.6", "ox": "0.6.9", "ws": "8.18.1" }, "peerDependencies": { "typescript": ">=5.0.4" }, "optionalPeers": ["typescript"] }, "sha512-cukRxab90jvQ+TDD84sU3qB3UmejYqgCw4cX8SfWzvh7JPfZXI3kAMUaT5OSR2As1Mgvx1EJawccwPjGqkSSwA=="], + + "@wagmi/cli/zod": ["zod@3.24.4", "", {}, "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg=="], + "@walletconnect/environment/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], "@walletconnect/events/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], @@ -1275,6 +1295,8 @@ "bl/buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], + "bun-types/@types/node": ["@types/node@22.15.17", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw=="], + "cliui/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], "cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], @@ -1283,6 +1305,8 @@ "cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + "eciesjs/@noble/curves": ["@noble/curves@1.9.0", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-7YDlXiNMdO1YZeH6t/kvopHHbIZzlxrCV9WLqCY6QhcXOoXiNCMDqJIglZ9Yjx5+w7Dz30TITFrlTjnRg7sKEg=="], + "engine.io-client/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], "engine.io-client/ws": ["ws@8.17.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ=="], @@ -1309,8 +1333,12 @@ "obj-multiplex/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + "ox/@noble/curves": ["@noble/curves@1.9.0", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-7YDlXiNMdO1YZeH6t/kvopHHbIZzlxrCV9WLqCY6QhcXOoXiNCMDqJIglZ9Yjx5+w7Dz30TITFrlTjnRg7sKEg=="], + "parse-json/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], + "protobufjs/@types/node": ["@types/node@22.15.17", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw=="], + "qrcode/yargs": ["yargs@15.4.1", "", { "dependencies": { "cliui": "^6.0.0", "decamelize": "^1.2.0", "find-up": "^4.1.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^18.1.2" } }, "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A=="], "read-pkg/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], @@ -1375,24 +1403,60 @@ "@polkadot-api/cli/execa/strip-final-newline": ["strip-final-newline@4.0.0", "", {}, "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw=="], + "@reown/appkit-common/viem/@noble/curves": ["@noble/curves@1.8.2", "", { "dependencies": { "@noble/hashes": "1.7.2" } }, "sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g=="], + + "@reown/appkit-common/viem/@noble/hashes": ["@noble/hashes@1.7.2", "", {}, "sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ=="], + + "@reown/appkit-common/viem/isows": ["isows@1.0.6", "", { "peerDependencies": { "ws": "*" } }, "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw=="], + "@reown/appkit-controllers/@walletconnect/universal-provider/@walletconnect/sign-client": ["@walletconnect/sign-client@2.19.2", "", { "dependencies": { "@walletconnect/core": "2.19.2", "@walletconnect/events": "1.0.1", "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/logger": "2.1.2", "@walletconnect/time": "1.0.2", "@walletconnect/types": "2.19.2", "@walletconnect/utils": "2.19.2", "events": "3.3.0" } }, "sha512-a/K5PRIFPCjfHq5xx3WYKHAAF8Ft2I1LtxloyibqiQOoUtNLfKgFB1r8sdMvXM7/PADNPe4iAw4uSE6PrARrfg=="], "@reown/appkit-controllers/@walletconnect/universal-provider/@walletconnect/types": ["@walletconnect/types@2.19.2", "", { "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/logger": "2.1.2", "events": "3.3.0" } }, "sha512-/LZWhkVCUN+fcTgQUxArxhn2R8DF+LSd/6Wh9FnpjeK/Sdupx1EPS8okWG6WPAqq2f404PRoNAfQytQ82Xdl3g=="], "@reown/appkit-controllers/@walletconnect/universal-provider/@walletconnect/utils": ["@walletconnect/utils@2.19.2", "", { "dependencies": { "@noble/ciphers": "1.2.1", "@noble/curves": "1.8.1", "@noble/hashes": "1.7.1", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/relay-api": "1.0.11", "@walletconnect/relay-auth": "1.1.0", "@walletconnect/safe-json": "1.0.2", "@walletconnect/time": "1.0.2", "@walletconnect/types": "2.19.2", "@walletconnect/window-getters": "1.0.1", "@walletconnect/window-metadata": "1.0.1", "bs58": "6.0.0", "detect-browser": "5.3.0", "query-string": "7.1.3", "uint8arrays": "3.1.0", "viem": "2.23.2" } }, "sha512-VU5CcUF4sZDg8a2/ov29OJzT3KfLuZqJUM0GemW30dlipI5fkpb0VPenZK7TcdLPXc1LN+Q+7eyTqHRoAu/BIA=="], + "@reown/appkit-controllers/viem/@noble/curves": ["@noble/curves@1.8.2", "", { "dependencies": { "@noble/hashes": "1.7.2" } }, "sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g=="], + + "@reown/appkit-controllers/viem/@noble/hashes": ["@noble/hashes@1.7.2", "", {}, "sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ=="], + + "@reown/appkit-controllers/viem/isows": ["isows@1.0.6", "", { "peerDependencies": { "ws": "*" } }, "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw=="], + "@reown/appkit-utils/@walletconnect/universal-provider/@walletconnect/sign-client": ["@walletconnect/sign-client@2.19.2", "", { "dependencies": { "@walletconnect/core": "2.19.2", "@walletconnect/events": "1.0.1", "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/logger": "2.1.2", "@walletconnect/time": "1.0.2", "@walletconnect/types": "2.19.2", "@walletconnect/utils": "2.19.2", "events": "3.3.0" } }, "sha512-a/K5PRIFPCjfHq5xx3WYKHAAF8Ft2I1LtxloyibqiQOoUtNLfKgFB1r8sdMvXM7/PADNPe4iAw4uSE6PrARrfg=="], "@reown/appkit-utils/@walletconnect/universal-provider/@walletconnect/types": ["@walletconnect/types@2.19.2", "", { "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/logger": "2.1.2", "events": "3.3.0" } }, "sha512-/LZWhkVCUN+fcTgQUxArxhn2R8DF+LSd/6Wh9FnpjeK/Sdupx1EPS8okWG6WPAqq2f404PRoNAfQytQ82Xdl3g=="], "@reown/appkit-utils/@walletconnect/universal-provider/@walletconnect/utils": ["@walletconnect/utils@2.19.2", "", { "dependencies": { "@noble/ciphers": "1.2.1", "@noble/curves": "1.8.1", "@noble/hashes": "1.7.1", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/relay-api": "1.0.11", "@walletconnect/relay-auth": "1.1.0", "@walletconnect/safe-json": "1.0.2", "@walletconnect/time": "1.0.2", "@walletconnect/types": "2.19.2", "@walletconnect/window-getters": "1.0.1", "@walletconnect/window-metadata": "1.0.1", "bs58": "6.0.0", "detect-browser": "5.3.0", "query-string": "7.1.3", "uint8arrays": "3.1.0", "viem": "2.23.2" } }, "sha512-VU5CcUF4sZDg8a2/ov29OJzT3KfLuZqJUM0GemW30dlipI5fkpb0VPenZK7TcdLPXc1LN+Q+7eyTqHRoAu/BIA=="], + "@reown/appkit-utils/viem/@noble/curves": ["@noble/curves@1.8.2", "", { "dependencies": { "@noble/hashes": "1.7.2" } }, "sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g=="], + + "@reown/appkit-utils/viem/@noble/hashes": ["@noble/hashes@1.7.2", "", {}, "sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ=="], + + "@reown/appkit-utils/viem/isows": ["isows@1.0.6", "", { "peerDependencies": { "ws": "*" } }, "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw=="], + "@reown/appkit/@walletconnect/universal-provider/@walletconnect/sign-client": ["@walletconnect/sign-client@2.19.2", "", { "dependencies": { "@walletconnect/core": "2.19.2", "@walletconnect/events": "1.0.1", "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/logger": "2.1.2", "@walletconnect/time": "1.0.2", "@walletconnect/types": "2.19.2", "@walletconnect/utils": "2.19.2", "events": "3.3.0" } }, "sha512-a/K5PRIFPCjfHq5xx3WYKHAAF8Ft2I1LtxloyibqiQOoUtNLfKgFB1r8sdMvXM7/PADNPe4iAw4uSE6PrARrfg=="], "@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils": ["@walletconnect/utils@2.19.2", "", { "dependencies": { "@noble/ciphers": "1.2.1", "@noble/curves": "1.8.1", "@noble/hashes": "1.7.1", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/relay-api": "1.0.11", "@walletconnect/relay-auth": "1.1.0", "@walletconnect/safe-json": "1.0.2", "@walletconnect/time": "1.0.2", "@walletconnect/types": "2.19.2", "@walletconnect/window-getters": "1.0.1", "@walletconnect/window-metadata": "1.0.1", "bs58": "6.0.0", "detect-browser": "5.3.0", "query-string": "7.1.3", "uint8arrays": "3.1.0", "viem": "2.23.2" } }, "sha512-VU5CcUF4sZDg8a2/ov29OJzT3KfLuZqJUM0GemW30dlipI5fkpb0VPenZK7TcdLPXc1LN+Q+7eyTqHRoAu/BIA=="], + "@reown/appkit/viem/@noble/curves": ["@noble/curves@1.8.2", "", { "dependencies": { "@noble/hashes": "1.7.2" } }, "sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g=="], + + "@reown/appkit/viem/@noble/hashes": ["@noble/hashes@1.7.2", "", {}, "sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ=="], + + "@reown/appkit/viem/isows": ["isows@1.0.6", "", { "peerDependencies": { "ws": "*" } }, "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw=="], + + "@safe-global/safe-apps-sdk/viem/@noble/curves": ["@noble/curves@1.8.2", "", { "dependencies": { "@noble/hashes": "1.7.2" } }, "sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g=="], + + "@safe-global/safe-apps-sdk/viem/@noble/hashes": ["@noble/hashes@1.7.2", "", {}, "sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ=="], + + "@safe-global/safe-apps-sdk/viem/isows": ["isows@1.0.6", "", { "peerDependencies": { "ws": "*" } }, "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw=="], + "@types/ssh2/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], + "@wagmi/cli/viem/@noble/curves": ["@noble/curves@1.8.2", "", { "dependencies": { "@noble/hashes": "1.7.2" } }, "sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g=="], + + "@wagmi/cli/viem/@noble/hashes": ["@noble/hashes@1.7.2", "", {}, "sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ=="], + + "@wagmi/cli/viem/isows": ["isows@1.0.6", "", { "peerDependencies": { "ws": "*" } }, "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw=="], + "@walletconnect/logger/pino/on-exit-leak-free": ["on-exit-leak-free@0.2.0", "", {}, "sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg=="], "@walletconnect/logger/pino/pino-abstract-transport": ["pino-abstract-transport@0.5.0", "", { "dependencies": { "duplexify": "^4.1.2", "split2": "^4.0.0" } }, "sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ=="], @@ -1407,6 +1471,8 @@ "@walletconnect/logger/pino/thread-stream": ["thread-stream@0.15.2", "", { "dependencies": { "real-require": "^0.1.0" } }, "sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA=="], + "@walletconnect/utils/viem/isows": ["isows@1.0.6", "", { "peerDependencies": { "ws": "*" } }, "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw=="], + "@walletconnect/utils/viem/ox": ["ox@0.6.7", "", { "dependencies": { "@adraffy/ens-normalize": "^1.10.1", "@noble/curves": "^1.6.0", "@noble/hashes": "^1.5.0", "@scure/bip32": "^1.5.0", "@scure/bip39": "^1.4.0", "abitype": "^1.0.6", "eventemitter3": "5.0.1" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA=="], "@walletconnect/utils/viem/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], @@ -1499,14 +1565,20 @@ "yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "@reown/appkit-controllers/@walletconnect/universal-provider/@walletconnect/utils/viem/isows": ["isows@1.0.6", "", { "peerDependencies": { "ws": "*" } }, "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw=="], + "@reown/appkit-controllers/@walletconnect/universal-provider/@walletconnect/utils/viem/ox": ["ox@0.6.7", "", { "dependencies": { "@adraffy/ens-normalize": "^1.10.1", "@noble/curves": "^1.6.0", "@noble/hashes": "^1.5.0", "@scure/bip32": "^1.5.0", "@scure/bip39": "^1.4.0", "abitype": "^1.0.6", "eventemitter3": "5.0.1" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA=="], "@reown/appkit-controllers/@walletconnect/universal-provider/@walletconnect/utils/viem/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], + "@reown/appkit-utils/@walletconnect/universal-provider/@walletconnect/utils/viem/isows": ["isows@1.0.6", "", { "peerDependencies": { "ws": "*" } }, "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw=="], + "@reown/appkit-utils/@walletconnect/universal-provider/@walletconnect/utils/viem/ox": ["ox@0.6.7", "", { "dependencies": { "@adraffy/ens-normalize": "^1.10.1", "@noble/curves": "^1.6.0", "@noble/hashes": "^1.5.0", "@scure/bip32": "^1.5.0", "@scure/bip39": "^1.4.0", "abitype": "^1.0.6", "eventemitter3": "5.0.1" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA=="], "@reown/appkit-utils/@walletconnect/universal-provider/@walletconnect/utils/viem/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], + "@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils/viem/isows": ["isows@1.0.6", "", { "peerDependencies": { "ws": "*" } }, "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw=="], + "@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils/viem/ox": ["ox@0.6.7", "", { "dependencies": { "@adraffy/ens-normalize": "^1.10.1", "@noble/curves": "^1.6.0", "@noble/hashes": "^1.5.0", "@scure/bip32": "^1.5.0", "@scure/bip39": "^1.4.0", "abitype": "^1.0.6", "eventemitter3": "5.0.1" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA=="], "@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils/viem/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], diff --git a/test/cli/handlers/consts.ts b/test/cli/handlers/consts.ts new file mode 100644 index 00000000..a51c81b2 --- /dev/null +++ b/test/cli/handlers/consts.ts @@ -0,0 +1,13 @@ +export const DOCKER_NETWORK_NAME = "datahaven-net"; +export const COMPONENTS = { + datahaven: { + imageName: "moonsonglabs/datahaven", + componentName: "Datahaven Network", + optionName: "datahaven" + }, + snowbridge: { + imageName: "snowbridge-relayer", + componentName: "Snowbridge Relayers", + optionName: "relayer" + } +} as const; diff --git a/test/cli/handlers/exec/index.ts b/test/cli/handlers/exec/index.ts new file mode 100644 index 00000000..70b786d1 --- /dev/null +++ b/test/cli/handlers/exec/index.ts @@ -0,0 +1 @@ +// TODO diff --git a/test/cli/handlers/index.ts b/test/cli/handlers/index.ts index a896773a..988f2b98 100644 --- a/test/cli/handlers/index.ts +++ b/test/cli/handlers/index.ts @@ -1 +1,4 @@ +export * from "./consts"; +export * from "./exec"; export * from "./launch"; +export * from "./stop"; diff --git a/test/cli/handlers/launch/datahaven.ts b/test/cli/handlers/launch/datahaven.ts index 07449a60..d35f805b 100644 --- a/test/cli/handlers/launch/datahaven.ts +++ b/test/cli/handlers/launch/datahaven.ts @@ -18,11 +18,10 @@ import { } from "utils"; import { type Hex, keccak256, toHex } from "viem"; import { publicKeyToAddress } from "viem/accounts"; +import { DOCKER_NETWORK_NAME } from "../consts"; import type { LaunchOptions } from "."; import type { LaunchedNetwork } from "./launchedNetwork"; -const DOCKER_NETWORK_NAME = "datahaven-net"; - const LOG_LEVEL = Bun.env.LOG_LEVEL || "info"; const COMMON_LAUNCH_ARGS = [ diff --git a/test/cli/handlers/launch/index.ts b/test/cli/handlers/launch/index.ts index 2f723ded..81ede102 100644 --- a/test/cli/handlers/launch/index.ts +++ b/test/cli/handlers/launch/index.ts @@ -9,6 +9,7 @@ import { launchRelayers } from "./relayer"; import { performSummaryOperations } from "./summary"; import { performValidatorOperations } from "./validator"; +// Non-optional properties determined by having default values export interface LaunchOptions { verified?: boolean; launchKurtosis?: boolean; @@ -16,15 +17,17 @@ export interface LaunchOptions { fundValidators?: boolean; setupValidators?: boolean; updateValidatorSet?: boolean; + kurtosisEnclaveName: string; blockscout?: boolean; relayer?: boolean; - relayerImageTag?: string; + relayerImageTag: string; cleanNetwork?: boolean; datahaven?: boolean; buildDatahaven?: boolean; - datahavenImageTag?: string; - datahavenBuildExtraArgs?: string; + datahavenImageTag: string; + datahavenBuildExtraArgs: string; kurtosisNetworkArgs?: string; + // Kept as optional due to parse fn slotTime?: number; } @@ -54,7 +57,11 @@ const launchFunction = async (options: LaunchOptions, launchedNetwork: LaunchedN let blockscoutBackendUrl: string | undefined; if (options.blockscout === true) { - const blockscoutPublicPort = await getPortFromKurtosis("blockscout", "http"); + const blockscoutPublicPort = await getPortFromKurtosis( + "blockscout", + "http", + options.kurtosisEnclaveName + ); blockscoutBackendUrl = `http://127.0.0.1:${blockscoutPublicPort}`; logger.trace("Blockscout backend URL:", blockscoutBackendUrl); } else if (options.verified) { diff --git a/test/cli/handlers/launch/kurtosis.ts b/test/cli/handlers/launch/kurtosis.ts index 3f89ee1b..1d050c23 100644 --- a/test/cli/handlers/launch/kurtosis.ts +++ b/test/cli/handlers/launch/kurtosis.ts @@ -13,7 +13,7 @@ import type { LaunchedNetwork } from "./launchedNetwork"; */ export const launchKurtosis = async ( launchedNetwork: LaunchedNetwork, - options: LaunchOptions = {} + options: LaunchOptions ): Promise => { printHeader("Starting Kurtosis EthereumNetwork"); @@ -30,12 +30,12 @@ export const launchKurtosis = async ( if (!shouldLaunchKurtosis) { logger.info("๐Ÿ‘ Skipping Kurtosis Ethereum network launch. Done!"); - await registerServices(launchedNetwork); + await registerServices(launchedNetwork, options.kurtosisEnclaveName); printDivider(); return; } - if (await checkKurtosisRunning()) { + if (await checkKurtosisRunning(options.kurtosisEnclaveName)) { logger.info("โ„น๏ธ Kurtosis Ethereum network is already running."); // If the user wants to launch the Kurtosis network, we ask them if they want @@ -55,14 +55,14 @@ export const launchKurtosis = async ( if (!shouldRelaunch) { logger.info("๐Ÿ‘ Keeping existing Kurtosis enclave."); - await registerServices(launchedNetwork); + await registerServices(launchedNetwork, options.kurtosisEnclaveName); printDivider(); return; } // Case: User wants to clean and relaunch the enclave logger.info("๐Ÿงน Cleaning up Docker and Kurtosis environments..."); - logger.debug(await $`kurtosis enclave stop datahaven-ethereum`.nothrow().text()); + logger.debug(await $`kurtosis enclave stop ${options.kurtosisEnclaveName}`.nothrow().text()); logger.debug(await $`kurtosis clean`.text()); logger.debug(await $`kurtosis engine stop`.nothrow().text()); logger.debug(await $`docker system prune -f`.nothrow().text()); @@ -83,7 +83,7 @@ export const launchKurtosis = async ( logger.info(`โš™๏ธ Using Kurtosis config file: ${configFile}`); const { stderr, stdout, exitCode } = - await $`kurtosis run github.com/ethpandaops/ethereum-package --args-file ${configFile} --enclave datahaven-ethereum` + await $`kurtosis run github.com/ethpandaops/ethereum-package --args-file ${configFile} --enclave ${options.kurtosisEnclaveName}` .nothrow() .quiet(); @@ -93,18 +93,19 @@ export const launchKurtosis = async ( } logger.debug(stdout.toString()); - await registerServices(launchedNetwork); + await registerServices(launchedNetwork, options.kurtosisEnclaveName); logger.success("Kurtosis network operations completed successfully."); printDivider(); }; /** - * Checks if a Kurtosis enclave named "datahaven-ethereum" is currently running. + * Checks if a Kurtosis enclave with the specified name is currently running. * + * @param enclaveName - The name of the Kurtosis enclave to check * @returns True if the enclave is running, false otherwise */ -const checkKurtosisRunning = async (): Promise => { - const text = await $`kurtosis enclave ls | grep "datahaven-ethereum" | grep RUNNING`.text(); +const checkKurtosisRunning = async (enclaveName: string): Promise => { + const text = await $`kurtosis enclave ls | grep "${enclaveName}" | grep RUNNING`.text(); return text.length > 0; }; @@ -152,19 +153,23 @@ const modifyConfig = async (options: LaunchOptions, configFile: string) => { * * @param launchedNetwork - The LaunchedNetwork instance to store network details. */ -const registerServices = async (launchedNetwork: LaunchedNetwork) => { +const registerServices = async (launchedNetwork: LaunchedNetwork, enclaveName: string) => { logger.info("๐Ÿ“ Registering Kurtosis service endpoints..."); // Configure EL RPC URL try { - const rethPublicPort = await getPortFromKurtosis("el-1-reth-lighthouse", "rpc"); + const rethPublicPort = await getPortFromKurtosis("el-1-reth-lighthouse", "rpc", enclaveName); invariant(rethPublicPort && rethPublicPort > 0, "โŒ Could not find EL RPC port"); const elRpcUrl = `http://127.0.0.1:${rethPublicPort}`; launchedNetwork.elRpcUrl = elRpcUrl; logger.info(`๐Ÿ“ Execution Layer RPC URL configured: ${elRpcUrl}`); // Configure CL Endpoint - const lighthousePublicPort = await getPortFromKurtosis("cl-1-lighthouse-reth", "http"); + const lighthousePublicPort = await getPortFromKurtosis( + "cl-1-lighthouse-reth", + "http", + enclaveName + ); const clEndpoint = `http://127.0.0.1:${lighthousePublicPort}`; invariant( clEndpoint, diff --git a/test/cli/handlers/launch/relayer.ts b/test/cli/handlers/launch/relayer.ts index 669e7e93..1f5cd9d0 100644 --- a/test/cli/handlers/launch/relayer.ts +++ b/test/cli/handlers/launch/relayer.ts @@ -149,8 +149,16 @@ export const launchRelayers = async (options: LaunchOptions, launchedNetwork: La } const json = await file.json(); - const ethWsPort = await getPortFromKurtosis("el-1-reth-lighthouse", "ws"); - const ethHttpPort = await getPortFromKurtosis("cl-1-lighthouse-reth", "http"); + const ethWsPort = await getPortFromKurtosis( + "el-1-reth-lighthouse", + "ws", + options.kurtosisEnclaveName + ); + const ethHttpPort = await getPortFromKurtosis( + "cl-1-lighthouse-reth", + "http", + options.kurtosisEnclaveName + ); logger.debug( `Fetched ports: ETH WS=${ethWsPort}, ETH HTTP=${ethHttpPort}, Substrate WS=${substrateWsPort} (from DataHaven node)` ); diff --git a/test/cli/handlers/launch/summary.ts b/test/cli/handlers/launch/summary.ts index 04a43bcb..c225d6d4 100644 --- a/test/cli/handlers/launch/summary.ts +++ b/test/cli/handlers/launch/summary.ts @@ -27,7 +27,7 @@ export const performSummaryOperations = async ( const serviceInfo = service.startsWith("datahaven-") ? undefined - : await getServiceFromKurtosis(service); + : await getServiceFromKurtosis(service, options.kurtosisEnclaveName); logger.trace("Service info", serviceInfo); switch (true) { case service.startsWith("cl-"): { diff --git a/test/cli/handlers/launch/validator.ts b/test/cli/handlers/launch/validator.ts index df031cdd..872e6a4c 100644 --- a/test/cli/handlers/launch/validator.ts +++ b/test/cli/handlers/launch/validator.ts @@ -34,7 +34,7 @@ export const performValidatorOperations = async ( rpcUrl: networkRpcUrl }); } else { - logger.debug("Skipping validator funding"); + logger.info("๐Ÿ‘ Skipping validator funding"); printDivider(); } @@ -88,11 +88,11 @@ export const performValidatorOperations = async ( rpcUrl: networkRpcUrl }); } else { - logger.debug("Skipping validator set update"); + logger.info("๐Ÿ‘ Skipping validator set update"); printDivider(); } } else { - logger.debug("Skipping validator setup"); + logger.info("๐Ÿ‘ Skipping validator setup"); printDivider(); } }; diff --git a/test/cli/handlers/stop/index.ts b/test/cli/handlers/stop/index.ts new file mode 100644 index 00000000..7e379e3b --- /dev/null +++ b/test/cli/handlers/stop/index.ts @@ -0,0 +1,228 @@ +import type { Command } from "@commander-js/extra-typings"; +import { $ } from "bun"; +import invariant from "tiny-invariant"; +import { + confirmWithTimeout, + getContainersMatchingImage, + killExistingContainers, + logger, + printHeader, + runShellCommandWithLogger +} from "utils"; +import { z } from "zod"; +import { COMPONENTS, DOCKER_NETWORK_NAME } from "../consts"; +import { checkDependencies } from "../launch/checks"; + +export interface StopOptions { + all?: boolean; + datahaven?: boolean; + enclave?: boolean; + kurtosisEngine: boolean; + relayer?: boolean; +} + +export const stopPreActionHook = (thisCmd: Command<[], StopOptions & { [key: string]: any }>) => { + const { all, datahaven, enclave, relayer } = thisCmd.opts(); + + if (all && (datahaven === false || enclave === false || relayer === false)) { + thisCmd.error("--all cannot be used with --no-datahaven, --no-enclave or --no-relayer"); + } +}; + +export const stop = async (options: StopOptions) => { + logger.info("๐Ÿ›‘ Stopping network components..."); + logger.debug(`Stop options: ${JSON.stringify(options)}`); + + await checkDependencies(); + + printHeader("Snowbridge Relayers"); + await stopDockerComponents("snowbridge", options); + printHeader("Datahaven Network"); + await stopDockerComponents("datahaven", options); + await removeDockerNetwork(DOCKER_NETWORK_NAME, options); + printHeader("Ethereum Network"); + await stopAllEnclaves(options); + printHeader("Kurtosis Engine"); + await stopKurtosisEngine(options); +}; + +export const stopDockerComponents = async (type: keyof typeof COMPONENTS, options: StopOptions) => { + const name = COMPONENTS[type].componentName; + const imageName = COMPONENTS[type].imageName; + logger.debug(`Checking currently running ${name} ...`); + const relayers = await getContainersMatchingImage(imageName); + logger.info(`๐Ÿ”Ž Found ${relayers.length} containers(s) running`); + if (relayers.length === 0) { + logger.info(`๐Ÿคทโ€ No ${name} containers found running`); + return; + } + let shouldStopComponent = options.all || options[COMPONENTS[type].optionName]; + if (shouldStopComponent === undefined) { + shouldStopComponent = await confirmWithTimeout( + `Do you want to stop the ${imageName} relayers?`, + true, + 10 + ); + } else { + logger.info( + `๐Ÿณ๏ธ Using flag option: ${shouldStopComponent ? "will stop" : "will not stop"} ${name}` + ); + } + + if (!shouldStopComponent) { + logger.info(`๐Ÿ‘ Skipping stopping ${name} due to flag option`); + return; + } + + await killExistingContainers(imageName); + const remaining = await getContainersMatchingImage(imageName); + invariant( + remaining.length === 0, + `โŒ ${remaining.length} containers are still running and have not been stopped.` + ); + logger.info(`๐Ÿช“ ${relayers.length} ${name} containers stopped successfully`); +}; + +const removeDockerNetwork = async (networkName: string, options: StopOptions) => { + logger.debug(`Checking if Docker network ${networkName} exists...`); + const networkOutput = + await $`docker network ls --filter "name=^${DOCKER_NETWORK_NAME}$" --format "{{.Name}}"`.text(); + + // Check if networkOutput has any network names (not just whitespace or empty lines) + const networksExist = + networkOutput + .trim() + .split("\n") + .filter((line) => line.trim().length > 0).length > 0; + if (!networksExist) { + logger.info(`๐Ÿคทโ€ Docker network ${networkName} does not exist, skipping`); + return; + } + + let shouldRemoveNetwork = options.all || options.datahaven; + if (shouldRemoveNetwork === undefined) { + shouldRemoveNetwork = await confirmWithTimeout( + `Do you want to remove the Docker network ${networkName}?`, + true, + 10 + ); + } + + if (!shouldRemoveNetwork) { + logger.info(`๐Ÿ‘ Skipping removing Docker network ${networkName} due to flag option`); + return; + } + + logger.info(`โ›“๏ธโ€๐Ÿ’ฅ Removing Docker network: ${networkName}`); + const { exitCode, stderr } = await $`docker network rm -f ${networkName}`.nothrow().quiet(); + if (exitCode !== 0) { + logger.warn(`โš ๏ธ Failed to remove Docker network: ${stderr}`); + } else { + logger.info(`๐Ÿช“ Docker network ${networkName} removed successfully`); + } +}; + +const stopAllEnclaves = async (options: StopOptions) => { + logger.info("๐Ÿ”Ž Checking for running Kurtosis enclaves..."); + + let shouldStopEnclave = options.all || options.enclave; + if (shouldStopEnclave === undefined) { + shouldStopEnclave = await confirmWithTimeout( + "Do you want to stop the all the Kurtosis enclaves?", + true, + 10 + ); + } else { + logger.debug( + `๐Ÿณ๏ธ Using flag option: ${shouldStopEnclave ? "will stop" : "will not stop"} all Kurtosis enclaves` + ); + } + + if (!shouldStopEnclave) { + logger.info("๐Ÿ‘ Skipping stopping Kurtosis enclaves due to flag option"); + return; + } + + const lines = (await Array.fromAsync($`kurtosis enclave ls`.lines())).filter( + (line) => line.length > 0 + ); + logger.trace(lines); + + lines.shift(); + const enclaveCount = lines.length; + const KurtosisEnclaveInfoSchema = z.object({ + uuid: z.string().min(1), + name: z.string().min(1), + status: z.string().min(1), + creationTime: z.string().min(1) + }); + + type KurtosisEnclaveInfo = z.infer; + const enclaves: KurtosisEnclaveInfo[] = []; + + if (enclaveCount > 0) { + logger.info(`๐Ÿ”Ž Found ${enclaveCount} Kurtosis enclave(s) running.`); + // Updated regex to match the actual format: "uuid name status creationTime" + const enclaveRegex = /^(\S+)\s+(\S+)\s+(\S+)\s+(.+)$/; + + for (const line of lines) { + const match = line.match(enclaveRegex); + if (match) { + const [, uuid, name, status, creationTime] = match; + const parseResult = KurtosisEnclaveInfoSchema.safeParse({ + uuid: uuid.trim(), + name: name.trim(), + status: status.trim(), + creationTime: creationTime.trim() + }); + + if (parseResult.success) { + enclaves.push(parseResult.data); + } else { + logger.warn( + `โš ๏ธ Could not parse enclave line: "${line}". Error: ${parseResult.error.message}` + ); + } + } else { + logger.warn(`โš ๏ธ Could not parse enclave line (regex mismatch): "${line}"`); + } + } + + if (enclaves.length > 0) { + logger.debug("Parsed enclave details:"); + + for (const { creationTime, name, status, uuid } of enclaves) { + logger.debug(`UUID: ${uuid}, Name: ${name}, Status: ${status}, Created: ${creationTime}`); + logger.info(`๐Ÿ—‘๏ธ Removing enclave ${name}`); + logger.debug(await $`kurtosis enclave rm ${uuid} -f`.text()); + } + } else if (lines.length > 0 && enclaves.length === 0) { + logger.warn("Found enclave lines in output, but failed to parse any of them."); + } + } else { + logger.info("๐Ÿคทโ€ No Kurtosis enclaves found running."); + return; + } + logger.info(`๐Ÿช“ ${lines.length} enclaves cleaned`); +}; + +export const stopKurtosisEngine = async (options: StopOptions) => { + logger.debug("Checking currently running kurtosis engine ..."); + const matches = await getContainersMatchingImage("kurtosistech/engine"); + + logger.debug(`${matches.length} kurtosis engine(s) running`); + logger.trace(JSON.stringify(matches)); + if (matches.length === 0) { + logger.info("๐Ÿคทโ€ No Kurtosis engine found running, skipping"); + return; + } + + if (!options.kurtosisEngine) { + logger.info("๐Ÿ‘ Skipping stopping Kurtosis engine due to flag option"); + return; + } + await runShellCommandWithLogger("kurtosis engine stop", { + logLevel: "debug" + }); + logger.info("๐Ÿช“ Kurtosis engine stopped successfully"); +}; diff --git a/test/cli/index.ts b/test/cli/index.ts index 1bce277b..f2503500 100644 --- a/test/cli/index.ts +++ b/test/cli/index.ts @@ -1,6 +1,6 @@ #!/usr/bin/env bun import { Command, InvalidArgumentError } from "@commander-js/extra-typings"; -import { launch, launchPreActionHook } from "./handlers"; +import { launch, launchPreActionHook, stop, stopPreActionHook } from "./handlers"; // Function to parse integer function parseIntValue(value: string): number { @@ -11,9 +11,26 @@ function parseIntValue(value: string): number { return parsedValue; } -// So far we only have the launch command -// we can expand this to more commands in the future +// ===== Program ===== const program = new Command() + .version("0.2.0") + .name("bun cli") + .summary("๐ŸซŽ DataHaven CLI: Network Toolbox") + .usage("[options]"); + +// ===== Launch ====== +program + .command("launch") + .addHelpText( + "before", + `๐ŸซŽ DataHaven: Network Launcher CLI for launching a full DataHaven network. + Complete with: + - Solo-chain validators, + - Storage providers, + - Snowbridge Relayers + - Ethereum Private network` + ) + .description("Launch a full E2E DataHaven & Ethereum network and more") .option("--d, --datahaven", "(Re)Launch DataHaven network") .option("--nd, --no-datahaven", "Skip launching DataHaven network") .option("--bd, --build-datahaven", "Build DataHaven node local Docker image") @@ -38,32 +55,45 @@ const program = new Command() "Extra args for DataHaven node Cargo build (the plain command is `cargo build --release` for linux, `cargo zigbuild --target x86_64-unknown-linux-gnu --release` for mac)", "--features=fast-runtime" ) + .option( + "--e --kurtosis-enclave-name ", + "Name of the Kurtosis Enclave", + "datahaven-ethereum" + ) .option("--kurtosis-network-args ", "CustomKurtosis network args") .option("--verified", "Verify smart contracts with Blockscout") .option( - "-i, --datahaven-image-tag ", + "--dit, --datahaven-image-tag ", "Tag of the datahaven image to use", "moonsonglabs/datahaven:local" ) .option( - "-p, --relayer-image-tag ", + "--rit, --relayer-image-tag ", "Tag of the relayer", "moonsonglabs/snowbridge-relayer:latest" ) .hook("preAction", launchPreActionHook) .action(launch); -// ===== Program ===== +// ===== Stop ====== program - .version("0.2.0") - .name("bun cli") - .summary("๐ŸซŽ DataHaven: Network Launcher CLI") - .usage("[options]") - .description(`๐ŸซŽ DataHaven: Network Launcher CLI for launching a full DataHaven network. - Complete with: - - Solo-chain validators, - - Storage providers, - - Snowbridge Relayers - - Ethereum Private network`); + .command("stop") + .description("Stop any launched running network components") + .option("--A --all", "Stop all components associated with project") + .option("--d, --datahaven", "Stop DataHaven network") + .option("--nd, --no-datahaven", "Skip stopping DataHaven network") + .option("--e, --enclave", "Stop Ethereum Kurtosis enclave") + .option("--ne, --no-enclave", "Skip stopping Ethereum Kurtosis enclave") + .option("--kurtosis-engine", "Stop Kurtosis engine", false) + .option("--r, --relayer", "Stop Snowbridge Relayers") + .option("--nr, --no-relayer", "Skip stopping Snowbridge Relayers") + .hook("preAction", stopPreActionHook) + .action(stop); + +// ===== Exec ====== +// Disabled until need arises +// program +// .command("exec [args]") +// .description("Execute a standalone function against an running running network"); program.parseAsync(Bun.argv); diff --git a/test/package.json b/test/package.json index 3e31c7d1..5416dc32 100644 --- a/test/package.json +++ b/test/package.json @@ -13,18 +13,18 @@ "generate:wagmi": "wagmi generate", "generate:snowbridge-cfgs": "bun -e \"import {generateSnowbridgeConfigs} from './scripts/gen-snowbridge-cfgs.ts'; await generateSnowbridgeConfigs()\"", "generate:types": "(cd ../operator && cargo build --release) && bun x papi add --wasm \"../operator/target/release/wbuild/datahaven-stagenet-runtime/datahaven_stagenet_runtime.wasm\" datahaven", - "start:e2e:verified": "bun cli --verified --blockscout --deploy-contracts --setup-validators --update-validator-set --fund-validators", - "start:e2e:verified:relayers": "bun cli --verified --blockscout --deploy-contracts --setup-validators --update-validator-set --fund-validators --slot-time 1 --relayer --datahaven", + "start:e2e:verified": "bun cli launch --verified --blockscout --deploy-contracts --setup-validators --update-validator-set --fund-validators", + "start:e2e:verified:relayers": "bun cli launch --verified --blockscout --deploy-contracts --setup-validators --update-validator-set --fund-validators --slot-time 1 --relayer --datahaven", "start:e2e:local": "LOG_LEVEL=debug bun start:e2e:ci --bd", - "start:e2e:ci": "bun cli --datahaven --no-build-datahaven --launch-kurtosis --deploy-contracts --fund-validators --setup-validators --update-validator-set --relayer --clean-network", - "start:e2e:minrelayer": "bun cli --relayer --deploy-contracts --no-setup-validators --no-update-validator-set --no-fund-validators --datahaven", + "start:e2e:ci": "bun cli launch --datahaven --no-build-datahaven --launch-kurtosis --deploy-contracts --fund-validators --setup-validators --update-validator-set --relayer --clean-network", + "start:e2e:minrelayer": "bun cli launch --relayer --deploy-contracts --no-setup-validators --no-update-validator-set --no-fund-validators --datahaven", "stop:docker:datahaven": "docker rm -f $(docker ps -aq --filter name='^datahaven-') 2>/dev/null || true; docker network rm datahaven-net || true", "stop:docker:relayer": "docker rm -f $(docker ps -aq --filter name='^snowbridge-relayer-') 2>/dev/null || true", - "stop:e2e": "bun stop:docker:datahaven ; bun stop:docker:relayer ; (kurtosis enclave stop datahaven-ethereum || true) && kurtosis clean && kurtosis engine stop && docker container prune -f", - "start:e2e:minimal:relayer": "bun cli --relayer --deploy-contracts --no-setup-validators --no-update-validator-set --no-fund-validators --datahaven", - "stop:e2e:verified": "bun stop:e2e", - "stop:e2e:quick": "kurtosis enclave stop datahaven-ethereum", - "stop:kurtosis-engine": "kurtosis engine stop && docker container prune -f", + "stop:e2e": "bun cli stop --all", + "stop:dh": "bun cli stop --datahaven --no-enclave --no-relayer ", + "stop:sb": "bun cli stop --relayer --no-datahaven --no-enclave", + "stop:eth": "bun cli stop --enclave --no-datahaven --no-relayer", + "stop:engine": "bun cli stop --kurtosisEngine --no-datahaven --no-relayer --no-enclave", "test:e2e": "bun test suites/e2e --timeout 60000", "typecheck": "tsc --noEmit", "postinstall": "papi" @@ -38,29 +38,29 @@ "dependencies": { "@biomejs/biome": "^2.0.0-beta.5", "@commander-js/extra-typings": "^13.1.0", - "@dotenvx/dotenvx": "^1.41.0", - "@inquirer/prompts": "^7.5.0", - "@noble/curves": "^1.9.0", + "@dotenvx/dotenvx": "^1.44.1", + "@inquirer/prompts": "^7.5.1", + "@noble/curves": "^1.9.1", "@noble/hashes": "^1.8.0", "@polkadot-api/descriptors": "file:.papi/descriptors", - "@types/dockerode": "^3.3.38", - "@types/node": "^22.14.1", - "@wagmi/cli": "^2.3.0", - "@wagmi/core": "^2.17.0", + "@types/dockerode": "^3.3.39", + "@types/node": "^22.15.21", + "@wagmi/cli": "^2.3.1", + "@wagmi/core": "^2.17.2", "chalk": "^5.4.1", "commander": "^13.1.0", "dockerode": "^4.0.6", "dotenv": "^16.5.0", - "octokit": "^4.1.3", + "octokit": "^4.1.4", "ora": "^8.2.0", - "pino": "^9.6.0", + "pino": "^9.7.0", "pino-pretty": "^13.0.0", - "polkadot-api": "^1.10.2", + "polkadot-api": "^1.12.0", "tiny-invariant": "^1.3.3", - "viem": "^2.28.0", - "wagmi": "^2.15.0", - "yaml": "^2.7.1", - "zod": "^3.24.3" + "viem": "^2.30.0", + "wagmi": "^2.15.4", + "yaml": "^2.8.0", + "zod": "^3.25.17" }, "trustedDependencies": [ "@biomejs/biome", diff --git a/test/scripts/cargo-crossbuild.ts b/test/scripts/cargo-crossbuild.ts index 7abf8055..d372fd21 100644 --- a/test/scripts/cargo-crossbuild.ts +++ b/test/scripts/cargo-crossbuild.ts @@ -5,10 +5,8 @@ import { $ } from "bun"; import { logger } from "utils"; const LOG_LEVEL = Bun.env.LOG_LEVEL || "info"; - const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); -const RUNTIME_FEATURES = ["fast-runtime"]; export const cargoCrossbuild = async (options: { datahavenBuildExtraArgs?: string }) => { logger.info("๐Ÿ”€ Cross-building DataHaven node for Linux AMD64"); @@ -39,7 +37,7 @@ export const cargoCrossbuild = async (options: { datahavenBuildExtraArgs?: strin // Get additional arguments from command line const additionalArgs = options.datahavenBuildExtraArgs ?? ""; - const command = `cargo zigbuild --target ${target} --release ${additionalArgs} --features ${RUNTIME_FEATURES.join(",")}`; + const command = `cargo zigbuild --target ${target} --release ${additionalArgs}`; logger.debug(`Running build command: ${command}`); if (LOG_LEVEL === "debug") { @@ -54,7 +52,7 @@ export const cargoCrossbuild = async (options: { datahavenBuildExtraArgs?: strin const target = "x86_64-unknown-linux-gnu"; await addRustupTarget(target); - const command = `cargo build --target ${target} --release --features ${RUNTIME_FEATURES.join(",")}`; + const command = `cargo build --target ${target} --release`; logger.debug(`Running build command: ${command}`); if (LOG_LEVEL === "debug") { @@ -88,7 +86,7 @@ const installCargoZigbuild = async (): Promise => { const addRustupTarget = async (target: string): Promise => { if (!(await $`rustup target list --installed`.text()).includes(target)) { - await $`rustup target add ${target}`.text(); + logger.debug(await $`rustup target add ${target}`.text()); } }; diff --git a/test/tsconfig.json b/test/tsconfig.json index e8c43dc0..766d3717 100644 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -26,7 +26,7 @@ "preserveConstEnums": true, "esModuleInterop": true, "resolveJsonModule": true, - + // Speed "tsBuildInfoFile": "tmp/tsconfig.tsbuildinfo", "assumeChangesOnlyAffectDirectDependencies": true @@ -39,5 +39,5 @@ "wagmi.config.ts", "contract-bindings/*.ts" ], - "exclude": ["node_modules/"] + "exclude": ["node_modules"] } diff --git a/test/utils/docker.ts b/test/utils/docker.ts index 0d1287a1..83a52002 100644 --- a/test/utils/docker.ts +++ b/test/utils/docker.ts @@ -65,6 +65,12 @@ export const getServicesFromDocker = async (): Promise => { return services; }; +export const getContainersMatchingImage = async (imageName: string) => { + const containers = await docker.listContainers(); + const matches = containers.filter((container) => container.Image.includes(imageName)); + return matches; +}; + export const getPublicPort = async ( containerName: string, internalPort: number diff --git a/test/utils/kurtosis.ts b/test/utils/kurtosis.ts index 5fd78368..b85dc7c2 100644 --- a/test/utils/kurtosis.ts +++ b/test/utils/kurtosis.ts @@ -78,10 +78,13 @@ const serviceSchema = z.object({ export type KurtosisService = z.infer; -export const getServiceFromKurtosis = async (service: string): Promise => { +export const getServiceFromKurtosis = async ( + service: string, + enclave: string +): Promise => { logger.debug("Getting service from kurtosis", service); - const command = `kurtosis service inspect datahaven-ethereum ${service} -o json`; + const command = `kurtosis service inspect ${enclave} ${service} -o json`; logger.debug(`Running command: ${command}`); const { stdout, stderr, exitCode } = await $`sh -c ${command}`.nothrow().quiet(); @@ -95,10 +98,14 @@ export const getServiceFromKurtosis = async (service: string): Promise => { +export const getPortFromKurtosis = async ( + service: string, + portName: string, + enclave: string +): Promise => { logger.debug("Getting port for service", service, portName); - const command = `kurtosis service inspect datahaven-ethereum ${service} -o json`; + const command = `kurtosis service inspect ${enclave} ${service} -o json`; logger.debug(`Running command: ${command}`); const { stdout, stderr, exitCode } = await $`sh -c ${command}`.nothrow().quiet(); @@ -114,9 +121,11 @@ export const getPortFromKurtosis = async (service: string, portName: string): Pr return parsed.public_ports[portName].number; }; -export const getServicesFromKurtosis = async (): Promise> => { +export const getServicesFromKurtosis = async ( + enclaveName: string +): Promise> => { const promises = standardKurtosisServices.map(async (serviceName) => { - const serviceData = await getServiceFromKurtosis(serviceName); + const serviceData = await getServiceFromKurtosis(serviceName, enclaveName); return { [serviceName]: serviceData }; });