From a5d60bbf4bce73b8b1c333719c652b37b7545403 Mon Sep 17 00:00:00 2001 From: Jenks Date: Thu, 27 Mar 2025 22:32:14 +1100 Subject: [PATCH 01/14] moved staking backend content locally - moved staking backend content locally - removed old google analytics tagging which is causing issue loaded pages locally. --- .../testnet/staking_backend/staking_backend.mdx | 16 +++++++++------- docusaurus.config.js | 2 +- static/img/guides/staking_backend.png | Bin 0 -> 48448 bytes static/img/guides/staking_backend_dark.png | Bin 0 -> 50352 bytes 4 files changed, 10 insertions(+), 8 deletions(-) create mode 100644 static/img/guides/staking_backend.png create mode 100644 static/img/guides/staking_backend_dark.png diff --git a/docs/guides/networks/phase-2/testnet/staking_backend/staking_backend.mdx b/docs/guides/networks/phase-2/testnet/staking_backend/staking_backend.mdx index 2cdbdaad..2cbc3834 100644 --- a/docs/guides/networks/phase-2/testnet/staking_backend/staking_backend.mdx +++ b/docs/guides/networks/phase-2/testnet/staking_backend/staking_backend.mdx @@ -8,14 +8,16 @@ sidebar_position: 1 Implementation details for integrating Bitcoin staking into your staking application. -import RemoteMD from '@site/src/components/RemoteMD'; +## Overview -export const rawUrl="https://raw.githubusercontent.com/babylonlabs-io/networks/refs/heads/main/bbn-test-5/integration/staking-backend/README.md"; +import useBaseUrl from '@docusaurus/useBaseUrl'; +import ThemedImage from '@theme/ThemedImage'; - + diff --git a/docusaurus.config.js b/docusaurus.config.js index 39572c91..7742cbbb 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -162,7 +162,7 @@ const config = { sitemap: { ignorePatterns: ['**/tags/**', '/api/*'], }, - gtag: { + gtag: process.env.TRACKING_ID ? { trackingID: process.env.TRACKING_ID, anonymizeIP: true, }, diff --git a/static/img/guides/staking_backend.png b/static/img/guides/staking_backend.png new file mode 100644 index 0000000000000000000000000000000000000000..0c510d2d1a788cd2162582aebd5b4efd533f6f20 GIT binary patch literal 48448 zcmeFZWmr{f+cr9B1O!w{5K)mXkqJmhsz`UYE1W4 z^{!_<>wVt6_xJtT$3FJ{#bC}c?{Vi9=XqY^i;R@WZ7fnO2n2Fl^zAD-2n3}G0zrO& zi3~oe;Fn>9Ks+F#uLKnwv^J+PGzg5Y_;+is{il{fYp1B9rY^UwS~Wsz7n$u@U+eAA z9(~5-Ab5>WDEM08Rmt%u^4c*5dRn4bEUauOl3;qvlVL3x%IlqNJ?aHq^ANNBO_!rX zx4l@`<(TpD7)L`sw(i~wiNgaT@Ms8RsJ}1$_3x`)dQ8Ociy|Z>(wmE)?2iOcZZ7K3 zQH^i@dW?ENZr@z&lHw;L-CSs)AVY8dHkk-`px<0L-2UHc1pZB*%8P1e9|JV;%zrZg zd%y*`%>!cgO!T9F^Jc@%v!3}6g)sfs$G;z<^9B<^?FnxBfBe7YyW6|dTt+6aYSws) zVO2F_0a1V6vSW;Ax2)fYGt@j|xRKw-}g;{Cz)4_64p!V#0vj6Y$`; zk812G=z;$1Gs&@5aHk&{;TKjq@p||=LE_Z$#py9|+u;a3|IPrNlLGPDi;b;`&(-Yg z>>c9NV$SuEzZh1$ENnPe)OtU9yls!nSGN4#A4{Qi`i&=}r6IB|Z4$;?a_?N+d2RPH zY`ru51pGsnY>|;^r$xwPGfH&-mYpv{L;)C*Yw54kkZ6Pxs35u!x^h<+Ej8ugz~~FnId(& zA49Q4kDiB=+B0VB$${dlSutlMkCMj%aX85EZ(wVYp!kQP(Hs?5uEZB4xnI}g?=VY} zy;+O-^5EC}Q)V(hv2EfdK39jN!@#8HCmH=tNA>Ic5uGjMr2btkTV(w&a)=f2quQOg zFez-z^+i%HrhIV~?k*m}AG$s6xZ)`4z_QRIrxbzpxjav=is@w|7^=Y6e71+K@ev{x(wK z0;HOQcO=g0u377?OStUpmSO0a!Vy}$l;LHgm(8Xl{&%fAsu%bpiI?64Z?`$U4qmrn z;TK<3w7T;8pcIFkA(L2P_<2{5u8Ue$)Y1WQJRGb#TUv#gvXf_wvFf$D(wF$295VD4 z8A>$-R;NVz^lB|^gGULozOXR**Ji&baeXdDR-uz6TGvId+1}7J(?xlS$@8Ky8%)RwEBH?2% zS8+;a1;mwyjms|e(%Z5=PmTqa`CTwuhGFh5uAJM_gV%iK{v-X^eya2wNu0i=?RY?Cis}kWQ(l-x6E=xh&f-Gh2_E3n?=S1_7fyW?mtG&GJiOU1EDSda8bODoes1uM23 z-FPl`^Wd;-b!&JjtW{XFU)ka6!ucpLajI6>Silku<{_oJtVzjjFYbfS&L1z;J60M} zBOh6JVzv|!!<_p=Z<8j1QDBfb9WE)V=~CYb_8vFEolmB{-vYUOI7-a-*b#HMv$7S1 zZv*b2<7`|r@leyfXz+hiXlsUpwxot)16Nl*icGj_FTz0zKth_($4|bEjzro-0%x8} zo_b@sFJ%{7)oX&b+D@3ERuWyk$QJ%4wB8~?#)^k6CbgofR~mhFNU`C7!!{$>ftGHM z>Or{7aFiUcyVR^g_M_W~QIsfI(dK+vmd~XYukO@cbe=vt9Gz9$_tVBIh4g5>*7a$v zPvonz-%v}n33=8LjM-{YWEL%67A{76#$WI5^M;InSeAEF8r|3~?#>(qGDJtOfI!P?FR`H9nNd8y5az!Sv)d zVr|1nUbOSM#nBP4FzoB%&xLZ%+Y;G_dfc+JywO(uyo~K+t4=5%Dozm;VvqjHg%t2@ zU0!gtUjF#T)a+J;iHbxjz=xkKiH%yAcH`=q?N@=M3wO!d!CxKeoRI^F%O$NMLHtbc&2q@4j8PZE;`3OTTk zh7)D&!CqbM;=K>Epxw-)L8KEkXLd^k2Mqb6dB`@u=5Ikcj#>m`afmwaBqJ@N{B4!L zj|%V?(x+`31yfM>l69TQ-Br{U-~IV8LSB2lcMPgc68ZAjD^*u9)QE!0%$T{d`Bl~s%4J;_X+MZ1u z7%9`JUaen*IIz}@)A)G3t+--9cM7fYOG?> z&5A_J$#YdS5~kHQ+)|^Pia*)hJ>tSZ&W;!QkUuJJ-|ZW>C__>c>?Es3$R8TpmUbw( z`O!CgCr6z`bn}(-;p7Cf2vM3oOTbFo_VB!Q-@J$;8`%GsWA-UDugzk4WAU1I9u1$l zi^CKN9Tf-(<7=#9cOTp<5OK_6-0LLjNwucrS$;5)o`~0O|D~vD#3{V;#Oz>o`?MVy z=4NQFPP+0^=4Ay1HJ|gfQvqFY9ItQZy_H&d`ys?gKI!=N^aP2ZbP@cd(@G2*V=$j9A+#3)oHU+H+rH90EedL)j9y2^T z5`eKF?v2<%LdrIsGj=#OLKQ+8w$O-hkYdGs39R;2iv)L|B`_U5nk_V^<_TPgmEEId zMzhS%Cp}?D$k?C3(_Ueza^0oauMDby%gmVcN7Q5x3Q(v_A_??P5wW;0J#Wa)r=uC{QkE?mZKuu7hPXKes0883ee^2mt7zC5dEh(hhyMzcy{f|!vI85)I8 zw@6u^y1Ugj0)G`GKtTu$a* z={>{dlCFr)3N-oq;}0zI&Vs)&F7l3BC2|z%{`(`>**>SP=L(ms#1z9(VJSadl;}6& z64{Qu*}bBzZ>&< zqSmQlGM{Zj%Sne~7*EvqTrVy$h;0Qgk#)yYX<9l{BQ&Ti=pe>aFKi!fdHZiO9eQP^ zn8aEPajkylU*n&oP;NuY#;y~FIR4pcon%MxsPOu=c6)@NVE&|03w16Fxe@sq+jtxG zf0z+IJ$ww~fmYXnaF0MC?E(n7cF1X-1<&G3T0M(F(;oMmUTDwagmJ<%X`D!5xz1A{ojASgz&BHZmIBNt4H+LFsP)bMJjo z4j{AR*Xvx*o>Qu><`E{ZZTXNpiHpebpGj1dbU02_eg4O~_T7XA(N#`nM)oWzMM@sH z;^GdKszz&X*F};#I5@bZ$wvRagVtu14)1#^c_fy*I+vxG-;6Hdx;P%$=9SZ3=UU3= zn`yn5|5u~4z`V^x;Or*#Gw4{|R-NK5<3YrXx1Ly2o5h28=?o3NuLReQMS|A$o8kYb zE44VoVzLJP3@2Y>b?I$xvFx93Fp?`8lZ;7W|Iz%?dE!NI+F2Lg!;qlj?f+@Qu34kK z<7w1;2iw^HewfZG6))R$h^!J#|I_d(JXL=T`5*Sx|M;L`<-n8^ zQAHO)>PsdE4ajAuOs@|MV@_()F)#3G7Sv$@r1a0aWv$)Gg|E9R*(Ms zrd!Wz6X-u34djt~mkGVF(=+kwM{4(+taf;7^87To^U@PHEV!0CpU>$PZE*M7%;t^_ z&Wq*Rpn;V4gdd(f&3US<#(b395s8A46f+=%ptw2X@$tu!I#2(w5$hx^{LVPMF;=jS zD_4aTjgev1$x6J$y+Na|WO!D0FpR06yv*4~I%~nL$J64aVIm%69ltUAA6>)#%Yx|P zY-#XTcqfqZ+4s{-qoc-STB_H%h&8>TZ&XrU{mGX1F>rdN9^J7(Rarrk>S1mW(%G5W zFhX^oe|_rOzaePjQ*g;mx8XLV`%07>*N0?p$hm*j1a$yp;~Dm5+;2MwmX2I6`JzUr z?;%#{f^y+w*Lqjg=XSd>kfyE4B zmAEywI@jp;#LC#ph4@&M>2o08T?)#B42M_uD{EKuJ4fbI*6${>EN5Q-%CoyO8fuL5 zePq)9Ae2x@n@gklt8-)i#*3Yqd#nud4KG)1b1oD`RO{2t$0teBoRoc0}KIV}y-H^)VWv%UgAzGob5J2G5fgI98ul<2tW< z3B1(YXCbwIBtI?rqWlt*JMpyG)q?)Q&Vy}(EavNG&4(D7Q#oBFos-~>s=ef|OHticOu+4$Go{Y zlCaEp20Swd`B$HH=^sRu9##~~p9T-Dyzqv&9t?O#Z$j6TQAHz;UyGDl4os!NiAgL! zzhRCa%Tz6S4E4g5z3W%zEo~oL?@^k$JF>Z|9-z8jG!W09xj?&)`Qo9350TC0t9tXP z`kaA_W1XIow1cfN<$K6bCNaBriJ_c|d<4#kfnm6>dyO(c>sE8$Ic^K>b3J{`kpY!H zu>r?t4{cO27W%-I^045|2$Y7dQ@$f|Fa;_lHkMCK?tpkqA^Di_a~2JjCqg}TKOZ;H z(Le@&m;f1yw*5WyL9Vb#j+iz7eYGb@G(y>)GuvFmg6`vi2FA2!v8J?VT45vT#pV!5 z+t@jE$YbEqfjzbjn0xEeJsDWA<$95QKDdoC0~`2akk;pfo9gv#{e?uFW-!F{Y@Lvl z4VzZZy<}VXzNQ*;re5joCmbvb;9S+FHhZT7SCMmJa(;*4XWdA?(Mq(c#|(*6o&Wh$ zyKzYCx0uNa>`La8^plK)uL#%{bODmTa;`O1{@{#Z%Se2#EUU-ET8tx?Y8|$Gvm)Ad;^>ZPFovT0mN>G3EFb zg;L508- zk=8*&FoI4DH=d7XNAP}130mu=gXIrS+}_PneDcwX^=MP!6r7hXy+VGf&V7w9ym_s@ z-Az%?;6jl^GC%!>65gQ@3z0n+JZcN7&fAYYCxLZhS8C>i4 zu8$O|y!1|{UZ1B@t~GUwvLypB3HX%7nQP0h{oe$1zTfxz35;vr!wt=%^*6$K&z z84|+%uQIChKA(i*Gz%TgyE>P5j`JUYb>`5k2YY<2o=B5!Pk);34&SlN=4qpSX~wPd zy3u51O}$*OyFXEfYQ7ez-UR{4I6L}0L~<@MbRJk^sQcBRk+0ajaLP(BYxr6Cu} zhR*s%?p&YU=1Gd6ziC0TKORk9Z7M$s+!t_nU~BP^%(%76@_1RB=P02;)m0-a*V@C- z+QCTS1E;GTGADv87f`U+~p#!K(A1gD_5mHek)5YGG@x{lw=(}`N%$OmZI>A0tTq*UbBXugw}2u#8~o`-K~ zduNErVOt!D%Wrxw=te$9IEMx~QIVKkMbO@9Bg)kf&$bS$ zqw4%T5a7!48Gg}b5Xg#L86+{zk+m;Cihc7-v=YfwZq{NrP|Wz_0P90nNi~Y)otd88 za?6J_SNwqY(EG=vNIV-4zkc9i7!+Okf@7z(XN^`+ZZRXi-Hme9{Y2+F$IbtE%Ru?k zoQu5EyseUfeu{q;-&R76>=Exw{HK$(JY|m050zoPT76@s5!|$qvN+^WJ#!z~#Lddj z53lmRE0_IfUzSffFrfR4Wj~W#wfVxjp#?rpptZ*24a+T_M+n*p6LwB*((A`EZIa?} zJK!&)qnUHVlhX+3r5j>++((%smft6R#g4?;iyL+NJ{E#{7;lrpf2Hk2Jl0`->>ti698JAU-CpEjlCrkJP4xhy7aB?-Rh!O;OP_V#zi`6O&w0YgIKG3*K=)M1mmR-9M*xVEXg){@Dx& zRW<7@iuyiFme#-$s%4C|ij9JIGJA-vhK!<+AXR$*{WnOErcb)F>3^o4>!6{KIsJBG zeJ!T0u*fiw4IUK}X8SD0RUbAiSP5BHoZMoEK;BTbxZWcn`{M*qz}KZH=WuUwRT3Gn zuA}tWJ|{gqQMR@qmOS#kJumb<@K}?++92_ka9vwtojs&8u`d6V_5jIfco3sN6l>z;bY z!~LsARnX{D@ZL$2rEtFq5!(bYu43#guHh_0V5fv` znKzoTQxjZ&~fe9P0YaWqRfdjNG6`01Ay%C5Q_ z4o|gQ8MxPnVFzAw)H2CxkeTaPT!dN0>ga6P zl0iupKkMf)sCS=%N)2NwYxC9UY7iwV0+KCrO-TYMhN15tKToA-AV zgv!1e5;MitVHkjT_G;SsS^d^FSIqP)7AV&hh(e$=FjYW0d35a7j(R!?125b?ncGbx zjp5hTvcjAiJ!v!m6@v*?pQMnfS=`xW&29fKd|M?o;O8GyCJ{>|rZqD&!=K$%H0j1~mpWjhfZ57XVK zlf-Op!%rR$)A!seSFK3*m{tzoTpD);ti8fOCvA?$G>z}%6k zOpi8S=HCCnI|eKg7GfT+RA)gcKh;-)9HdpM;MC_(F(WP@{ z|0{4Mwxln0eP?-dC8!Fqqo^Vl<$h?vmC30h9_?4;_NBvYFj?RCKR?P7bWS1`VPwXR zG@PQJv1b0XjMw9+_QXa&XlbRi(9VWzwzpO9Y?9mPo0G z3=VfA+oV~nE@D%v%=iPbZs1WQ0m?w$=FsB%u7M&a2%6vd{Q!|zqd8*^ckn!B#$!% zKR7`!91s@vG-SD9CdISgpQn%4?yD0VgwoqeKX5`OQ7okZ(93c3Rm zkl2q~nlBqIKNw2$kGs%^8xp%-mUJl%Om0*vzNC@Z;_i)WIQNc+(%+JnPUjlzH{)fZ zi)~5i*aJtz6_Lx+(+3ddY$4!JW0kKrSwr{|BtL`v2kv3qJXVm&>Gc`Gn9+KsJ((iH zqL~~zs9c0Nfz2JoK$))R{GFXqAaz8{M@~8_z-j)mFsy1wP5?itug|M1A%G2vdtp-i_OPYTgyM0>_*Vi&#mSI%2W3-Nu63@sp;M0PELxs=s=s+B`LA zR|t6vb?gI_hV9U~8y?9=Lx@`ZuRAEXr{qU^uY~1$OWhg1K{*h=8 zlv()B!oB8A3uKWXLuka#FP|~~<*7(u9)_$z)zQv@R?m2rcr8|>B38M8;(-EtEFY7dt)0Cg$$2&$U$3`zPa-c}u z4L`YULC#ots*pW0w)loY06Q3}3`>+@bJ>2v9kRNyB|Z%DsQTkNZi>MCP|ZY~WDMv}>!O?zeb;aiP@%bwAh?Fm-FaF8>Dko8Yoj9Vj6OLS zGoNKN$0RVz0Zi(Izwm7#&tCjveQQwQ8_fnE=dyD2Cfa%c9gNj5*({Xgvl%0W1{=?JA&ixWFa@?P_D4=S5(vTt9*#E8f2PtFwAXzwy{kcD_ z6ZIu;*uDdSg{VI6stMZ99D04<-asZqY~RJg&wS{Z-}Q6xy$;|p^QYSevoMjkWh3@? zW<1GV49##}77l2jNP5=I=BkTlu>$*Ty&ZL9S3%~V@lq_F9vch6xjmC!3FWVKlra3N zOqxu`JeY#nBj+~}Zk%S3J`kTSm>rVv7FX0atyLGS;ka^@R!j{nUN176rCVoIpm8$a z8u(3Ud$#^^#TGCNW(&MQu3k_9d7`X^2f$pM5fqT61O3#Uf8T)X*~K-X?~>pen`dSb zC)Zcu9@r0+eHjoWzbNVt2BEo0S}7aM7Rp_}(!C=EPt0cX2o#lJ(;ua{F?nhk+uW8; z>Bo=7+^x98_|YKA+l+ce7)3XX(Ep~*ccMM2gCpkY_SNGczY*7N`_A8XTu43QF(U!x zx4&@%UKRAhDztAt{SCkGcx!g}UUg=QoM&Zcf~rA&3;-!r9m<*{u$14;{TE-P2OkFU zDv0#K!Zh$btmawS;eEl$hB38aQHbsVw;7x_!t zO+}GU#y9}9_3m5x#7cyfeM3GR{YhWl&nb{nDX-|jSH5n+XvOQ>Smog3VDYqd?;qV0 zl9~vt<>X)E@Mzu!p>TK>Sl0(t9}0ojSI`A9#GN(K@MiU35@+TOdNMHw%nGsnx9cAF z9uJkAt$r0XK~acZVY@EZo84E<0V@n^`pHnD+3pBz@I$|svlhQ>bOlb?2859QP7}15 zUm^tzus5e8xZird=g5v9sw9(4(%2@p0p#VLeNwmCkqm8pBkt2g88=nuRs zmZ+~mg!^*=o|Epo^kB~B0Ax27v(x8%`)=n_p9A*mxxW)G_tOgGLK3RYcs8~-w{3yL z*dRi-k+mg!t!o!30vMQb^wp8xZ4f->w9K?iVbVzy`1`JE}D4Pd!EVNR_kJ!jH2w@IpXZi&|?Ugd!>wY@;) z5G*1vX}O~P;|AXb8dZ+RDekqlO@UnYOWtT{UMehp7Wc!^c<~p$Q~;>hW-XFo812|1 zK@HDr)@(W>|J%cJ3W)e~xFf6pcv=CVwAh$;d%*liI5<6tn5uFHu-(P@hH~TT#@p$f zrPIwto2wQpCBY2b?S+H5;0ch5b#`1L!JA@#s~7+Tl}666_=={4aEJ6>v* zH~liJuD_T`a;CPYR_t7jW1N|w&=paGfsFvshv+#n224ykeMgkG1i%@SdcW ziIF`_yNh}fG#*!?1=YKGY+fXs1>*5Q=e+0!#0a%kzbtm$(RP_Ozv|T-(2A7o1slNs zX!CTqlKg6@FbYl#@sRk}&4<%)Z)%Y9YE5*Nb~vW&`YSz+Es-Cw2suKAgxvbGzgFgX zYlPm7CKIZ##zzVr&cAO{OW55PgoLpDc@H`)ua(o-#p_zYe$Lc(5@7;78K4*=Z1z4rYWP`WllgIKaYlJ+?Jk|?X81=IFofrC)iXXQ z>BWx@8uh{bcXN0AiNb8g*X*8%x{jm#m_3}NUz=>PaL5Hg#Y?Xr$sdKXY$O49Xoxhp)3eUOv`t6&spUp9#Es-ee; z07mkI#sP3#;5&l#Y2$#v(-Bzmq~oW zt3?2*aHeS7V;H^2TWJDOHx>fmV|;)RH-8v59aWT$_4R(o?28xD8udqj-T{_VL5SU_ zH+HAO;Z*sk#XmQX*73S%wiskZAeZxnm?7QFmO(S*a&c`ij!B_(47h$KCL_1Wp=H3A4OkhJg7H14 z^|f`MF$n=6QlFM`l4&MRJ?p^>v{e9BuQE|BxF3XB*8^ZsbySl#BlwtPz@VN>c&`>p!I z6+*w+bqCuATy6{BbhZX4v?S513dc&cYll7*scuwoNhL7U)jMB*DGt{MAPw{nTh)Bd_aetozjqzV8@wsf*YoYaJtVU z(AZzR1u_SK-Y^pyQq6X6z3dlR9d62`Fk8y-e2W&3dB5^q1U!D+mE#>iGGWzx$dtXl zjlZsePsW&M?*;18*+IRjsm<}MA|5qTM(o7T^xGUZNwT` zl_2uqsddhQ8YQcG7cSK0eAo_3=)&Dp2J%4hk2jk)40Tnp7WXo1G$fa29kYrPdXcch z9TBcvsuhQeR%vVHo^!;YRfA&Fy2TUxP}wAkbUOpcR@5)n<8Zh4FJCLJpQa{1Aaahe zl@GOxsa`zaN#Z}haz3m2I8*jsi#&O}%VLY@{EOQ}MtOYzdGfhrq8kuVOxjo2A9lN| zT)~c!@`+yuf*5q|kz5VR!H&A!d5=AL#?o0D^cle9Vb!>phzB{^9+{p3SpJ&_Y_A`v zW$^E?`yQtH3g3Ur?Hj%gxzzG6+<~q=Wg1O7uJLF+KN9OY6ht~}^0pq@6U^HdKia{T zme#+%lM315b!W9j*r)7>V`L2IZZtnZ0jeDdZ42%77Y=(GMYs5JCy)<-jzV9ATKhmz z`>7;DcU=Ncj-J#{T(uy2Q4idPyW(Vu5z8JFNE666wzcyql2iB8QcGsfy%{G)jhOJS ziVkJ@mmh-Nj~`sP`I`?3GC$2I#kym8>t&mS`SYfT&-Ao(2Hrv*4YtRL(_U-sPxMr( z%gboUE)X$g`CeKkM-OI5ZQf1f21;Vo$Tf7!PwOvL?o3m#JHz(BnHQEtN@&+RUgx~k z#b5LPw7GdWIZpEVtot6u>eW3X2Nw0&WWC0fzNE6yjLD!t7C(2qV{tVwEG@ z#4)*`9%j6(@wujt?Pbam=HEDdGIdd7**^a9BLGsb1by0zG}s*4cy&XR`>_!2rh{QZ z0wCMwNo$7jqPVzU$V^y}2l?{>vjKP&ArH4SU3Dz{$G1wtAx_ScdfxCj4PuvoNIKg= zm*hKG%2_u1(Gu*i?zE`ya zJEw2wm|n*Kwrp_X^@c7W&VXe%O-M)Up?BeFiWw1Bvjf^3?{Zm81oUTT@}oKZ-OmVo zjw*-C^z@~g595Hz38rZ?!{#{z`LyaOp!SW-C#4v=L3#&o#!Fz=CRtR3|3Pp^oSU>a zY;J)NKf#biXL?Ag(kFq>_0Z29kpc+Oh#)Z_`}?&#x}{e-IL06A1u@Iug8MdnrT^oU z=RpNyCftCvhWQIxz;00!7|FMN5WhxRNG6T*ACSJqhIstGEIP9#9!DvCY<$?Ea zsE+vDOcmf#rMf^Ra&2DR1)wC}OJ#BXJ0~{+mzxt`6@D?fV-DbFP-$Vi-B3S z7)C>-u>J^-fH+ga3@0#-Jc(t(FjFdHru z7D`!3RivocsHZ$pc&{XtWXVU+uIkvh*TBJiFXw}W@rgy;7~^DvG|8*8)LWS@?yOww z&-vySdXK=aS#v2;jVjGmPqL*Ta6cqvu!*Vm`emcC36LHO3lZ+O$<0Qy?$XxLa_kv% zw&y{0(?8DE4^4G14pQ;?O{O_U5*)U;1C^$t>K$$&l8#A%P}u>1IzT}|Ng&5nB zPU#3~5o7|=Y?tG4%*O)q(V5=|iyP%ZkSb;Yv{m`g*@OnPEuNgXqi}*;m8FLZSsKjU z?_a)S9L5tDPlkW*gvFx;GZ-fhasp~-yeTuu0n1j{gUGp7R>Uu5oPwDQ;zuoO#t*i83;>HyX%VrO`#SR$yEYE2*;oX2WREJ-GlFd zl+I`w@y+GsXw)K zR+2(;TC1oJuW0YqWG?K}BKTU443}Zze!SFY<~(dHr8(G3$!n+~Tf`#_jn-f0KJ29?b8r`coo z2d`K4Y2wKnL&DE|l%~BKn*F07l6)In#=ye@+y&@u=v*+D2E<>?yw|_v?5QrCbs60Q z!P$Z84*Sl#j9UnTugC4L3b6U8Z@*;l`~(P^VWa7T{%}6J(i^WxfJur++R>@}fLo;z zA{qAd!XhEHx;~h~mT|l>xL633+;qM<_(I^WdJ1?0I+~Jg;MF5!;$H%=mD^2+)jz($ z$vdz|%sTRH^Dr+zu1yB0?Rwwaf>9V|B<{Pq?Q3S~mJyedFlk1u`zkE}{S|^<^1f`9 zTT5<*_zU9*!z_!n-JQk?;WgoFM2!zn;|vNCkedT+i8&#_0OQC6&G@}w{yAWmYzRci z1W5fNi*|Rg{aO#P5zs^+(}W{uDH6yC7p-TmX@z5EQ8fOYO?a znUD}2+|z|W(Yzt#fo^c4$%)88hB^~QDas%&#LxMJ9)zPC`$Z7A^RLY#+^R&%1k-4L zm0DpTfJ*zzyzI{s`T4U=s@sSKqU=7T!40|fay+$M&$Z!=aX9B)=9=Uec{~F0O9z|0 zBTTr6p?>G7p{;hQfvk(#6&)p7Tm%|b22_uN&n=%Y*;U!>u6Cyo*JPVP>MjQz<%VWr zp8)pNSSHOmdrAme2GWF>H6J50zo%Wz4GGZqj{j|{fJE*7g~$@1phVjlZzICXRF6dx z&hwyLYb{6hISW9yqI&wv6Jwn`neKjBCG;ywR$s}$g`ez+ayfo7ogS>G(v#R7=l*3@ z?)CA+#JDDH3JYzaOF=2vnwvk|RhSi=nHC}&e>GdSzN7JQABD3~>A-a&Lmd3;m^x^d@tzPie-wZRNKV%|Kduk&pH-cS1};A&2jU~B znH#Xe6O`2H+QfKr@|6%xhq8bMmUAXONpj?a>+JK6e?2nCU7dMDZ4X);pgy87dvbLz8p_)>3;78mzzZ^J== zV7G>RFEaAyi~ZJ!Sb}8l{d^p>P9S^SO!`5PpqL7&f4OP1AV^uZ9S$euQ`(>eqRUy> zKu&he`a&UY{!}rNlk3~!4`ld{1+J@IS#mWt5-^N$fXWzE`^z-NJ*tbH#LuO6WGn^w z(jIO1jY~L5D^9b;-J{UN@xI3!_%IxHSrZtwiqk{6+<U!61=q($NiOLcjt{4Kzu zDt$pdD9qk1+7dy~Pund9-}cH8_i)SmYWr;gYcBP@D>8g}J@dtTC!q)KMUKQHl9Gl1 z><0S6*^8Qb8`A)wG-50`BsC^F-mqT)rdWm=B*LmOPX*-PoAQkXzHYj4!_e)g8dwhq z+_o*q&*ba~=q-4x<{RtDDR`YO4#vywn^fGuB2@jP{lS>TX5*K^Qg#N4EYoz=%t*0X zvtxle#IoVx%5GERTJ|0f`CN5bj≤(e>Dqa(zTw1r`wMD3qW(xZE>YmGxueQ(CIG7O84qh_PmND+i1h~^tJ!3ztN{V)y3e&eHvg0K zCZ}>n=?xl5+gpes$&xRxeP$~+iDJH*HbKk)WiaQ7MtRoI%#Hx`gEIN8ca6kA50JBf zm*Y>Zw-FNtRTP=myAeBjZ(;;(KH&0Rp0n1P3c^R4kb(E^<*kz?uSM^Ix`eJz;o3!t zL|BcR>3Vgb@Zd^&l9)AIW+?OUV-N}~>@`;$-$BdKI+8cVor&`kAl4u7qrdX4K{Z~_ z#B2bvAO^{q+tSkc+8z~g&nW>~{p9MPN1Zmel(ME_rU7J6;}c`RhXWLg`y?tT@D4Jx zT4R7_!UwthYUE7sGE&OnSy}%A%uHG7SYi_0&WB=O4Pt> z+yj2?3V0m4va1|P7QY`tES;HKKF)Qssgv51$C_m;9|D(YoHVDYFDt(EfK$fhv~4wk zUuKf&4Y|BH-FI7Xh0z`@5)^1sX3WGYW2`QAlRN5_#p})?br4mg@=3yP|XMDkQ?f)kr!HX-_MZ&QItZeE5GaUD@9y` zC3hQHpQnD*3V{i#*B~5;rP)M%>PmT?EF9i8cHQG`qJAeiFv|@o_H$~4577fAI<+d0 z6yQ7c#}=P25Tjb9-i53dEmnK2M4ffOW1eoxm7{rm z7^wzm-2u1_ivYsAK+@MQkq;W3aJ#eV-$P|CCn4MeK-Xs^|2j<4C&<(+{ZQ2>!u5Q>wBx^(@9 zkHSE)o}$}Eh27WX*RqN(cVo3OA}YreAAEM5c0cjGDy5)v)8kAX>B=eBqFRa=mQH*h zC8pI(^}uv-lS-r6^7sk`tDS$OFvl`!Cn@xFfSk)~)KetbdqV=}Z*cGyawrIpo|^ zTTIc2WgNlLR?yj+2Yqce*UR)-s3+u7yR~kSA~^=oGOI5{9L@pYkTs4C$V@)71w*F| z3Y#$?H~{LYqv9s=uew9iJ$k>~&v1aC%};E#xEkas0EpnJ3G5q!YjAVu;pu8p+?B9k zGbfx3h!DR|a6 zj8r{?F3qRwvozBhSU|~cv-k$7@qU8@QF2d^9ZBppyf?nYz(nn};3aeWA~t|bozRWT z;(&%LGmHkrSJ#XEu9b#vd%yw-Xgbsa7o}^PA+|sD?ZO8Xfs<$U0N#w$xWG~BDbshL zPf&<;=aJC`lo0j^LFVnV)r|s1@(qxd)lNcxVBCy|fG9aHi5GYzuZ?`FvQZ1-#Lvbd${!TE z*RZ4DSV{cud?wQs%9;(P^HEmF2SBc0d3dA=w=V+l$Y@R6^G5t++l7|`g9pbkP_wzj zm-5IQ?=@eWiJsg>Y`%If?Ej^LA6PPA+ArIt;|P*PSX2d<2;9}V17%@S=)uvIRR9H$ zz8(%QrdzII*2t{Rc3NJkAL={HOn2sGmD&)t#aO*QxZlh@;)6Q4DC=Rqz$-Q7|NLbE z??DQv^fJ-BgJI}%lZXN#9aUray=1@vsBzAqz=c%acwANGd5Yar0YqW)2&De7y94N= zhFF2}y0eyb97fJ=lnK}cV7k(4=R?lETRS+-gGCuLR=-W*T>VV^gkZP}sip&eR6Mpp zFRDO;%teAUS@`ZdRoY{I7X)DZ_8giv{{!9}c_&$uh|!GI)CMR@DQveXv_t4_BLG+d zG)r73-KJZci7KIC*V*yS%m%9fxxJq0h@{t7AS}1uTjg|g+PI?!!!d;uKX5?}*7fr-iYjTjGslCFBiD+ekBWLJ0neggGMzXy#x^DTL7tN#EX|D+PQPXE+S zI3P4_o9-!tJHqUkt(i)-BNzjhkvOA!gmHtG3VA4X{|%S-zlDJOX1bLy5q^%31=ODb z7!nK=ym6%SrpV(T7&Um^$nU8AA87jj8c2_cNS62yT|qUTr?7deh8YQfd~v1En26js zE`nZxWd%;_a^fjzAmstMxsmRS$&8}fk6Pfd#fT{|`L^G)+^`qG=cfbq0;fzKz3`^s z(u^=1eS;VBgNQ@s&(ca6()@kMBlR(XKZ_^@Va2^D9;Uh|zsn_s)X_4&apOTsy>I_6 zjr{*;1Kw|oXkBVc*b8=XY~{beNg*Ehb+hts_%JX*OJK{k@kp8)Cs-gl3a=ITVQ3J@ zezTP7jTp|W0;|*VDc|xjQ*A%@b(URywz?Y71lJYIEB#TS`YF|AXnZ?LyZqcJ7->KY z)R6fklp+Ia2TV1A0Vo;-L3T>xKfj;?^|i-LHFGPTkVn#EbPRtKzzV{CR~6rodv=|F zt}hVg#WelZ7YO9hy}xb;@3GNG<}vuA?3Nz9P)9=NuR%coJGUABn@u#%18qG2_*btO z+vI1ZP2OBd^enANXSu4yI4!m}3==MK$<8`oC}r=~k5Y(>hhj zQ@X!7J?V|{7Agw$p{isyB{&ORNt?}o%R^0m>)$5T|8Z|SkTD6YX5b=N$>1n9>#}Qa zA&_p&zxu0!16~94ll-rN7Lx$sWfRZeo(SG<;9>vQXurL?d4JH(zb3x*<|RQh|5``? zkKlDebuE9*716>W@8nB@B6FZAIGk%5r5fUcG;# zqrT-{!|{n(U{_zO?H{dRB5s<7M29_nvhizbE6QG~uhEgFa`B_zRQ?Z_Vq2M>Y|iih zycbHfvFp+u7eVLK>M5V-#&;Gq&;7@2pcOLzU1&$Y5e4f@icllXt|y8zGti zS4fD-L&kQl-1iaaBmgXNQnZB-_g1CLa6G6es~rXE$f2*t$pNM1K)L^giVNrw0oY7M z-m=upn0wmyaD5MR^bIj@A*gI*DZqKeIS`(YVz8vnO7`7zc6Q@vYK!#c2aBJ(${;)<84P5pUn_#Wd)YE5`AV3?R1T1^P8|mbW zX?LLe+ay%kiF=}!Za8faE>D1ovh!Qbbm<$<6d{2jyV z<3quTXKrGNj_%nJi6&qpH!c1-TY9H2b_7)c7Jieud!yqadiROTwm}tLC@!|nn~75u zi+@`!FPF`7!^={XbJfZh0+sfM0RRsT+S1K3!ax^mZ(7Agw5%|u2YJnJQVVNjv>-=+ zg(7W;p4|bp41kIT+bw!LYZ~LlN%uN;@1$Y=C?MHyfTye?t(2jSnh&b}x@ln+%b+Dt z(G565FqmrqIR&16(14M}{HD4@$t!;->L^*D z7zq(F9N1x?V}=Y-{PVI)2!yk5g%~&Z0MP~NkYMDYfL4EY0f)!$ zX%T;5<N-#ZiE0o4Qdl;nT*aPVyRsbIycG- zN$`tj1mJiGc|>}vp+F6mKw%ar*GzJ5l*p*&O7QH<2PuMA3Wx(Mt@olE9Q{G<3BBY^ zae8e}^cPUJgY{7P`?7(|<#DWiO5;7Hf(SQS(B>*0k{a+u1|N|RfLse;05qT&D+Kuf zWSY2qY}k1WKxnyEFGU^;mf(%yQ+L4G+`bzTBQy=FH|$=0E(cH%Kxu)5nchuq*y7iL znQoR!IXB-A{3gcLM>16oq5>xD?5KMQ56YiL)cyLrY8ws+*YqU_4kHVSs#i-LT-sK!r{(NdUZAt(Tsi&QDMTr^=3M z{Hz41#m@c@^4>Zs%C_wrg^{7VK^j52q;sT0NJm{q42(TD$&KX3bo4UFUfmzdFu&(qIZQM*!y(fF3))2df4S zf*lZu48y8aM`o2bR@PpD@skf_r(LV}gn60y7Gi5Vyhm0*|BM4csTmM+7Q}QQO&XAh z-M<9HZFurm)~u=w1m$-%0}M3KDlTQ-c^89n4xx&|Lv_3*f>DHmt@<&{ZIE2L^}%yASA3{p=82*1*mrlC-`G!N~z z2lGgIU$c*B4jXK;40z8OfXppIwQvqnvEbl}7SAt^JAYK-UUl7Qyww0>f)nMVdtR0s zjTnFCD8cr)``7m9Ydf0yl(tDBanuuQRigx^z#4>4CqO7o-v^wQ(9ji9-X{X48H?l5 zw!|n}OZP8Ia))dd!z9pQQegfc`FMgV5U{BjdiD@z}Ln<1i7Wp^JDL(X6FoBSsT7(*L-3&FR<43 zrxy&j1Dh0Ne7|&$S3VgBeDe7K7`9e&%&)GLpf!CQTqwLhRVcjh@e0`FVS)rGS~9mq z1*N|juuqWBe)8K^pu-b5oB-5SB4|F>`3JGGOx{f5HyNiXgn^{+M3Xh!@At}&%@Ti< z#ucJSS@t~@{tY-3FhG=#fZJ56QCQKBHO&~C-P?(p{_%(yKf3-` zV_K!UnC}cjKgVCeS`{f`ye$`p8Y40Pw zYzKmrRh4y5KVFkDK-Yk?3?_}2rPv%mbW_E>51$8CBAQG1!xZh{DpXtJ9DD0<+~mCL5LTh1AiRbF1tPsR`^SH;faxZrS=1V>+x zNvEak>8b%@*rZz2me|PxI<4R}*m`qLFRnmRVsp&%_B5?BjQ+F>;7Qx}10m^Fevd{Q~h{NA4g5^;c10HRbUC zI$Y<~uz3~+%C9!`zYcQ&Oh+}ulMclS=PuiSQHuY+y@A-<6U1h}^W+mF7H5$!8f9!r zW2ohnRpBi&6X_+pe>|J{Z*M5=U+ZsWFnj96!Xg)>yY0+Sa7G6G&Yh{fbIGoqX&o;# zkKR57SO5h3ZttXKwn}r0?Zir4xFZNJy*`GP^8sFedur3MW{~}O3^=<9Fe9A5n*3R% z?ar)s`b6VYV@wrAumUj0PGZ6x!Du3E5(nj0thuc$GN2ibK8+a2`t;9 z6b3Mzf4d+H{*qd5p^VgDmtWeF`$yF-hZsy2sNldIsvd!~TFxvFg^kK8N17=ZdG%O_ z&Fp!46`n>J3mbzWHC3E`rh^()@x0rKtRp7Lxrf^M2XM0!{Md`x#jirlL4_;(H*`*P zT2D!N54r0yf_7f79t^cuk-cxYT4)`6D8l)mU~%5WPyz1oP;TbRZ0h}R9d_Xfh(-+; z-0}1V*i2l{nsY-V>X4I-rgT>j9CzBJJZ{4BdH^F(Y8rW>;5+uR@w20X;s@l{Lz{(m zZu|x8gs0v-oUw1?BfK$@z5t$Kq1j3?!Vd8NI*jg!$;3MuCQg4EhSJXf+W_YWu!0K* zw?YEV_U*&qu^5jTUC6rsZwiPYz=QYEY~R6x$G{OAJAa+RXUIG3sfTs@4Kb16DAM-; zs6kK-LA1S5?yuv|{<$_r*n|K3K3oOjkrC~1Uq`bzP2gv8M8=jGHnR9dFE$T0S(Vh# zYyap=kZAp%e)H6)!PkLp7$+xjA0JJc`5d`e_vSP(Hfsjlu$S(>=r!A+rBrGfCA-HV zAgk6_rXr(o{nriTCi&|Nuh2rO!0C4z3iaFRvmhN5G*g>bHU0ATmKmZN0u=(R3B-0_ zUD?yHR4MO^&b*%{`PocCWp@!WFXoI4^_76?2;dhpNL?N|M$8FUC#Lk#K&l?4alvl# z)Na6xx^mw}++@O`Snx5FAaFRlC$*HU)-oDys?~{(TOg zY5s;2?N%%{MZ$eH9!0~V_!NNNz=*J+ljQK(w=zRWRp6)8nm2*bmp`Ro1ewwi9Dt&L z`AhPh9XrjP-wzHb%&L>|bHl{o=dtJoXrT<^_;%B8NBgv z%3!q{858UmQO}snSI-c1v?NZoofhdJQ-F4op(@C0xyq3$K%o@!I;2{z4;2(pJE2y#WkxwvSlqtDEoW=?glGv01n^)V$FtaD%eA@;!AX21d8ePx<6 z=%cO(k=tdjLMQ{T$a`ger6;cQ^5#Kvzr@21G@O;J?ZwMsMwnfg9-}!{2IY>U@klW(4vcaV@ znRZfec2aNr)oKFpX==wR4EiXp;(t;M&BmQ;0-*KSS zSw{m;s0g3ExM|cK-|Yy{xQ0)75nvr)<8*gli9ILpa0;we*NmpGd4AHoIbsgZvAtX* z(0Jh2u9((ZI�fZ%2Z_c5wmD+_2 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 XEU3J1A4C_TZ%Xl|id?ab+2j8L^BX7M literal 0 HcmV?d00001 From 37aac6bca4adafdd292747b27b94e0cfc0b598c0 Mon Sep 17 00:00:00 2001 From: Jenks Date: Thu, 27 Mar 2025 22:41:32 +1100 Subject: [PATCH 02/14] Update docusaurus.config.js --- docusaurus.config.js | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/docusaurus.config.js b/docusaurus.config.js index 7742cbbb..4ee03a80 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -57,17 +57,6 @@ const openapiPlugins = [ ], ]; - -const analyticsPlugins = [ - [ - '@docusaurus/plugin-google-analytics', - { - trackingID: process.env.TRACKING_ID, - anonymizeIP: true, - }, - ], -]; - /** @type {import('@docusaurus/plugin-content-docs').Options} */ const defaultSettings = { breadcrumbs: true, @@ -115,8 +104,7 @@ const plugins = [ tailwindPlugin, ...docs_plugins, ...openapiPlugins, - ...authPlugins, - ...analyticsPlugins + ...authPlugins ]; // @ts-ignore @@ -165,7 +153,7 @@ const config = { gtag: process.env.TRACKING_ID ? { trackingID: process.env.TRACKING_ID, anonymizeIP: true, - }, + } : false, }), ], ], From 3093d2d81cbea80c967cb600644e0a7e1b6c362e Mon Sep 17 00:00:00 2001 From: Jenks Date: Thu, 27 Mar 2025 22:51:02 +1100 Subject: [PATCH 03/14] moved content --- .../dapps/staking_backend/staking_backend.mdx | 11 + .../deployment/_category_.json | 7 - .../staking_backend/deployment/deployment.mdx | 19 -- .../services/global_config.mdx | 9 + .../services/staking-api-service.mdx | 20 -- .../services/staking-expiry-checker.mdx | 19 -- .../services/staking-indexer.mdx | 20 -- .../services/staking_api_service.mdx | 209 ++++++++++++++++++ .../services/staking_expiry_checker.mdx | 181 +++++++++++++++ .../services/staking_indexer.mdx | 191 ++++++++++++++++ .../staking_backend/staking_backend.mdx | 72 +++++- 11 files changed, 669 insertions(+), 89 deletions(-) create mode 100644 docs/developers/dapps/staking_backend/staking_backend.mdx delete mode 100644 docs/guides/networks/phase-2/testnet/staking_backend/deployment/_category_.json delete mode 100644 docs/guides/networks/phase-2/testnet/staking_backend/deployment/deployment.mdx create mode 100644 docs/guides/networks/phase-2/testnet/staking_backend/services/global_config.mdx delete mode 100644 docs/guides/networks/phase-2/testnet/staking_backend/services/staking-api-service.mdx delete mode 100644 docs/guides/networks/phase-2/testnet/staking_backend/services/staking-expiry-checker.mdx delete mode 100644 docs/guides/networks/phase-2/testnet/staking_backend/services/staking-indexer.mdx create mode 100644 docs/guides/networks/phase-2/testnet/staking_backend/services/staking_api_service.mdx create mode 100644 docs/guides/networks/phase-2/testnet/staking_backend/services/staking_expiry_checker.mdx create mode 100644 docs/guides/networks/phase-2/testnet/staking_backend/services/staking_indexer.mdx diff --git a/docs/developers/dapps/staking_backend/staking_backend.mdx b/docs/developers/dapps/staking_backend/staking_backend.mdx new file mode 100644 index 00000000..9fba9462 --- /dev/null +++ b/docs/developers/dapps/staking_backend/staking_backend.mdx @@ -0,0 +1,11 @@ +--- +title: Staking Backend +sidebar_label: Staking Backend +sidebar_position: 4 +--- + +# Staking Backend + +import { Redirect } from '@docusaurus/router'; + + \ No newline at end of file diff --git a/docs/guides/networks/phase-2/testnet/staking_backend/deployment/_category_.json b/docs/guides/networks/phase-2/testnet/staking_backend/deployment/_category_.json deleted file mode 100644 index 6c641da1..00000000 --- a/docs/guides/networks/phase-2/testnet/staking_backend/deployment/_category_.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "position": 1, - "label": "Deployment", - "collapsible": true, - "collapsed": true, - "className": "deployment_sidebar" -} \ No newline at end of file diff --git a/docs/guides/networks/phase-2/testnet/staking_backend/deployment/deployment.mdx b/docs/guides/networks/phase-2/testnet/staking_backend/deployment/deployment.mdx deleted file mode 100644 index adb26eea..00000000 --- a/docs/guides/networks/phase-2/testnet/staking_backend/deployment/deployment.mdx +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: Deployment -sidebar_label: Deployment -sidebar_position: 1 ---- - -# Deployment of Bitcoin Staking Backend - -import RemoteMD from '@site/src/components/RemoteMD'; - -export const rawUrl="https://raw.githubusercontent.com/babylonlabs-io/networks/refs/heads/main/bbn-test-5/integration/staking-backend/deployment/README.md"; - - diff --git a/docs/guides/networks/phase-2/testnet/staking_backend/services/global_config.mdx b/docs/guides/networks/phase-2/testnet/staking_backend/services/global_config.mdx new file mode 100644 index 00000000..736e8c11 --- /dev/null +++ b/docs/guides/networks/phase-2/testnet/staking_backend/services/global_config.mdx @@ -0,0 +1,9 @@ +--- +title: Global Configuration +sidebar_label: Global Configuration +sidebar_position: 4 +--- + +# Global Configuration + +{/* TODO */} \ No newline at end of file diff --git a/docs/guides/networks/phase-2/testnet/staking_backend/services/staking-api-service.mdx b/docs/guides/networks/phase-2/testnet/staking_backend/services/staking-api-service.mdx deleted file mode 100644 index b07e4d84..00000000 --- a/docs/guides/networks/phase-2/testnet/staking_backend/services/staking-api-service.mdx +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: Staking API Service -sidebar_label: Staking API Service -sidebar_position: 1 ---- - -# Babylon Staking API Service - -import RemoteMD from '@site/src/components/RemoteMD'; - -export const rawUrl="https://raw.githubusercontent.com/babylonlabs-io/networks/refs/heads/main/bbn-test-5/integration/staking-backend/services/staking-api-service.md"; - - - diff --git a/docs/guides/networks/phase-2/testnet/staking_backend/services/staking-expiry-checker.mdx b/docs/guides/networks/phase-2/testnet/staking_backend/services/staking-expiry-checker.mdx deleted file mode 100644 index fdbb6373..00000000 --- a/docs/guides/networks/phase-2/testnet/staking_backend/services/staking-expiry-checker.mdx +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: Staking Expiry Checker -sidebar_label: Staking Expiry Checker -sidebar_position: 1 ---- - -# Babylon Staking Expiry Checker - -import RemoteMD from '@site/src/components/RemoteMD'; - -export const rawUrl="https://raw.githubusercontent.com/babylonlabs-io/networks/refs/heads/main/bbn-test-5/integration/staking-backend/services/staking-expiry-checker.md"; - - \ No newline at end of file diff --git a/docs/guides/networks/phase-2/testnet/staking_backend/services/staking-indexer.mdx b/docs/guides/networks/phase-2/testnet/staking_backend/services/staking-indexer.mdx deleted file mode 100644 index e9dcdbbc..00000000 --- a/docs/guides/networks/phase-2/testnet/staking_backend/services/staking-indexer.mdx +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: Staking Indexer -sidebar_label: Staking Indexer -sidebar_position: 1 ---- - -# Babylon Staking Indexer - -import RemoteMD from '@site/src/components/RemoteMD'; - -export const rawUrl="https://raw.githubusercontent.com/babylonlabs-io/networks/refs/heads/main/bbn-test-5/integration/staking-backend/services/staking-indexer.md"; - - - diff --git a/docs/guides/networks/phase-2/testnet/staking_backend/services/staking_api_service.mdx b/docs/guides/networks/phase-2/testnet/staking_backend/services/staking_api_service.mdx new file mode 100644 index 00000000..233d8597 --- /dev/null +++ b/docs/guides/networks/phase-2/testnet/staking_backend/services/staking_api_service.mdx @@ -0,0 +1,209 @@ +--- +title: Staking API Service +sidebar_label: Staking API Service +sidebar_position: 1 +--- + +# Babylon Staking API Service + +The Babylon Staking API Service provides a performant interface between Babylon +Phase-2 and application layers. It transforms blockchain data for efficient +access by dApps, serves network state information, and processes unbonding +requests for Phase-1 delegations. + +> **Note:** Phase-1 delegations are now in maintenance mode. + +## Hardware Requirements + +- **CPU:** Multicore processor (4 cores minimum) +- **Memory:** Minimum 1GB RAM + +## Configuration + +### 1. Create Home Directory +```bash +mkdir -p ~/.staking-api-service/ +``` + +### 2. Copy the Default Configuration +```bash +cp ~/staking-api-service/config/config-local.yml ~/.staking-api-service/config.yml +``` + +### 3. Update Default Configurations + +Edit the `config.yml` file to match your environment: + +#### MongoDB Cluster Connection +Set the MongoDB connection address (`address`) and credentials (`username`, +`password`, and `db-name`) to match the information from your installed MongoDB +cluster. + +```yaml +db: + address: "mongodb://localhost:27017/?directConnection=true" + username: "" + password: "" + db-name: "" +``` + +#### RabbitMQ Cluster Connection +Set the RabbitMQ connection address (`url`) and credentials (`queue_user` and +`queue_password`) to match the information from your installed RabbitMQ cluster. + +```yaml +queue: + queue_user: admin + queue_password: password + url: "localhost:5672" +``` + +#### Prometheus Metrics Configuration +Set the host and port to customize how the metrics are exposed. + +```yaml +metrics: + host: 0.0.0.0 + port: 2112 +``` + +### 4. Download Global Parameters + +To run the Staking API, a `global-params.json` file that defines all the +staking parameters is needed. + +To download the global parameters, follow the instructions at: +[Staking Parameters Documentation](https://docs.babylonlabs.io/docs/user-guides/bitcoin-staking-phase1/backend-deployment/global-params#staking-parameters) + +### 5. Download Finality Providers + +To run the Staking API, a `finality-provider.json` file that associates finality +provider BTC public keys with additional information about them such as their +moniker and commission is needed. + +To generate the concatenated finality providers information from Babylon +registry, follow the instructions at: +[Finality Providers Documentation](https://docs.babylonlabs.io/docs/user-guides/bitcoin-staking-phase1/backend-deployment/global-params#22-generating-concatenated-finality-provider-information) + +## Start the Service + +### Method A: Docker Deployment (Recommended) + +Runs the Staking API Service image from the official Babylon Docker Hub repository: + +```bash +docker run -d --name staking-api-service \ + -v ~/.staking-api-service/config.yml:/app/config.yml \ + -v ~/.staking-api-service/global-params.json:/app/global-params.json \ + -v ~/.staking-api-service/finality-providers.json:/app/finality-providers.json \ + babylonlabs/staking-api-service:v1.0.0 \ + --config /app/config.yml \ + --params /app/global-params.json \ + --finality-providers /app/finality-providers.json +``` + +This approach is recommended for production environments as it provides better +isolation and simplified deployment. + +### Method B: Local Binary Execution + +#### 1. Clone the Repository +```bash +git clone https://github.com/babylonlabs-io/staking-api-service.git +``` + +#### 2. Check Out the Desired Version +You can find the latest release +[here](https://github.com/babylonlabs-io/staking-api-service/releases). + +```bash +cd staking-api-service +git checkout tags/{VERSION} +``` + +#### 3. Install the Binary +```bash +make install +``` +This command will build and install the binary to your GOPATH. + +#### 4. Start the Staking API Service +You can start the Staking API Service by running: + +```bash +staking-api-service --config ~/.staking-api-service/config.yml \ +--params ~/.staking-api-service/global-params.json \ +--finality-providers ~/.staking-api-service/finality-providers.json +``` + +## Create Systemd Service (Linux Only) + +#### 1. Create Systemd Service Definition +Run the following command, replacing `system_username` with the appropriate +system user or service account name: + +```bash +cat <" + password: "" + db-name: "" +``` + +#### Bitcoin Node Connection +Configure the Bitcoin node connection details to match your Bitcoin node +installation. + +```yaml +btc: + endpoint: localhost:18332 + disable-tls: false + net-params: testnet + rpc-user: rpcuser + rpc-pass: rpcpass +``` + +#### RabbitMQ Cluster Connection +Set the RabbitMQ connection address (`url`) and credentials (`queue_user` and +`queue_password`) to match the information from your installed RabbitMQ cluster. + +```yaml +queue: + queue_user: admin + queue_password: password + url: "localhost:5672" +``` + +#### Prometheus Metrics Configuration +Set the host and port to customize how the metrics are exposed. + +```yaml +metrics: + host: 0.0.0.0 + port: 2112 +``` + +## Start the Service + +### Method A: Docker Deployment (Recommended) + +Runs the Staking Expiry Checker image from official Babylon Docker Hub +repository: + +```bash +docker run -d --name staking-expiry-checker \ + -v ~/.staking-expiry-checker/config.yml:/app/config.yml \ + babylonlabs/staking-expiry-checker:v1.0.0 --config /app/config.yml +``` + +This approach is recommended for production environments as it provides better +isolation and simplified deployment. + +### Method B: Local Binary Execution + +#### 1. Clone the Repository +```bash +git clone https://github.com/babylonlabs-io/staking-expiry-checker.git +``` + +#### 2. Check Out the Desired Version +You can find the latest release +[here](https://github.com/babylonlabs-io/staking-expiry-checker/releases). + +```bash +cd staking-expiry-checker +git checkout tags/{VERSION} +``` + +#### 3. Install the Binary +```bash +make install +``` +This command will build and install the binary to your GOPATH. + +#### 4. Start the Expiry Checker +You can start the Staking Expiry Checker by running: + +```bash +staking-expiry-checker --config ~/.staking-expiry-checker/config.yml +``` + +## Create Systemd Service (Linux Only) + +#### 1. Create Systemd Service Definition +Run the following command, replacing `system_username` with the appropriate +system user or service account name: + +```bash +cat < + +## Deployment Overview + +This guide outlines the deployment process for the Phase-2 Bitcoin Staking +Backend system. Follow the steps in sequence for successful installation or +upgrade from the corresponding Phase-1 system. + +### Prerequisites + +Before deploying the staking services, ensure the following components are +properly set up: + +- **Bitcoin Full Node** - [Setup Guide](https://bitcoin.org/en/full-node) + _Powers transaction verification on the Bitcoin network_ + +- **Babylon Node** - [Setup Guide](/operators/babylon_node/installation_guide/) + _Connects to the Babylon blockchain for monitoring staking events_ + +- **MongoDB Clusters** - [Setup Guide](https://www.mongodb.com/docs/manual/installation/) + _Stores all staking data and transaction history_ + +- **RabbitMQ** - [Setup Guide](https://www.rabbitmq.com/download.html) + _Handles message queuing between system components_ + +- **Global Configuration** - [Setup Guide](./services/global_config) + _Defines system-wide parameters for all services_ + +{/* Database Migration (Optional) - Clone Phase-1 database snapshot, apply snapshot to new MongoDB clusters. +Required only if supporting Phase-1 registration data */} + +> **Note:** If upgrading an existing deployment, ensure you gracefully shut down +> any legacy indexer services before proceeding. + +{/* ## Upgrade Process + +TODO */} + +### Launching Services + +Once all prerequisites are checked off, deploy these services in the following +order: + +#### 1. Deploy Staking Indexer +- [Staking Indexer Setup Guide](./services/staking_indexer) +- _This service monitors both blockchains and processes all staking events_ + +#### 2. Deploy Staking Expiry Checker +- [Staking Expiry Checker Setup Guide](./services/staking_expiry_checker) +- _Manages expired delegations and state transitions_ + +#### 3. Deploy Staking API Service +- [Staking API Service Setup Guide](./services/staking_api_service) +- _Provides the API endpoints for all staking operations_ +- ✓ Test the API endpoints after deployment + +### Verification + +After completing all steps, verify your deployment by: +1. Checking service logs for any errors +2. Using the `/healthcheck` endpoint to verify API service health \ No newline at end of file From 92df527aff9806098c478fccf0afbf309400bf64 Mon Sep 17 00:00:00 2001 From: Jenks Date: Thu, 27 Mar 2025 22:59:30 +1100 Subject: [PATCH 04/14] Jenks/move staking backend docs (#64) * moved staking backend content locally - moved staking backend content locally - removed old google analytics tagging which is causing issue loaded pages locally. * Update docusaurus.config.js * moved content From bfc8f600a8237c69fc83f4eb017fa0ab33ab7713 Mon Sep 17 00:00:00 2001 From: Jenks Date: Fri, 28 Mar 2025 01:19:26 +1100 Subject: [PATCH 05/14] updated as per vitalis fieedback --- docs/guides/security/audit_reports.mdx | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/docs/guides/security/audit_reports.mdx b/docs/guides/security/audit_reports.mdx index da96fda0..35f2c522 100644 --- a/docs/guides/security/audit_reports.mdx +++ b/docs/guides/security/audit_reports.mdx @@ -8,8 +8,9 @@ import BrowserOnly from '@docusaurus/BrowserOnly'; # Audit Reports -Babylon protocol is secure and audited by industry leading web3 security firms. -Since the launch of the protocol is phased, specific audit reports are conducted. +Babylon protocol is audited by industry leading web3 security firms. +Below you can find the audits conducted for the code base associated with +the different phases of the launch. ### Phase 1 Audits @@ -19,9 +20,9 @@ Audits for the Phase 1 of the Babylon Bitcoin Staking Protocol are conducted by {() => ( @@ -30,9 +31,9 @@ Audits for the Phase 1 of the Babylon Bitcoin Staking Protocol are conducted by {() => ( @@ -41,9 +42,9 @@ Audits for the Phase 1 of the Babylon Bitcoin Staking Protocol are conducted by {() => ( @@ -54,7 +55,7 @@ Audits for the Phase 1 of the Babylon Bitcoin Staking Protocol are conducted by From f539dcb579847753d5be5be802bcb30ddeeb62b0 Mon Sep 17 00:00:00 2001 From: Jenks Date: Fri, 28 Mar 2025 01:21:42 +1100 Subject: [PATCH 06/14] Update audit_reports.mdx --- docs/guides/security/audit_reports.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guides/security/audit_reports.mdx b/docs/guides/security/audit_reports.mdx index 35f2c522..83390679 100644 --- a/docs/guides/security/audit_reports.mdx +++ b/docs/guides/security/audit_reports.mdx @@ -73,7 +73,7 @@ Audits for the Babylon Genesis Chain are conducted by [Coinspect](https://www.co @@ -84,7 +84,7 @@ Audits for the Babylon Genesis Chain are conducted by [Coinspect](https://www.co From 1b5f00e412b9efbcfa75ed2a42da89a8a5f9d10e Mon Sep 17 00:00:00 2001 From: Jenks Date: Fri, 28 Mar 2025 14:48:54 +1100 Subject: [PATCH 07/14] Restructruing of wallet integration (#67) * updated the wallet integration section in Developer section * spell and grammar checked * fixed broken links --- .../_category_.json | 8 ++ .../babylon_wallet_integration.mdx | 129 +++++++++++++++++ .../_category_.json | 4 + .../bitcoin_wallet_integration.mdx | 18 +++ .../extension_wallets.mdx | 63 ++++++++ .../hardware_wallets.mdx | 35 +++++ .../mobile_app_wallets.mdx | 59 ++++++++ .../wallet_integration/extension_wallets.mdx | 48 ------- .../wallet_integration/hardware_wallets.mdx | 23 --- .../wallet_integration/mobile_app_wallets.mdx | 40 ------ .../wallet_integration/wallet_integration.mdx | 135 ++++-------------- 11 files changed, 341 insertions(+), 221 deletions(-) create mode 100644 docs/developers/wallet_integration/babylon_wallet_integration/_category_.json create mode 100644 docs/developers/wallet_integration/babylon_wallet_integration/babylon_wallet_integration.mdx create mode 100644 docs/developers/wallet_integration/bitcoin_wallet_integration/_category_.json create mode 100644 docs/developers/wallet_integration/bitcoin_wallet_integration/bitcoin_wallet_integration.mdx create mode 100644 docs/developers/wallet_integration/bitcoin_wallet_integration/extension_wallets.mdx create mode 100644 docs/developers/wallet_integration/bitcoin_wallet_integration/hardware_wallets.mdx create mode 100644 docs/developers/wallet_integration/bitcoin_wallet_integration/mobile_app_wallets.mdx delete mode 100644 docs/developers/wallet_integration/extension_wallets.mdx delete mode 100644 docs/developers/wallet_integration/hardware_wallets.mdx delete mode 100644 docs/developers/wallet_integration/mobile_app_wallets.mdx diff --git a/docs/developers/wallet_integration/babylon_wallet_integration/_category_.json b/docs/developers/wallet_integration/babylon_wallet_integration/_category_.json new file mode 100644 index 00000000..c86f7584 --- /dev/null +++ b/docs/developers/wallet_integration/babylon_wallet_integration/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Babylon Wallet Integration", + "position": 1, + "link": { + "type": "generated-index", + "description": "Guides for wallets to integrate with Babylon Genesis chain." + } +} diff --git a/docs/developers/wallet_integration/babylon_wallet_integration/babylon_wallet_integration.mdx b/docs/developers/wallet_integration/babylon_wallet_integration/babylon_wallet_integration.mdx new file mode 100644 index 00000000..238713d0 --- /dev/null +++ b/docs/developers/wallet_integration/babylon_wallet_integration/babylon_wallet_integration.mdx @@ -0,0 +1,129 @@ +--- +sidebar_label: Wallet Integration Guide +sidebar_position: 1 +--- + +# Babylon Genesis Chain Wallet Integration + +The Babylon Genesis is a PoS chain built using the +Cosmos SDK and utilises most of the vanilla Cosmos SDK functionality +shared among chains developed using it. Therefore, +a wallet already supporting chains built using +Cosmos SDK should find it straightforward to add +Babylon Genesis as a supported blockchain. + +In this document, we will walk through the considerations of integrating +the Babylon Genesis blockchain into your wallet: +* [Babylon Genesis network information](#babylon-genesis-network-information) +* [Accounts, message signing, token balance, and token transfer](#accounts-message-signing-token-balance-and-token-transfer) +* [Staking](#staking) +* [Unbonding](#unbonding) + +### Babylon Genesis Network Information + +Following is a list of the key network details of +Babylon Genesis: +* RPC nodes can be found for the network you are interested in + [our networks registry](https://github.com/babylonlabs-io/networks). +* Token minimum denomination: `ubbn` (6 decimals) +* Human-readable denomination: `BABY` + +### Accounts, message signing, token balance, and token transfer + +The Babylon Genesis chain utilises the default Cosmos SDK +functionality for accounts, message signing, +token balance, and token transfer. +Please refer to the relevant +[Cosmos SDK documentation](https://docs.cosmos.network/) +for more details. + +### Staking + +The Babylon blockchain uses an epochised staking +mechanism where staking transactions are executed +at the end of an epoch rather than immediately. + +* An epoch is defined as a specific block range, + determined by an epoch interval defined + in the `x/epoching` module's + [parameters](https://github.com/babylonlabs-io/babylon/blob/release/v1.x/proto/babylon/epoching/v1/params.proto). +* During each epoch, staking messages are queued + in a delayed execution queue. +* At the epoch's end, all queued staking messages + are processed in a batch, resulting in + epoch based voting power transitions. + +To enable this mechanism, +Babylon modifies the standard Cosmos SDK staking process: +* Babylon replaces the default Cosmos SDK `x/staking` module + with a custom module, `x/epoching`. +* This custom module wraps the standard staking functionality + to enforce epoch-based voting power transitions. +* The wrapped staking messages are largely similar + to those in the default `x/staking` module. + The specifications of these wrapped messages are available + [here](https://github.com/babylonlabs-io/babylon/tree/main/x/epoching). + +Wallets wishing to support Babylon PoS delegations +natively must use the custom `x/epoching` mechanism. + +The epochised staking approach introduces the following +UX considerations for wallet integration: +* **Delayed Staking Activation**: Although wrapped staking messages are + executed immediately, the actual staking operation takes effect only + at the epoch's end. Wallets should clearly communicate this + delay to users to set proper expectations. +* **Delayed Funds Locking**: Users' funds remain liquid until staking + activation occurs at the epoch's conclusion. This creates a for staking failure: + if users transfer or spend their funds before staking takes effect, + the staking transaction will fail. + Wallets should warn users about this possibility. + +Wallets can provide users with visibility into pending staking +messages using the +[LastEpochMsgs query in x/epoching](https://github.com/babylonlabs-io/babylon/blob/main/proto/babylon/epoching/v1/query.proto#L46). +This query allows wallets to display the messages queued +for execution at the end of the current epoch. + +### Unbonding + +Babylon speeds up the unbonding process by leveraging +Bitcoin timestamping, significantly reducing +the unbonding period from the default 21 days in the +Cosmos SDK to approximately ~50 hours. + +This process works as follows: +* **Epoch Timestamping**: At the end of each epoch, + Babylon records its blockchain state onto the + Bitcoin blockchain through a Bitcoin timestamp. +* **Bitcoin Confirmations**: Once the timestamp receives + a sufficient number of confirmations on the Bitcoin blockchain + (a parameter configurable in Babylon), the state of the epoch + if considered finalized. + * The number of required Bitcoin confirmations is set by the + `x/btccheckpoint` module, detailed + [here](https://github.com/babylonlabs-io/babylon/blob/main/proto/babylon/btccheckpoint/v1/params.proto#L24) + * For example, on the Babylon Genesis mainnet, + this value will be set to 300 confirmations, + corresponding to roughly ~33 hours for unbonding to be completed, + assuming an average Bitcoin block time of 10 minutes. +* **Unbonding Finalization**: All unbonding requests submitted + up to the end of that epoch are processed and finalized + after the required Bitcoin confirmations are reached. + +An example scenario demonstrating how fast unbonding +works in practice: +* **Setup** + * Epoch interval: 300 blocks + * Bitcoin confirmations for finalization: 300 blocks +* **Unbonding Request**: + * A user submits an unbonding transaction at block `157` +* **Epoch Processing**: + * The unbonding transaction is queued and processed at + the end of the epoch (block 300). + * The user’s status is updated to unbonding, and the epoch’s + state is timestamped on Bitcoin. +* **Finalization**: + * After ~50 hours, the Bitcoin timestamp reaches 300 confirmations. + * Babylon Genesis detects this and completes the unbonding process, + fully unbonds the user’s stake. \ No newline at end of file diff --git a/docs/developers/wallet_integration/bitcoin_wallet_integration/_category_.json b/docs/developers/wallet_integration/bitcoin_wallet_integration/_category_.json new file mode 100644 index 00000000..5bdedfa6 --- /dev/null +++ b/docs/developers/wallet_integration/bitcoin_wallet_integration/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Bitcoin Wallet Integration", + "position": 2 +} \ No newline at end of file diff --git a/docs/developers/wallet_integration/bitcoin_wallet_integration/bitcoin_wallet_integration.mdx b/docs/developers/wallet_integration/bitcoin_wallet_integration/bitcoin_wallet_integration.mdx new file mode 100644 index 00000000..e1c2c455 --- /dev/null +++ b/docs/developers/wallet_integration/bitcoin_wallet_integration/bitcoin_wallet_integration.mdx @@ -0,0 +1,18 @@ +--- +title: Bitcoin Wallet Integration +sidebar_position: 1 +--- + +# Bitcoin Wallet Integration + +This section provides documentation for integrating Babylon Bitcoin Staking to different +types of Bitcoin wallets. Whether you're building a web application, mobile app, +or hardware wallet, specific guides are provided for each wallet type. + +## Integration Guides + +import DocCardList from '@theme/DocCardList'; + + + +Let's get started with your preferred wallet integration. diff --git a/docs/developers/wallet_integration/bitcoin_wallet_integration/extension_wallets.mdx b/docs/developers/wallet_integration/bitcoin_wallet_integration/extension_wallets.mdx new file mode 100644 index 00000000..38ee3c68 --- /dev/null +++ b/docs/developers/wallet_integration/bitcoin_wallet_integration/extension_wallets.mdx @@ -0,0 +1,63 @@ +--- +sidebar_label: Extension Wallets +sidebar_position: 2 +--- + +# Bitcoin Staking for Extension Wallets + +This guide outlines the various approaches for integrating Babylon bitcoin staking +functionality into browser extension wallets. + +## Option 1 + +Be added to a third party’s bitcoin staking website as +a wallet for either Bitcoin or Babylon or both. +This requires collaboration with the host of the +website and exposing compatible wallet APIs. +* To be supported in the Babylon hosted staking website as a Bitcoin or Babylon + wallet, please integrate with the Tomo Wallet Connect + by following the + [docs](https://docs.tomo.inc/tomo-sdk/tomo-connect-sdk-lite). + * This is the preferred method for wallet integration that will achieve + the most timely results. The Babylon hosted website will also support + native wallet integrations for select wallets with long-established + support. + +## Option 2 + +Host your own bitcoin staking website +that connects to your extension wallet and retrieves +staking information from a backend you operate. +* For information about `developing/hosting` your own bitcoin staking website, + please check: + * our reference web application + [implementation](https://github.com/babylonlabs-io/simple-staking/). + * our + [TypeScript](https://github.com/babylonlabs-io/btc-staking-ts/) + and [Golang](https://github.com/babylonlabs-io/babylon/tree/main/btcstaking/) + Bitcoin Staking libraries for creating bitcoin Staking transactions. + * our [documentation](https://github.com/babylonlabs-io/babylon/tree/main/x/btcstaking) + on the flow of bitcoin staking transaction creation and submission in + conjunction with Bitcoin and Babylon Genesis blockchains. +* For information about the reference Babylon staking backend, please read this + [document](/guides/networks/phase-2/testnet/staking_backend/). + +## Option 3 + +Develop bitcoin staking as a feature on your extension wallet, +which connects to either third party APIs +(such as the Babylon [Staking API](https://docs.babylonlabs.io/api/staking-api/babylon-staking-api/)) or a backend you operate. + +* For information about developing your own bitcoin staking as a feature, + please check: + * our reference web application [implementation](https://github.com/babylonlabs-io/simple-staking/tree/main). + * our + [TypeScript](https://github.com/babylonlabs-io/btc-staking-ts/) + and [Golang](https://github.com/babylonlabs-io/babylon/tree/main/btcstaking/) + Bitcoin Staking libraries. + * our [documentation](https://github.com/babylonlabs-io/babylon/tree/main/x/btcstaking) + on the flow of bitcoin staking transaction creation and submission in + conjunction with Bitcoin and Babylon Genesis blockchains. + +* For information about the reference babylon staking backend, please read this + [document](/guides/networks/phase-2/testnet/staking_backend/). \ No newline at end of file diff --git a/docs/developers/wallet_integration/bitcoin_wallet_integration/hardware_wallets.mdx b/docs/developers/wallet_integration/bitcoin_wallet_integration/hardware_wallets.mdx new file mode 100644 index 00000000..fb4ca394 --- /dev/null +++ b/docs/developers/wallet_integration/bitcoin_wallet_integration/hardware_wallets.mdx @@ -0,0 +1,35 @@ +--- +title: Hardware Wallets +sidebar_label: Hardware Wallets +sidebar_position: 4 +--- + +# Hardware Wallets + +This guide outlines the various approaches for integrating Babylon bitcoin staking +functionality into hardware wallets. + +## Option 1 + +Develop bitcoin staking as a feature of your hardware wallet, +which connects to either third party APIs +(such as the Babylon [Staking API](https://staking-api.babylonlabs.io/swagger/doc.json)) or a backend you operate. + +* For information about developing your own Bitcoin staking as a feature, + please check: + * our reference web application [implementation](https://github.com/babylonlabs-io/simple-staking/tree/main). + * our + [TypeScript](https://github.com/babylonlabs-io/btc-staking-ts/) + and [Golang](https://github.com/babylonlabs-io/babylon/tree/main/btcstaking/) + Bitcoin Staking libraries. + * our [documentation](https://github.com/babylonlabs-io/babylon/tree/main/x/btcstaking) + on the flow of bitcoin staking transaction creation and submission in + conjunction with Bitcoin and Babylon Genesis blockchains. + +* For information about the reference Babylon staking backend, please read this + [document](/guides/networks/phase-2/testnet/staking_backend/). + +## Option 2 + +Integrate via a compatible software wallet (extension or mobile) +that is bitcoin staking enabled. \ No newline at end of file diff --git a/docs/developers/wallet_integration/bitcoin_wallet_integration/mobile_app_wallets.mdx b/docs/developers/wallet_integration/bitcoin_wallet_integration/mobile_app_wallets.mdx new file mode 100644 index 00000000..ca882460 --- /dev/null +++ b/docs/developers/wallet_integration/bitcoin_wallet_integration/mobile_app_wallets.mdx @@ -0,0 +1,59 @@ +--- +sidebar_label: Mobile App Wallets +sidebar_position: 3 +--- + +# Bitcoin Staking for Mobile App Wallets + +This guide outlines the various options for integrating Babylon bitcoin staking +functionality into mobile app wallets. + +## Option 1 + +Embed a third-party Bitcoin staking website to your mobile app +wallet, which interacts with the Bitcoin and Babylon signers inside your wallet via +the application window interface. +To embed on the Babylon hosted staking website, please ensure +that the interface of your mobile wallet (or a wrapper of it) +adheres to the +[Injectable Wallet interface](https://github.com/babylonlabs-io/wallet-connector?tab=readme-ov-file#wallet-integration). + + +## Option 2 + +Host your own Bitcoin staking website that connects to your +extension wallet that retrieves staking information from a backend you +operate. Then embed your own Bitcoin staking website to your mobile app wallet. +* For information about developing/hosting your own Bitcoin staking website, + please check: + * our reference web application + [implementation](https://github.com/babylonlabs-io/simple-staking/). + * our + [TypeScript](https://github.com/babylonlabs-io/btc-staking-ts/) + and [Golang](https://github.com/babylonlabs-io/babylon/tree/main/btcstaking/) + Bitcoin Staking libraries for creating bitcoin Staking transactions. + * our [documentation](https://github.com/babylonlabs-io/babylon/tree/main/x/btcstaking) + on the flow of bitcoin Staking transaction creation and submission in + conjunction with Bitcoin and Babylon blockchains. +* For information about the reference Babylon staking backend, please read this + [document](/guides/networks/phase-2/testnet/staking_backend/). + +## Option 3 + +Develop bitcoin staking as a feature of your mobile wallet, + which connects to either third party APIs + (such as the Babylon + [Staking API](/api/staking-api/babylon-staking-api/)) or a backend you operate. + +* For information about developing your own bitcoin staking as a feature, + please check: + * our reference web application [implementation](https://github.com/babylonlabs-io/simple-staking/tree/main). + * our + [TypeScript](https://github.com/babylonlabs-io/btc-staking-ts/) + and [Golang](https://github.com/babylonlabs-io/babylon/tree/main/btcstaking/) + Bitcoin Staking libraries. + * our [documentation](https://github.com/babylonlabs-io/babylon/tree/main/x/btcstaking) + on the flow of bitcoin staking transaction creation and submission in + conjunction with Bitcoin and Babylon blockchains. +* For information about the reference Babylon staking backend, please read this + [document](/guides/networks/phase-2/testnet/staking_backend/). \ No newline at end of file diff --git a/docs/developers/wallet_integration/extension_wallets.mdx b/docs/developers/wallet_integration/extension_wallets.mdx deleted file mode 100644 index 5bc2ed07..00000000 --- a/docs/developers/wallet_integration/extension_wallets.mdx +++ /dev/null @@ -1,48 +0,0 @@ ---- -sidebar_label: Extension Wallets -sidebar_position: 2 ---- - -# Extension Wallets - -**Option-1**, be added to a third party’s Bitcoin Staking website as -a wallet for either Bitcoin or Babylon or both. -This requires collaboration with the host of the -website and exposing compatible wallet APIs. -- To be supported in the Babylon hosted staking website as a Bitcoin or Babylon -wallet, please integrate with the Tomo Wallet Connect -by following the [docs](https://docs.tomo.inc/tomo-sdk/tomo-connect-sdk-lite). - - This is the preferred method for wallet integration that will achieve -the most timely results. The Babylon hosted website will also support -native wallet integrations for select wallets with long-established -support. - -**Option-2**, host your own Bitcoin Staking website -that connects to your extension wallet and retrieves -staking information from a back-end you operate. -- For information about developing/hosting your own Bitcoin staking website, please check - - our reference web application -[implementation](https://github.com/babylonlabs-io/simple-staking/). - - our -[TypeScript](https://github.com/babylonlabs-io/btc-staking-ts/) -and [Golang](https://github.com/babylonlabs-io/babylon/tree/main/btcstaking/) -Bitcoin Staking libraries for creating Bitcoin Staking transactions. - - - our [documentation](https://github.com/babylonlabs-io/babylon/tree/main/x/btcstaking) -on the flow of Bitcoin Staking transaction creation and submission in -conjunction with Bitcoin and Babylon blockchains. - -**Option-3**, develop Bitcoin Staking as a feature of your extension wallet, -which connects to either third party APIs -(such as the Babylon [API](https://staking-api.babylonlabs.io/swagger/index.html)) or a back-end you operate. -- For information about developing your own Bitcoin Staking as a feature, please check - - our reference web application [implementation](https://github.com/babylonlabs-io/simple-staking/tree/main). - - our -[TypeScript](https://github.com/babylonlabs-io/btc-staking-ts/) -and [Golang](https://github.com/babylonlabs-io/babylon/tree/main/btcstaking/) -Bitcoin Staking libraries. - - our [documentation](https://github.com/babylonlabs-io/babylon/tree/main/x/btcstaking) -on the flow of Bitcoin Staking transaction creation and submission in -conjunction with Bitcoin and Babylon blockchains. -- For information about the reference Babylon staking back-end, please read this -[document](https://github.com/babylonlabs-io/networks/tree/main/bbn-test-5/integration/staking-backend). diff --git a/docs/developers/wallet_integration/hardware_wallets.mdx b/docs/developers/wallet_integration/hardware_wallets.mdx deleted file mode 100644 index e909f011..00000000 --- a/docs/developers/wallet_integration/hardware_wallets.mdx +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: Hardware Wallets -sidebar_label: Hardware Wallets -sidebar_position: 3 ---- - -# Hardware Wallets - -**Option-1**, develop Bitcoin Staking as a feature of your hardware wallet, -which connects to either third party APIs -(such as the Babylon [API](https://staking-api.babylonlabs.io/swagger/index.html)) or a back-end you operate. -- For information about developing your own Bitcoin Staking as a feature, please check - - our reference web application [implementation](https://github.com/babylonlabs-io/simple-staking/tree/main). - - our - [TypeScript](https://github.com/babylonlabs-io/btc-staking-ts/) - and [Golang](https://github.com/babylonlabs-io/babylon/tree/main/btcstaking/) - Bitcoin Staking libraries. - - our [documentation](https://github.com/babylonlabs-io/babylon/tree/main/x/btcstaking) - on the flow of Bitcoin Staking transaction creation and submission in - conjunction with Bitcoin and Babylon blockchains. - -**Option-2**, integrate via a compatible software wallet (extension or mobile) -that enables Bitcoin Staking. diff --git a/docs/developers/wallet_integration/mobile_app_wallets.mdx b/docs/developers/wallet_integration/mobile_app_wallets.mdx deleted file mode 100644 index 49edb70c..00000000 --- a/docs/developers/wallet_integration/mobile_app_wallets.mdx +++ /dev/null @@ -1,40 +0,0 @@ ---- -sidebar_label: Mobile App Wallets -sidebar_position: 2 ---- - -# Mobile App Wallets - -**Option-1**, embed a third-party Bitcoin staking website to your mobile app -wallet, which interacts with the Bitcoin and Babylon signers inside your wallet via -the application window interface. -To embed on the Babylon hosted staking website, please ensure -that the interface of your mobile wallet (or a wrapper of it) -adheres to the [Injectable Wallet interface](https://github.com/babylonlabs-io/networks/tree/main/bbn-test-5/integration/wallet). - -**Option-2**, host your own Bitcoin staking website that connects to your -extension wallet that retrieves staking information from a back-end you -operate. Then embed your own Bitcoin staking website to your mobile app wallet. -- For information about developing/hosting your own Bitcoin staking website, please check - - our reference web application - [implementation](https://github.com/babylonlabs-io/simple-staking/). - - our - [TypeScript](https://github.com/babylonlabs-io/btc-staking-ts/) - and [Golang](https://github.com/babylonlabs-io/babylon/tree/main/btcstaking/) - Bitcoin Staking libraries for creating Bitcoin Staking transactions. - - our [documentation](https://github.com/babylonlabs-io/babylon/tree/main/x/btcstaking) - on the flow of Bitcoin Staking transaction creation and submission in - conjunction with Bitcoin and Babylon blockchains. - -**Option-3**, develop Bitcoin staking as a feature of your mobile wallet, - which connects to either third party APIs - (such as the Babylon [API](https://staking-api.babylonlabs.io/swagger/index.html)) or a back-end you operate. -- For information about developing your own Bitcoin staking as a feature, please check - - our reference web application [implementation](https://github.com/babylonlabs-io/simple-staking/tree/main). - - our - [TypeScript](https://github.com/babylonlabs-io/btc-staking-ts/) - and [Golang](https://github.com/babylonlabs-io/babylon/tree/main/btcstaking/) - Bitcoin Staking libraries. - - our [documentation](https://github.com/babylonlabs-io/babylon/tree/main/x/btcstaking) - on the flow of Bitcoin Staking transaction creation and submission in - conjunction with Bitcoin and Babylon blockchains. diff --git a/docs/developers/wallet_integration/wallet_integration.mdx b/docs/developers/wallet_integration/wallet_integration.mdx index 1a39102d..377ea4b3 100644 --- a/docs/developers/wallet_integration/wallet_integration.mdx +++ b/docs/developers/wallet_integration/wallet_integration.mdx @@ -6,122 +6,37 @@ sidebar_position: 1 # Wallet Integration Guide -The Babylon PoS blockchain is built using the Cosmos SDK -and utilizes most of the vanilla Cosmos SDK functionality -shared among chains developed using it. Therefore, -a wallet already supporting chains built using -Cosmos SDK should find it straightforward to add -Babylon as a supported blockchain. +This document is designed for wallet providers +aiming to integrate with the Babylon Genesis chain. -This document will walk through the considerations of integrating -the Babylon blockchain into your wallet: -* [Phase-2 Testnet network information](#phase-2-testnet-network-information) -* [Accounts, message signing, token balance, and token transfer](#accounts-message-signing-token-balance-and-token-transfer) -* [Staking](#staking) -* [Unbonding](#unbonding) +Babylon Genesis chain is built using the Cosmos SDK and secured by Bitcoin via +Babylon Bitcoin Staking Protocol. This dual-security mechanism allows Bitcoin +holders and BABY token holders to participate in securing the network while +maintaining the ability to stake, unbond, and withdraw their assets quickly. -### Phase-2 Testnet Network Information +As a wallet provider, you will need to support both Babylon Genesis chain +transactions and Bitcoin Staking transactions to participate fully: -Following is a list of the key network details of -the Babylon Phase-2 Testnet (`testnet-5`): -* RPC nodes can be found [here](/developers/babylon_genesis_chain) -* Chain ID: `bbn-test-5` -* Bech32 Configuration can be found [here](https://github.com/babylonlabs-io/babylon/blob/main/app/params/config.go#L35) -* Token minimum denomination: `ubbn` (6 decimals) -* Human-readable denomination: `tbaby` (test baby) -### Accounts, message signing, token balance, and token transfer +1. **Native wallet support of the Babylon Genesis chain**: + Enable native support for the Babylon Genesis chain, including + functionality for managing token balances, executing transfers, + and facilitating staking operations. -The Babylon PoS chain utilizes the default Cosmos SDK -functionality for accounts, message signing, -token balance, and token transfer. -Please refer to the relevant Cosmos SDK documentation -for more details. + * For detailed integration instructions, + refer to the [Babylon Wallet Integration guide](./babylon_wallet_integration/) -### Staking +2. **Support of Bitcoin staking**: Participate in Bitcoin staking + by integrating with a web application or by natively integrating + Bitcoin staking functionality directly to your wallet, + whether it's a browser extension, mobile app, or hardware wallet. -The Babylon blockchain uses an epochized staking -mechanism where staking transactions are executed -at the end of an epoch rather than immediately. -* An epoch is defined as a specific block range, - determined by an epoch interval defined - in the `x/epoching` module's - [parameters](https://github.com/babylonlabs-io/babylon/blob/main/proto/babylon/epoching/v1/params.proto). -* During each epoch, staking messages are queued - in a delayed execution queue. -* At the epoch's end, all queued staking messages - are processed in a batch, resulting in - epoch based voting power transitions. + * For detailed instructions, + refer to the [Bitcoin Staking Integration guide](./bitcoin_wallet_integration/) -To enable this mechanism, -Babylon modifies the standard Cosmos SDK staking process: -* Babylon replaces the default Cosmos SDK `x/staking` module - with a custom module, `x/epoching`. -* This custom module wraps the standard staking functionality - to enforce epoch-based voting power transitions. -* The wrapped staking messages are largely similar - to those in the default `x/staking` module. - The specifications of these wrapped messages are available - [here](https://github.com/babylonlabs-io/babylon/tree/main/x/epoching). -Wallets wishing to support Babylon PoS delegations -natively must use the custom `x/epoching` mechanism. - -The above mechanism presents the following UX considerations -that wallets should take into account: -* Delayed staking activation: While the wrapped staking message is executed - immediately, the staking operation happens at the end of the epoch. - Wallets should indicate to the user that their staking will not take - into effect immediately. -* Delayed funds locking: Due to the delayed staking activation, the user's - funds remain liquid until the staking takes into effect. This might - lead users to transfer them or spend them in some way, leading - to the staking transaction failing at the end of the epoch. - -Wallets can provide users with visibility into pending staking -messages using the -[LastEpochMsgs query in x/epoching](https://github.com/babylonlabs-io/babylon/blob/main/proto/babylon/epoching/v1/query.proto#L46). -This query allows wallets to display the messages queued -for execution at the end of the current epoch. - -### Unbonding - -Babylon speeds up the unbonding process by leveraging -Bitcoin timestamping, significantly reducing -the unbonding period from the default 21 days in the -Cosmos SDK to approximately 16-17 hours. - -This process works as follows: -* **Epoch Timestamping**: At the end of each epoch, - Babylon records its blockchain state onto the - Bitcoin blockchain through a Bitcoin timestamp. -* **Bitcoin Confirmations**: Once the timestamp receives - a sufficient number of confirmations on the Bitcoin blockchain - (a parameter configurable in Babylon), the state of the epoch - if considered finalized. - * The number of required Bitcoin confirmations is set by the - `x/btccheckpoint` module, detailed - [here](https://github.com/babylonlabs-io/babylon/blob/main/proto/babylon/btccheckpoint/v1/params.proto#L24) - * On the Phase-2 testnet, this value will be set to 100 confirmations, - corresponding to roughly 16-17 hours for unbonding to be completed, - assuming an average Bitcoin block time of 10 minutes. -* **Unbonding Finalization**: All unbonding requests submitted - up to the end of that epoch are processed and finalized - after the required Bitcoin confirmations are reached. - -An example scenario demonstrating how fast unbonding -works in practice: -* **Setup** - * Epoch interval: 100 blocks - * Bitcoin confirmations for finalization: 100 blocks -* **Unbonding Request**: - * A user submits an unbonding transaction at block `157` -* **Epoch Processing**: - * The unbonding transaction is queued and processed at - the end of the epoch (block 200). - * The user’s status is updated to unbonding, and the epoch’s - state is timestamped on Bitcoin. -* **Finalization**: - * After ~16-17 hours, the Bitcoin timestamp reaches 100 confirmations. - * Babylon detects this and completes the unbonding process, - fully unbonds the user’s stake. +:::note +In Phase 2, the bitcoin staker's BTC stake can be used to stake on Babylon +Genesis Finality Providers while BABY staker can stake on Babylon Genesis +CometBFT Validators. +::: \ No newline at end of file From 738eaf49c1e4caa208071b5c53a21813d5cd3c68 Mon Sep 17 00:00:00 2001 From: Jenks Date: Fri, 28 Mar 2025 14:54:15 +1100 Subject: [PATCH 08/14] Jenks/move wallet integration (#68) * updated the wallet integration section in Developer section * spell and grammar checked * fixed broken links * removal of wallet integrations guides in networks section of guides docs --- .../phase-1/mainnet/wallet_integration.mdx | 23 ------------------- .../phase-1/testnet/wallet_integration.mdx | 21 ----------------- .../networks/phase-2/mainnet/_category_.json | 4 ---- .../networks/phase-2/mainnet/mainnet.mdx | 13 ----------- .../testnet/baby_wallet_integration.mdx | 21 ----------------- .../testnet/btc_staking_integration.mdx | 21 ----------------- 6 files changed, 103 deletions(-) delete mode 100644 docs/guides/networks/phase-1/mainnet/wallet_integration.mdx delete mode 100644 docs/guides/networks/phase-1/testnet/wallet_integration.mdx delete mode 100644 docs/guides/networks/phase-2/mainnet/_category_.json delete mode 100644 docs/guides/networks/phase-2/mainnet/mainnet.mdx delete mode 100644 docs/guides/networks/phase-2/testnet/baby_wallet_integration.mdx delete mode 100644 docs/guides/networks/phase-2/testnet/btc_staking_integration.mdx diff --git a/docs/guides/networks/phase-1/mainnet/wallet_integration.mdx b/docs/guides/networks/phase-1/mainnet/wallet_integration.mdx deleted file mode 100644 index 1f4b1938..00000000 --- a/docs/guides/networks/phase-1/mainnet/wallet_integration.mdx +++ /dev/null @@ -1,23 +0,0 @@ ---- -sidebar_class_name: wallet_integration_sidebar -sidebar_label: Wallet Integration -sidebar_position: 4 ---- - -# Wallet Integration - -Wallet integrations guides for Babylon Phase 1 Mainnet. - -import RemoteMD from '@site/src/components/RemoteMD'; - -export const rawUrl="https://raw.githubusercontent.com/babylonlabs-io/networks/refs/heads/main/bbn-1/integration/wallet.md"; - - diff --git a/docs/guides/networks/phase-1/testnet/wallet_integration.mdx b/docs/guides/networks/phase-1/testnet/wallet_integration.mdx deleted file mode 100644 index cbce1eea..00000000 --- a/docs/guides/networks/phase-1/testnet/wallet_integration.mdx +++ /dev/null @@ -1,21 +0,0 @@ ---- -sidebar_class_name: wallet_integration_sidebar -sidebar_label: Wallet Integration -sidebar_position: 4 ---- - -# Wallet Integration - -Wallet integrations guides for Babylon Phase 1 Testnet. - -import RemoteMD from '@site/src/components/RemoteMD'; - -export const rawUrl="https://raw.githubusercontent.com/babylonchain/networks/refs/heads/main/bbn-test-4/integration/wallet.md"; - - diff --git a/docs/guides/networks/phase-2/mainnet/_category_.json b/docs/guides/networks/phase-2/mainnet/_category_.json deleted file mode 100644 index dfeeab28..00000000 --- a/docs/guides/networks/phase-2/mainnet/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Mainnet", - "position": 2 -} diff --git a/docs/guides/networks/phase-2/mainnet/mainnet.mdx b/docs/guides/networks/phase-2/mainnet/mainnet.mdx deleted file mode 100644 index 7f509dcd..00000000 --- a/docs/guides/networks/phase-2/mainnet/mainnet.mdx +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: Mainnet -sidebar_label: Mainnet -sidebar_position: 1 ---- - -# Phase 2: Mainnet - -Information related to Phase 2 Mainnet of Babylon Genesis. - -import DocCardList from '@theme/DocCardList'; - - \ No newline at end of file diff --git a/docs/guides/networks/phase-2/testnet/baby_wallet_integration.mdx b/docs/guides/networks/phase-2/testnet/baby_wallet_integration.mdx deleted file mode 100644 index f1c7f1af..00000000 --- a/docs/guides/networks/phase-2/testnet/baby_wallet_integration.mdx +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: Wallet Integration -sidebar_label: Wallet Integration -sidebar_position: 1 ---- - -# Integrate Babylon Genesis Chain to Your Wallet - -BABY Wallet integration guides for Babylon Genesis Chain in Phase 2 Testnet. - -import RemoteMD from '@site/src/components/RemoteMD'; - -export const rawUrl="https://raw.githubusercontent.com/babylonlabs-io/networks/refs/heads/main/bbn-test-5/integration/wallet/babylon-wallet.md"; - - diff --git a/docs/guides/networks/phase-2/testnet/btc_staking_integration.mdx b/docs/guides/networks/phase-2/testnet/btc_staking_integration.mdx deleted file mode 100644 index c4f9948b..00000000 --- a/docs/guides/networks/phase-2/testnet/btc_staking_integration.mdx +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: BTC Staking Integration -sidebar_label: BTC Staking Integration -sidebar_position: 1 ---- - -# Integrating Bitcoin Staking Into Your Wallet - -For wallets, custody or liquid staking projects, to implement Babylon BTC staking integration. - -import RemoteMD from '@site/src/components/RemoteMD'; - -export const rawUrl="https://raw.githubusercontent.com/babylonlabs-io/networks/refs/heads/main/bbn-test-5/integration/wallet/bitcoin-staking.md"; - - From c2d04744d333a8edefa25862adcc44bc5526a8c8 Mon Sep 17 00:00:00 2001 From: liukangtian Date: Fri, 28 Mar 2025 13:26:33 +0800 Subject: [PATCH 09/14] fix: remove useless auth code --- docusaurus.config.js | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/docusaurus.config.js b/docusaurus.config.js index 4ee03a80..351c48db 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -89,22 +89,10 @@ function create_doc_plugin({ const tailwindPlugin = require('./plugins/tailwind-plugin.cjs'); const docs_plugins = docs.map((doc) => create_doc_plugin(doc)); -const authPlugins = [ - function myPlugin(context, options) { - return { - name: 'docusaurus-plugin-auth', - async contentLoaded({ actions }) { - const { setGlobalData } = actions; - setGlobalData({ authenticated: false }); - } - }; - }, -]; const plugins = [ tailwindPlugin, ...docs_plugins, - ...openapiPlugins, - ...authPlugins + ...openapiPlugins ]; // @ts-ignore From fb9796cdc99b73b2222cf7f2e35843fc57dfd145 Mon Sep 17 00:00:00 2001 From: liukangtian Date: Fri, 28 Mar 2025 18:00:00 +0800 Subject: [PATCH 10/14] feat: adjust the crawling method --- .github/workflows/algolia-crawler.yml | 40 ---------- docsearch.config.dev.json | 103 -------------------------- docsearch.config.json | 103 -------------------------- 3 files changed, 246 deletions(-) delete mode 100644 .github/workflows/algolia-crawler.yml delete mode 100644 docsearch.config.dev.json delete mode 100644 docsearch.config.json diff --git a/.github/workflows/algolia-crawler.yml b/.github/workflows/algolia-crawler.yml deleted file mode 100644 index af77a1db..00000000 --- a/.github/workflows/algolia-crawler.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: Algolia DocSearch Scraper - -on: - push: - branches: - - main - - dev - -jobs: - run-crawler: - runs-on: ubuntu-latest - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Set environment variables - run: | - if [ "${GITHUB_REF}" == "refs/heads/main" ]; then - echo "CONFIG_FILE=docsearch.config.json" >> $GITHUB_ENV - elif [ "${GITHUB_REF}" == "refs/heads/dev" ]; then - echo "CONFIG_FILE=docsearch.config.dev.json" >> $GITHUB_ENV - else - echo "Unknown branch: ${GITHUB_REF}" - exit 1 - fi - - - name: Run DocSearch scraper using Docker - env: - ALGOLIA_APP_ID: ${{ secrets.ALGOLIA_APP_ID }} - ALGOLIA_API_KEY: ${{ secrets.ALGOLIA_API_KEY }} - CONFIG_FILE: ${{ env.CONFIG_FILE }} - working-directory: ./ - run: | - docker run --rm \ - -v $(pwd):/app \ - -e "CONFIG=/app/${CONFIG_FILE}" \ - -e "ALGOLIA_APP_ID=${ALGOLIA_APP_ID}" \ - -e "ALGOLIA_API_KEY=${ALGOLIA_API_KEY}" \ - algolia/docsearch-scraper diff --git a/docsearch.config.dev.json b/docsearch.config.dev.json deleted file mode 100644 index 88390354..00000000 --- a/docsearch.config.dev.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "index_name": "doc_dev_babylonlabs_io", - "start_urls": [ - { - "url": "https://docs.dev.babylonlabs.io/guides", - "tags": "guides", - "selectors_key": "guides" - }, - { - "url": "https://docs.dev.babylonlabs.io/api", - "tags": "api", - "selectors_key": "api" - }, - { - "url": "https://docs.dev.babylonlabs.io/operators", - "tags": "operators", - "selectors_key": "operators" - }, - { - "url": "https://docs.dev.babylonlabs.io/developers", - "tags": "developers", - "selectors_key": "developers" - } - ], - "stop_urls": [], - "selectors": { - "guides": { - "lvl0": { - "selector": "", - "global": true, - "default_value": "Guides" - }, - "lvl1": "article h1", - "lvl2": "article h2", - "lvl3": "article h3", - "lvl4": "article h4", - "lvl5": "article h5, article td:first-child", - "lvl6": "article h6", - "text": "article p, article li, article td:last-child" - }, - "api": { - "lvl0": { - "selector": "", - "global": true, - "default_value": "api" - }, - "lvl1": "article h1", - "lvl2": "article h2", - "lvl3": "article h3", - "lvl4": "article h4", - "lvl5": "article h5, article td:first-child", - "lvl6": "article h6", - "text": "article p, article li, article td:last-child" - }, - "operators": { - "lvl0": { - "selector": "", - "global": true, - "default_value": "operators" - }, - "lvl1": "article h1", - "lvl2": "article h2", - "lvl3": "article h3", - "lvl4": "article h4", - "lvl5": "article h5, article td:first-child", - "lvl6": "article h6", - "text": "article p, article li, article td:last-child" - }, - "developers": { - "lvl0": { - "selector": "", - "global": true, - "default_value": "developers" - }, - "lvl1": "article h1", - "lvl2": "article h2", - "lvl3": "article h3", - "lvl4": "article h4", - "lvl5": "article h5, article td:first-child", - "lvl6": "article h6", - "text": "article p, article li, article td:last-child" - } - }, - "strip_chars": " .,;:#", - "custom_settings": { - "separatorsToIndex": "_", - "attributesForFaceting": [ - "language", - "version", - "type", - "docusaurus_tag" - ], - "attributesToRetrieve": [ - "hierarchy", - "content", - "anchor", - "url", - "url_without_anchor", - "type" - ] - }, - "nb_hits": 2227 -} diff --git a/docsearch.config.json b/docsearch.config.json deleted file mode 100644 index 47a8a3d1..00000000 --- a/docsearch.config.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "index_name": "doc_babylonlabs_io", - "start_urls": [ - { - "url": "https://docs.babylonlabs.io/guides/", - "tags": "guides", - "selectors_key": "guides" - }, - { - "url": "https://docs.babylonlabs.io/api/", - "tags": "api", - "selectors_key": "api" - }, - { - "url": "https://docs.babylonlabs.io/operators/", - "tags": "operators", - "selectors_key": "operators" - }, - { - "url": "https://docs.babylonlabs.io/developers/", - "tags": "developers", - "selectors_key": "developers" - } - ], - "stop_urls": [], - "selectors": { - "guides": { - "lvl0": { - "selector": "", - "global": true, - "default_value": "Guides" - }, - "lvl1": "article h1", - "lvl2": "article h2", - "lvl3": "article h3", - "lvl4": "article h4", - "lvl5": "article h5, article td:first-child", - "lvl6": "article h6", - "text": "article p, article li, article td:last-child" - }, - "api": { - "lvl0": { - "selector": "", - "global": true, - "default_value": "api" - }, - "lvl1": "article h1", - "lvl2": "article h2", - "lvl3": "article h3", - "lvl4": "article h4", - "lvl5": "article h5, article td:first-child", - "lvl6": "article h6", - "text": "article p, article li, article td:last-child" - }, - "operators": { - "lvl0": { - "selector": "", - "global": true, - "default_value": "operators" - }, - "lvl1": "article h1", - "lvl2": "article h2", - "lvl3": "article h3", - "lvl4": "article h4", - "lvl5": "article h5, article td:first-child", - "lvl6": "article h6", - "text": "article p, article li, article td:last-child" - }, - "developers": { - "lvl0": { - "selector": "", - "global": true, - "default_value": "developers" - }, - "lvl1": "article h1", - "lvl2": "article h2", - "lvl3": "article h3", - "lvl4": "article h4", - "lvl5": "article h5, article td:first-child", - "lvl6": "article h6", - "text": "article p, article li, article td:last-child" - } - }, - "strip_chars": " .,;:#", - "custom_settings": { - "separatorsToIndex": "_", - "attributesForFaceting": [ - "language", - "version", - "type", - "docusaurus_tag" - ], - "attributesToRetrieve": [ - "hierarchy", - "content", - "anchor", - "url", - "url_without_anchor", - "type" - ] - }, - "nb_hits": 2227 -} From 97e919c4f0530fc463dccb55b6f86b74ca3b1acd Mon Sep 17 00:00:00 2001 From: liukangtian Date: Fri, 28 Mar 2025 20:41:51 +0800 Subject: [PATCH 11/14] fix: Card style disorder --- src/css/custom.css | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/src/css/custom.css b/src/css/custom.css index 0e1b5d6a..f319773c 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -733,7 +733,7 @@ html[data-theme='dark'] .dropdown > .navbar__link:after { padding: 0.5rem; border-color: rgb(var(--docs-color-secondary-700)); } - + /* Label styling */ .babylon-dropdown label { font-size: 0.875rem; @@ -741,7 +741,7 @@ html[data-theme='dark'] .dropdown > .navbar__link:after { color: rgb(var(--docs-color-text-1000)); margin-right: 0.5rem; } - + /* Select styling */ .babylon-dropdown select { appearance: none; @@ -753,44 +753,44 @@ html[data-theme='dark'] .dropdown > .navbar__link:after { border-radius: 0.375rem; cursor: pointer; min-width: 120px; - + /* Custom dropdown arrow updated with primary color */ background-image: url("data:image/svg+xml,%3Csvg width='24' height='24' fill='none' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4.293 8.293a1 1 0 0 1 1.414 0L12 14.586l6.293-6.293a1 1 0 1 1 1.414 1.414l-7 7a1 1 0 0 1-1.414 0l-7-7a1 1 0 0 1 0-1.414Z' fill='rgb(206, 101, 51)'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 0.5rem center; background-size: 1.25rem; } - + /* Option styling */ .babylon-dropdown select option { color: rgb(var(--docs-color-text-800)); padding: 0.5rem; } - + /* Hover states */ .babylon-dropdown select:hover { border-color: rgb(var(--docs-color-primary-400)); } - + .babylon-dropdown select:focus { outline: none; border-color: rgb(var(--docs-color-primary-400)); box-shadow: 0 0 0 2px rgba(var(--docs-color-primary-100), 0.2); } - + /* Dark mode adjustments */ [data-theme='dark'] .babylon-dropdown label { color: rgb(var(--docs-color-text-100)); } - + [data-theme='dark'] .babylon-dropdown select { color: rgb(var(--docs-color-secondary-100)); } - + [data-theme='dark'] .babylon-dropdown select option { color: rgb(var(--docs-color-secondary-400)); } - + [data-dropdown-sdks] { display: none; @@ -1509,9 +1509,6 @@ h2.anchor > code { overflow: scroll; border-radius: 36px; } - .row { - @apply relative h-full; - } .simulator { -ms-overflow-style: none; /* Internet Explorer 10+ */ From 03f0556b365cae8aee2654fcb16d58127c390f8b Mon Sep 17 00:00:00 2001 From: liukangtian Date: Sat, 29 Mar 2025 20:13:28 +0800 Subject: [PATCH 12/14] fix: move the backend to developer part --- .../staking_backend/_category_.json | 7 +++++++ .../staking_backend/services/_category_.json | 0 .../services/global_config.mdx | 0 .../services/staking_api_service.mdx | 0 .../services/staking_expiry_checker.mdx | 0 .../services/staking_indexer.mdx | 0 .../staking_backend/staking_backend.mdx | 0 .../wallet_integration/_category_.json | 2 +- .../extension_wallets.mdx | 8 +++---- .../hardware_wallets.mdx | 6 +++--- .../mobile_app_wallets.mdx | 8 +++---- docs/developers/wallet_setup/_category_.json | 2 +- .../phase-1/mainnet/staking_backend.mdx | 21 ------------------- .../phase-1/testnet/staking_backend.mdx | 21 ------------------- .../testnet/staking_backend/_category_.json | 7 ------- 15 files changed, 20 insertions(+), 62 deletions(-) create mode 100644 docs/developers/staking_backend/_category_.json rename docs/{guides/networks/phase-2/testnet => developers}/staking_backend/services/_category_.json (100%) rename docs/{guides/networks/phase-2/testnet => developers}/staking_backend/services/global_config.mdx (100%) rename docs/{guides/networks/phase-2/testnet => developers}/staking_backend/services/staking_api_service.mdx (100%) rename docs/{guides/networks/phase-2/testnet => developers}/staking_backend/services/staking_expiry_checker.mdx (100%) rename docs/{guides/networks/phase-2/testnet => developers}/staking_backend/services/staking_indexer.mdx (100%) rename docs/{guides/networks/phase-2/testnet => developers}/staking_backend/staking_backend.mdx (100%) delete mode 100644 docs/guides/networks/phase-1/mainnet/staking_backend.mdx delete mode 100644 docs/guides/networks/phase-1/testnet/staking_backend.mdx delete mode 100644 docs/guides/networks/phase-2/testnet/staking_backend/_category_.json diff --git a/docs/developers/staking_backend/_category_.json b/docs/developers/staking_backend/_category_.json new file mode 100644 index 00000000..5c85b955 --- /dev/null +++ b/docs/developers/staking_backend/_category_.json @@ -0,0 +1,7 @@ +{ + "position": 6, + "label": "Staking Backend", + "collapsible": true, + "collapsed": true, + "className": "staking_backend_sidebar" +} diff --git a/docs/guides/networks/phase-2/testnet/staking_backend/services/_category_.json b/docs/developers/staking_backend/services/_category_.json similarity index 100% rename from docs/guides/networks/phase-2/testnet/staking_backend/services/_category_.json rename to docs/developers/staking_backend/services/_category_.json diff --git a/docs/guides/networks/phase-2/testnet/staking_backend/services/global_config.mdx b/docs/developers/staking_backend/services/global_config.mdx similarity index 100% rename from docs/guides/networks/phase-2/testnet/staking_backend/services/global_config.mdx rename to docs/developers/staking_backend/services/global_config.mdx diff --git a/docs/guides/networks/phase-2/testnet/staking_backend/services/staking_api_service.mdx b/docs/developers/staking_backend/services/staking_api_service.mdx similarity index 100% rename from docs/guides/networks/phase-2/testnet/staking_backend/services/staking_api_service.mdx rename to docs/developers/staking_backend/services/staking_api_service.mdx diff --git a/docs/guides/networks/phase-2/testnet/staking_backend/services/staking_expiry_checker.mdx b/docs/developers/staking_backend/services/staking_expiry_checker.mdx similarity index 100% rename from docs/guides/networks/phase-2/testnet/staking_backend/services/staking_expiry_checker.mdx rename to docs/developers/staking_backend/services/staking_expiry_checker.mdx diff --git a/docs/guides/networks/phase-2/testnet/staking_backend/services/staking_indexer.mdx b/docs/developers/staking_backend/services/staking_indexer.mdx similarity index 100% rename from docs/guides/networks/phase-2/testnet/staking_backend/services/staking_indexer.mdx rename to docs/developers/staking_backend/services/staking_indexer.mdx diff --git a/docs/guides/networks/phase-2/testnet/staking_backend/staking_backend.mdx b/docs/developers/staking_backend/staking_backend.mdx similarity index 100% rename from docs/guides/networks/phase-2/testnet/staking_backend/staking_backend.mdx rename to docs/developers/staking_backend/staking_backend.mdx diff --git a/docs/developers/wallet_integration/_category_.json b/docs/developers/wallet_integration/_category_.json index 8ade9148..5ce0bcc6 100644 --- a/docs/developers/wallet_integration/_category_.json +++ b/docs/developers/wallet_integration/_category_.json @@ -3,4 +3,4 @@ "label": "Wallet Integration", "collapsible": true, "collapsed": false -} \ No newline at end of file +} diff --git a/docs/developers/wallet_integration/bitcoin_wallet_integration/extension_wallets.mdx b/docs/developers/wallet_integration/bitcoin_wallet_integration/extension_wallets.mdx index 38ee3c68..e57e0acc 100644 --- a/docs/developers/wallet_integration/bitcoin_wallet_integration/extension_wallets.mdx +++ b/docs/developers/wallet_integration/bitcoin_wallet_integration/extension_wallets.mdx @@ -5,8 +5,8 @@ sidebar_position: 2 # Bitcoin Staking for Extension Wallets -This guide outlines the various approaches for integrating Babylon bitcoin staking -functionality into browser extension wallets. +This guide outlines the various approaches for integrating Babylon bitcoin staking +functionality into browser extension wallets. ## Option 1 @@ -40,7 +40,7 @@ staking information from a backend you operate. on the flow of bitcoin staking transaction creation and submission in conjunction with Bitcoin and Babylon Genesis blockchains. * For information about the reference Babylon staking backend, please read this - [document](/guides/networks/phase-2/testnet/staking_backend/). + [document](/developers/staking_backend/). ## Option 3 @@ -60,4 +60,4 @@ which connects to either third party APIs conjunction with Bitcoin and Babylon Genesis blockchains. * For information about the reference babylon staking backend, please read this - [document](/guides/networks/phase-2/testnet/staking_backend/). \ No newline at end of file + [document](/developers/staking_backend/). diff --git a/docs/developers/wallet_integration/bitcoin_wallet_integration/hardware_wallets.mdx b/docs/developers/wallet_integration/bitcoin_wallet_integration/hardware_wallets.mdx index fb4ca394..edb7cde7 100644 --- a/docs/developers/wallet_integration/bitcoin_wallet_integration/hardware_wallets.mdx +++ b/docs/developers/wallet_integration/bitcoin_wallet_integration/hardware_wallets.mdx @@ -6,7 +6,7 @@ sidebar_position: 4 # Hardware Wallets -This guide outlines the various approaches for integrating Babylon bitcoin staking +This guide outlines the various approaches for integrating Babylon bitcoin staking functionality into hardware wallets. ## Option 1 @@ -27,9 +27,9 @@ which connects to either third party APIs conjunction with Bitcoin and Babylon Genesis blockchains. * For information about the reference Babylon staking backend, please read this - [document](/guides/networks/phase-2/testnet/staking_backend/). + [document](/developers/staking_backend/). ## Option 2 Integrate via a compatible software wallet (extension or mobile) -that is bitcoin staking enabled. \ No newline at end of file +that is bitcoin staking enabled. diff --git a/docs/developers/wallet_integration/bitcoin_wallet_integration/mobile_app_wallets.mdx b/docs/developers/wallet_integration/bitcoin_wallet_integration/mobile_app_wallets.mdx index ca882460..9e818241 100644 --- a/docs/developers/wallet_integration/bitcoin_wallet_integration/mobile_app_wallets.mdx +++ b/docs/developers/wallet_integration/bitcoin_wallet_integration/mobile_app_wallets.mdx @@ -5,8 +5,8 @@ sidebar_position: 3 # Bitcoin Staking for Mobile App Wallets -This guide outlines the various options for integrating Babylon bitcoin staking -functionality into mobile app wallets. +This guide outlines the various options for integrating Babylon bitcoin staking +functionality into mobile app wallets. ## Option 1 @@ -36,7 +36,7 @@ operate. Then embed your own Bitcoin staking website to your mobile app wallet. on the flow of bitcoin Staking transaction creation and submission in conjunction with Bitcoin and Babylon blockchains. * For information about the reference Babylon staking backend, please read this - [document](/guides/networks/phase-2/testnet/staking_backend/). + [document](/developers/staking_backend/). ## Option 3 @@ -56,4 +56,4 @@ Develop bitcoin staking as a feature of your mobile wallet, on the flow of bitcoin staking transaction creation and submission in conjunction with Bitcoin and Babylon blockchains. * For information about the reference Babylon staking backend, please read this - [document](/guides/networks/phase-2/testnet/staking_backend/). \ No newline at end of file + [document](/developers/staking_backend/). diff --git a/docs/developers/wallet_setup/_category_.json b/docs/developers/wallet_setup/_category_.json index d14bb2f4..f27a844a 100644 --- a/docs/developers/wallet_setup/_category_.json +++ b/docs/developers/wallet_setup/_category_.json @@ -4,4 +4,4 @@ "collapsible": true, "collapsed": true, "className": "developers_sidebar_header" -} \ No newline at end of file +} diff --git a/docs/guides/networks/phase-1/mainnet/staking_backend.mdx b/docs/guides/networks/phase-1/mainnet/staking_backend.mdx deleted file mode 100644 index 3e12de2f..00000000 --- a/docs/guides/networks/phase-1/mainnet/staking_backend.mdx +++ /dev/null @@ -1,21 +0,0 @@ ---- -sidebar_class_name: staking_backend_sidebar -sidebar_label: Staking Backend -sidebar_position: 3 ---- - -# Staking Backend - -Staking backend architecture and implementation details for Babylon Phase 1 Mainnet. - -import RemoteMD from '@site/src/components/RemoteMD'; - -export const rawUrl="https://raw.githubusercontent.com/babylonlabs-io/networks/refs/heads/main/bbn-1/integration/staking-backend.md"; - - diff --git a/docs/guides/networks/phase-1/testnet/staking_backend.mdx b/docs/guides/networks/phase-1/testnet/staking_backend.mdx deleted file mode 100644 index 15f60a9d..00000000 --- a/docs/guides/networks/phase-1/testnet/staking_backend.mdx +++ /dev/null @@ -1,21 +0,0 @@ ---- -sidebar_class_name: staking_backend_sidebar -sidebar_label: Staking Backend -sidebar_position: 3 ---- - -# Staking Backend - -Staking backend architecture and implementation details for Babylon Phase 1 Testnet. - -import RemoteMD from '@site/src/components/RemoteMD'; - -export const rawUrl="https://raw.githubusercontent.com/babylonchain/networks/refs/heads/main/bbn-test-4/integration/staking-backend.md"; - - diff --git a/docs/guides/networks/phase-2/testnet/staking_backend/_category_.json b/docs/guides/networks/phase-2/testnet/staking_backend/_category_.json deleted file mode 100644 index 4ddfd1e0..00000000 --- a/docs/guides/networks/phase-2/testnet/staking_backend/_category_.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "position": 1, - "label": "Staking Backend", - "collapsible": true, - "collapsed": true, - "className": "staking_backend_sidebar" -} \ No newline at end of file From 8a4dbc83c12cfe6cce27b961af1ab83e4b00bd67 Mon Sep 17 00:00:00 2001 From: Kevin <33023258+kkkk666@users.noreply.github.com> Date: Sun, 30 Mar 2025 10:15:50 +0800 Subject: [PATCH 13/14] chore: del useless code & optimization build warning (#70) Co-authored-by: liukangtian --- docs/index.mdx | 9 - src/css/custom.css | 60 ------- src/icons/index.tsx | 397 -------------------------------------------- src/sections.ts | 148 ----------------- 4 files changed, 614 deletions(-) delete mode 100644 docs/index.mdx delete mode 100644 src/sections.ts diff --git a/docs/index.mdx b/docs/index.mdx deleted file mode 100644 index 4b2d3247..00000000 --- a/docs/index.mdx +++ /dev/null @@ -1,9 +0,0 @@ ---- -id: guides -title: Guides -slug: / ---- - -# Welcome to the Guides Section - -This is the main page for all guides. diff --git a/src/css/custom.css b/src/css/custom.css index f319773c..31c1f1a9 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -1474,66 +1474,6 @@ h2.anchor > code { @apply pl-4; } -.interactive-onboarding header { - display: none; -} -.interactive-onboarding .row > .col { - max-width: unset !important; -} - -.interactive-onboarding div.container { - max-width: unset !important; - margin: 0; - padding: 0 !important; -} -.interactive-onboarding footer { - display: none; -} - -.interactive-onboarding .pagination-nav { - display: none; -} - -.interactive-onboarding { - .theme-doc-markdown { - margin-top: 0px; - } - .theme-doc-breadcrumbs { - display: none; - } - .simulator { - width: 250px; - height: 450px; - margin: auto; - @apply border-[10px] border-text-400; - overflow: scroll; - border-radius: 36px; - } - - .simulator { - -ms-overflow-style: none; /* Internet Explorer 10+ */ - scrollbar-width: none; /* Firefox */ - } - .simulator::-webkit-scrollbar { - display: none; /* Safari and Chrome */ - } - - .simulator .book-now { - @apply inline-flex h-9 items-center justify-center whitespace-nowrap rounded-md px-3 text-sm font-medium text-white transition-colors hover:bg-blue-500 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:bg-gray-400; - } - - .btn { - @apply rounded-md bg-blue-600 p-1.5 text-xs text-white; - &:hover { - @apply cursor-pointer bg-blue-500; - } - } - .large-phone .simulator { - width: 300px; - height: 550px; - } -} - h2.anchor, h3.anchor { text-wrap: nowrap; diff --git a/src/icons/index.tsx b/src/icons/index.tsx index 6000bc85..988dc0fa 100644 --- a/src/icons/index.tsx +++ b/src/icons/index.tsx @@ -1,102 +1,5 @@ import React, { ComponentProps } from 'react'; -export function AndroidIcon(props: ComponentProps<'svg'>) { - return ( - - ); -} - -export function AngularIcon(props: ComponentProps<'svg'>) { - return ( - - - - - - - - - - - - - - ); -} - -export function AppleIcon(props: ComponentProps<'svg'>) { - return ( - - ); -} - -export function APIIcon(props: ComponentProps<'svg'>) { - return ( - - - - - - - - - - - - - - - ); -} - export function DiscordIcon(props: ComponentProps<'svg'>) { return ( ) { ); } -export function ElectronIcon(props: ComponentProps<'svg'>) { - return ( - - - - - - - ); -} - -export function FlutterIcon(props: ComponentProps<'svg'>) { - return ( - - ); -} - -export function HTMLIcon(props: ComponentProps<'svg'>) { - return ( - - - - - - - - - - - - - - - - ); -} - -export function JSIcon(props: ComponentProps<'svg'>) { - return ( - - - - - - - - - - - - - - - - - - - - - - - - ); -} - -export function KotlinIcon(props: ComponentProps<'svg'>) { - return ( - - - - - - - - - - - - - - - - ); -} - -export function ReactIcon(props: ComponentProps<'svg'>) { - return ( - - ); -} - -export function ImmunefiIcon(props: ComponentProps<'svg'>) { - return ( - - ); -} - - -export function SwiftIcon(props: ComponentProps<'svg'>) { - return ( - - - - - - - - - - - - - - - - - - - - - ); -} - export function XIcon(props: ComponentProps<'svg'>) { return ( diff --git a/src/sections.ts b/src/sections.ts deleted file mode 100644 index 1758b873..00000000 --- a/src/sections.ts +++ /dev/null @@ -1,148 +0,0 @@ -import type { ComponentProps, ReactNode } from 'react'; -import { - ReactIcon, - AngularIcon, - AndroidIcon, - AppleIcon, - FlutterIcon, - HTMLIcon, - JSIcon, -} from './icons'; - -export type Section = { docId: string } & ( - | { - section: false; - } - | { - section: string; - icon: (props: ComponentProps<'svg'>) => ReactNode; - name: string; - } -); - -const SECTIONS: Section[] = [ - { - name: 'React', - docId: 'react', - icon: ReactIcon, - section: 'web-prebuilt', - }, - { - name: 'JavaScript', - docId: 'javascript', - icon: JSIcon, - section: 'web-prebuilt', - }, - - // Plugin SDKs - // - web - { - name: 'Javascript', - docId: 'plugin-sdk', - icon: JSIcon, - section: 'plugin-sdk', - }, - - // Web SDKs - // - web-ui-kit - { - name: 'Web Components', - docId: 'ui-kit', - icon: HTMLIcon, - section: 'web-ui-kit', - }, - { - name: 'React UI Kit', - docId: 'react-ui-kit', - icon: ReactIcon, - section: 'web-ui-kit', - }, - { - name: 'Angular UI Kit', - docId: 'angular-ui-kit', - icon: AngularIcon, - section: 'web-ui-kit', - }, - - // - web-core-sdk - { - name: 'JavaScript', - docId: 'web-core', - icon: JSIcon, - section: 'web-core-sdk', - }, - { - name: 'React', - docId: 'react-web-core', - icon: ReactIcon, - section: 'web-core-sdk', - }, - // Mobile SDKs - { - name: 'Android Core', - docId: 'android-core', - icon: AndroidIcon, - section: 'mobile-core', - }, - { - name: 'iOS Core', - docId: 'ios-core', - icon: AppleIcon, - section: 'mobile-core', - }, - { - name: 'Flutter Core', - docId: 'flutter-core', - icon: FlutterIcon, - section: 'mobile-core', - }, - { - name: 'React Native Core', - docId: 'rn-core', - icon: ReactIcon, - section: 'mobile-core', - }, - { - name: 'Android', - docId: 'android', - icon: AndroidIcon, - section: 'mobile-ui-kit', - }, - { - name: 'iOS', - docId: 'ios', - icon: AppleIcon, - section: 'mobile-ui-kit', - }, - { - name: 'Flutter', - docId: 'flutter', - icon: FlutterIcon, - section: 'mobile-ui-kit', - }, - { - name: 'React Native', - docId: 'react-native', - icon: ReactIcon, - section: 'mobile-ui-kit', - }, -]; - -export type SectionsGroup = { - name: string; - section: string; - description?: string; - className?: string; -}; - -const SECTION_GROUPS: SectionsGroup[][] = [ - [ - { - name: 'UI Kit', - section: 'web-prebuilt', - className: 'deprecated-badge', - }, - ], -]; - -export { SECTIONS, SECTION_GROUPS }; From 7b0bc3ee1549381284f7fe32752080d4f219077c Mon Sep 17 00:00:00 2001 From: Jenks Date: Sun, 30 Mar 2025 10:25:10 +0800 Subject: [PATCH 14/14] moved Staking Backend sidebar position up --- docs/developers/staking_backend/_category_.json | 2 +- docs/developers/wallet_setup/_category_.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/developers/staking_backend/_category_.json b/docs/developers/staking_backend/_category_.json index 5c85b955..412ff8e1 100644 --- a/docs/developers/staking_backend/_category_.json +++ b/docs/developers/staking_backend/_category_.json @@ -1,5 +1,5 @@ { - "position": 6, + "position": 4, "label": "Staking Backend", "collapsible": true, "collapsed": true, diff --git a/docs/developers/wallet_setup/_category_.json b/docs/developers/wallet_setup/_category_.json index f27a844a..8ef3cc29 100644 --- a/docs/developers/wallet_setup/_category_.json +++ b/docs/developers/wallet_setup/_category_.json @@ -1,5 +1,5 @@ { - "position": 4, + "position": 6, "label": "Wallet Setup", "collapsible": true, "collapsed": true,