From 5aac8768c84bcb089801b6f578ed80ac34bd8d5d Mon Sep 17 00:00:00 2001 From: ronny-mysten <118224482+ronny-mysten@users.noreply.github.com> Date: Tue, 24 Sep 2024 17:14:44 -0600 Subject: [PATCH] [docs] trustless swap updates (#19409) ## Description Original PR melted on rebase. ## Test plan How did you test the new or updated feature? --- ## Release notes Check each box that your changes affect. If none of the boxes relate to your changes, release notes aren't required. For each box you select, include information after the relevant heading that describes the impact of your changes that a user might notice and any actions they must take to implement updates. - [ ] Protocol: - [ ] Nodes (Validators and Full nodes): - [ ] Indexer: - [ ] JSON-RPC: - [ ] GraphQL: - [ ] CLI: - [ ] Rust SDK: - [ ] REST API: --------- Co-authored-by: Ashok Menon --- docs/content/concepts/object-model.mdx | 2 +- .../packages/custom-policies.mdx | 16 +- .../developer/app-examples/images/styles.png | Bin 0 -> 11641 bytes .../images/trustless-accept-escrow.png | Bin 0 -> 72945 bytes .../images/trustless-cancel-escrow.png | Bin 0 -> 60283 bytes .../images/trustless-escrow-locked.png | Bin 0 -> 43815 bytes .../images/trustless-lock-bear.png | Bin 0 -> 23708 bytes .../images/trustless-my-locked.png | Bin 0 -> 26789 bytes .../images/trustless-new-bear.png | Bin 0 -> 37565 bytes .../app-examples/images/trustless-objects.png | Bin 0 -> 80159 bytes .../images/trustless-start-escrow.png | Bin 0 -> 47171 bytes .../images/trustless-unlock-bear.png | Bin 0 -> 28848 bytes .../developer/app-examples/tic-tac-toe.mdx | 19 +- .../developer/app-examples/trusted-swap.mdx | 6 - .../developer/app-examples/trustless-swap.mdx | 2078 ++++++++++++++++- .../app-examples/trustless-swap/backend.mdx | 163 -- .../app-examples/trustless-swap/frontend.mdx | 817 ------- .../trustless-swap/indexer-api.mdx | 632 ----- .../guides/developer/coin/in-game-token.mdx | 4 +- .../content/guides/developer/coin/loyalty.mdx | 2 +- .../guides/developer/first-app/build-test.mdx | 2 +- docs/content/guides/developer/nft.mdx | 2 +- .../developer/nft/asset-tokenization.mdx | 2 +- .../guides/developer/sui-101/shared-owned.mdx | 4 +- .../references/contribute/mdx-components.mdx | 66 +- docs/content/sidebars/guides.js | 14 +- docs/content/standards/deepbookv3-sdk.mdx | 2 +- docs/site/docusaurus.config.js | 18 +- docs/site/src/components/EffortBox/index.tsx | 45 + docs/site/src/css/custom.css | 31 + docs/site/src/plugins/effort/index.js | 29 + .../src/plugins/inject-code/injectLoader.js | 245 +- docs/site/src/plugins/inject-code/utils.js | 39 +- docs/site/src/theme/Admonition/Types.js | 30 + .../src/theme/CodeBlock/Content/String.js | 124 + .../theme/CodeBlock/Content/styles.module.css | 80 + docs/site/src/theme/MDXComponents/Details.js | 59 + docs/site/src/theme/MDXContent/index.js | 2 + .../trading/api/helpers/create-demo-data.ts | 4 +- .../api/helpers/create-demo-escrows.ts | 4 +- .../contracts/escrow/sources/lock.move | 2 +- .../contracts/escrow/sources/shared.move | 13 + .../src/components/escrows/Escrow.tsx | 3 +- .../src/components/escrows/EscrowList.tsx | 12 +- .../src/components/locked/ApiLockedList.tsx | 23 +- .../components/locked/LockOwnedObjects.tsx | 3 +- .../src/components/locked/partials/Locked.tsx | 2 +- .../src/hooks/useTransactionExecution.ts | 2 +- .../trading/frontend/src/mutations/escrow.ts | 103 +- .../trading/frontend/src/mutations/locked.ts | 4 + .../trading/frontend/src/networkConfig.ts | 19 + .../frontend/src/routes/EscrowDashboard.tsx | 1 - .../frontend/src/routes/LockedDashboard.tsx | 2 +- 53 files changed, 2955 insertions(+), 1775 deletions(-) create mode 100644 docs/content/guides/developer/app-examples/images/styles.png create mode 100644 docs/content/guides/developer/app-examples/images/trustless-accept-escrow.png create mode 100644 docs/content/guides/developer/app-examples/images/trustless-cancel-escrow.png create mode 100644 docs/content/guides/developer/app-examples/images/trustless-escrow-locked.png create mode 100644 docs/content/guides/developer/app-examples/images/trustless-lock-bear.png create mode 100644 docs/content/guides/developer/app-examples/images/trustless-my-locked.png create mode 100644 docs/content/guides/developer/app-examples/images/trustless-new-bear.png create mode 100644 docs/content/guides/developer/app-examples/images/trustless-objects.png create mode 100644 docs/content/guides/developer/app-examples/images/trustless-start-escrow.png create mode 100644 docs/content/guides/developer/app-examples/images/trustless-unlock-bear.png delete mode 100644 docs/content/guides/developer/app-examples/trusted-swap.mdx delete mode 100644 docs/content/guides/developer/app-examples/trustless-swap/backend.mdx delete mode 100644 docs/content/guides/developer/app-examples/trustless-swap/frontend.mdx delete mode 100644 docs/content/guides/developer/app-examples/trustless-swap/indexer-api.mdx create mode 100644 docs/site/src/components/EffortBox/index.tsx create mode 100644 docs/site/src/plugins/effort/index.js create mode 100644 docs/site/src/theme/Admonition/Types.js create mode 100644 docs/site/src/theme/CodeBlock/Content/String.js create mode 100644 docs/site/src/theme/CodeBlock/Content/styles.module.css create mode 100644 docs/site/src/theme/MDXComponents/Details.js create mode 100644 examples/trading/frontend/src/networkConfig.ts diff --git a/docs/content/concepts/object-model.mdx b/docs/content/concepts/object-model.mdx index 4b3b242a9e785..12a8eb0d41f51 100644 --- a/docs/content/concepts/object-model.mdx +++ b/docs/content/concepts/object-model.mdx @@ -52,7 +52,7 @@ The `ProtocolConfig` struct in the [`sui-protocol-config` crate](https://github.
-Toggle source code +`lib.rs` {@inject: crates/sui-protocol-config/src/lib.rs#struct=ProtocolConfig}
diff --git a/docs/content/concepts/sui-move-concepts/packages/custom-policies.mdx b/docs/content/concepts/sui-move-concepts/packages/custom-policies.mdx index dd646ace1b1f7..dcafaf20636db 100644 --- a/docs/content/concepts/sui-move-concepts/packages/custom-policies.mdx +++ b/docs/content/concepts/sui-move-concepts/packages/custom-policies.mdx @@ -338,7 +338,7 @@ sui client publish --gas-budget 100000000
- Toggle output + Console output A successful publish returns the following: @@ -436,7 +436,7 @@ sui client call --gas-budget 10000000 \
- Toggle output + Console output A successful call returns the following: @@ -637,11 +637,9 @@ console.log(result);
- Toggle complete script + `publish.js` -The complete `publish.js` script follows: - ```js import { execSync } from 'child_process'; import { readFileSync } from 'fs'; @@ -720,7 +718,7 @@ node publish.js
- Toggle output + Console output If the script is successful, the console prints the following response: @@ -803,7 +801,7 @@ sui client call --gas-budget 10000000 \
- Toggle output + Console output A successful call responds with the following: @@ -967,7 +965,7 @@ node upgrade.js
- Toggle output + Console output If the script is successful (and today is Tuesday), your console displays the following response: @@ -1046,7 +1044,7 @@ sui client call --gas-budget 10000000 \
- Toggle output + Console output If successful, the console prints the following response: diff --git a/docs/content/guides/developer/app-examples/images/styles.png b/docs/content/guides/developer/app-examples/images/styles.png new file mode 100644 index 0000000000000000000000000000000000000000..6ae76a56b8beb58874044987077e9d633cac0e91 GIT binary patch literal 11641 zcmeHtWmp`+vNrCrxWg_MAh-l~3GVI$3lMy9cSvw|3&Ab8d+^}y?iw`cw>kIRdrr>% z_x-;6^z775mrPe}&s0~x5z311(NTy|prD}8Wuzrkp`c(DAhb9V0_0m{^Q;>R3R=%f zTwGa3TpXzEWN%^h$s7ubF3!~0cuSg*ZqUTU*m&^gTY3~HH`Va)NL6FM?yhd&SQkcc zTg1>0_-JToArTrhR$@Hw*8VP}e3s+DQR_Ls6-VK{kOJ(-pz1=kz2?*-6(}uPYe)9j z7uY_8A$Um|G_*)Q5mylp8R&2WShFv<&}8stN>JaYK_@goSM1<+*m7FxL83t+STj^= zOX@1q#Z8D;~h2Q|*fFjYTo@V&7q-<~U$GfLfG7LlF4{gJOAo zAs&tg^K8C5)YX;v1t5oHY`ky@y(1W$%D`Ig9?ii@8qOrmC>tEcu+5#k#c4`~l;On> z3wvDm`YIg8!CGy@&id5;^7?vy`uh56(BIYNjaqz10(BVq!B0~w(gfmdO>=D-3k3xz z1_+G=1s!Gu1qY#^AqO$!fCMH!6bcb?#)cdcxiJ6T3#*U|``K1qH5MkT^p>eAkSxNZ_8|AX8*yQ+1=LRj|h~2J0FC!H3ypj-EBYF zIrF&-QvQR34?_RB%t8tL2MgFnkWyPg87OY=WDb1C%*xD4DTD$90tKAREcjFY@)e;NEYLG6DD@^EtfyX3$1{HLUbv$>PF zy)DEdSmh}|g}7M=MS$ghLMDV_8o^iu1x24MBO$8p z4t<&hpNczxAHssIABY&g0U(8e(-8}7ZRLjxgX&&oYJv|Faj!>KzyJ{>WlngQu#Eq- z>7Red^ori*{ae*;y~DKKu+80M_TxSnM{j+pA&L zW=?iM(O~VK+RN281qq9??b7$vC2ZQ#H|_}@RWD43$FFi{G|oUVTYv`s3vTV4{Zh52 zkX+i-!%G7JF}E#qtLy2lR+Ms{m`o%g8?|9u(=U%gdDT2`UYTUZl1?Xm(Z2?Fjv7!6 z(wRIDi-|SqeUIQiEX5x%Gk}c%J(D?E+J-wyb?54o)d%qcmO)F0r@P^^j0_!i6 z>jO=L^^g#+yEFK~-+L8$zecJ$hZ|1$;nr$C;|-7a`}$CS=nFp=o7F-5%k}P5Fd&BX zCEsOTZ>JrH(v4~?D)S>^5&Ih@E$^Gz-Z{J>SDkVC)f zd0jUL!ad)HLoPqp7SUd8wJ`Ea(!21SXHrO?sp)qMsoV=f#58*ifUU6{7fO3)S}5Ro zEnOw-d6Iff!K3Zzdj3#pgmL`-FW)J`iRp8u)n+KSzgusZS}V%MR^aI$)z_}ZtzB@)+}zV-7~e+My1-MmzLM%p-#WaK?R#u zmd;A8DEaC4)i8lht?up#>VQ&atU|`Skv%5iW9P5>R~8B!#3d5)(P77=4O(P}!W=s40l|6VkAzQjPTCk*o( ztnck{e-U@GR;!2FA?S5iaxpj&FR1r!DESn1C{B>17xfuy8wDE}a2L>J>pDL0>XwBkx8>-pGIF~73_;3_r+zvMyo1t8#8ub_)j#Flbvqd>KWT-`oS;=X_ zWAROnTZ8eEsMOy}zp%}(A0Ew?v47b4SgWI$BSd90Uy-8mHf8AL8L_};VC;kMTO`Hs zvQt@o#Vi38q5BP3n@)bWGwG0FjhmM_*?RwVOf78YBxmnP@oSgFv@4es-rdp8P`pfs zw?`1#(C;gPo%veJZ_3>;qOS7f;c#N{UEkzV!0%!D^QR4!HX!q)#^=$sL^&_;EOM>h zCZ$6uh1uZYhQD(c8mk*-`)& zCJj<>Qb$?&>V&fWe8<4+`=zV>@o#!}*}otUBjW?Ba=p&H z1mhmhldv5krcPVaq#qBtH3CL{yWnE+FbutQwz(3w^_RK3Cdcj1F-nRNxb*RcZrghb zCHnO({t5icWpL;MN}-+fL9tzxtDdq|Yd$yjyDdJ`drZS$?i1)MLq60K*Jr`u2w13m zm8u^m<@J=eo+&pCA<-pi`t$!C!w%0C7{2IhZO!>Qb$}F<^7uLl3`W2prlgO5lR}^1 zt4t;{^3Cbn=bGL9im7r*xnthF!}=5k9kIDeL!yE}_meIdBh28W%tateQ`n{hsGFPEj zaoTjN-|Qsw1)r(hMVs*5r&P1??B{yhp@cU|M>UufLNkw5dX0*O3K@Ig@~)0tW}CTk z+}QmCAAmg2=kRWQmO_R$jmx>^WW84I;r6V=&%gQVnY@y#R4V~z0Ar+O zw!_Kcl{|uoBa}I)@rLA`?g%UbhLiP2ZtDe++p{ImqwBdk2#mhF(!5??^J)RDb21_B zc{?g&uzr0wr4#o1`IkA~n46SePKg-0-{WapJ-T6T)bZS4TEc+&$w8cFHeGm8ZbKry z8V`-1NEHiO9{K5#8z7;++9c?~N!n3Aw~hAzFO)FE;AI#%uiDit-c=Gq#zmT)Y#uhvp$B}hNaPJQ900F|F-(CTWf z-KT1`+EV{%rAbAzQop4CWIquSic;xsS?51*D3njryMquB>A>t3qs3tyq@#2h`-23%O=p`^0 zz@KScY6ETqF|TpdvZ=~BEk-$pH5Rid&ycCzs)!to?x=om7_s%E;^=g_aa~s^54WDp z-M|xkOiAIFDH2OorI#}H%1c`C>~?z1#yWs2_BNf<&P=gLm~9Wmbt~9NQ0U=+iiq2_ zu0ZxCO(L39CRPB}1sMaCt1Ae#jBXjr6QSCRun=a=^ZoV@mN>$l&LWC(h zV*uJfDJWkSeYNFx>wI`NMIDyXIfh}Ic=Y;%^dpURs*J@O`MovaD8t1=FHie{=74 zPd&ku#}XO+!ext@ou{OA3A?`(N`?5)FG5J``R?>az!uiHGMlk3@sP8L~C zM}y%s(N~4G*I~GaP6iL-&2N-)I+wcnye618UP5EdgZ-PARypb{`8KZSgjF0CUf(9C*JG<0k~YBO;y#R5ju2YF3l*)PA?X*oX#;lkqIJ8G%_tR zbtLfI2`?9-d&5Z-U1IG#*?b85-r9PB4k{71N#HHQ)(jr8ww+_prBh#3PDfxls@-+wNe9kB^^XSrsl-8Jc*E~1H6H+y>3f^hXp zeVszZtkRf>MvI^6C64=Ei8veFKQZRXah)rM~Lvx2mGPH**Gta2!U$Ia2UK79xfUr|C1S758PsT4>3*irvu? zqN>*clgIrIg-kNA+;m+$W;gBuL)=ICEVs1xaGlJA{L$B=a9$FPLRKscn`ujmVG=Ak z%kpTsx!a$W!ftirW5u_mQQoMn_Ebg)H&ZVcLWqgV{66-c;~b-7B9;Y3qY#s~|i33)xs6IqNjL(z!o za*Cy9xfRlN#Nh67?bA8uheECAOXO9=e-$u&vYGRpJiSVw}Z!X0Q@S^Ge zA>_Ar?=v~A-)iT>Bt0pr@!i{lX|Dx*Y?p;Sp0(t1d1@^m0QcF{GT2tj4Hdamh2|s44>@PhGERJ4iYb(t2EG4EtEg>3^#rz zKZyVeV99rThP-ZVIBxelw$7g}yA^0;G}L%p;lC{(we8k=JDx4LUq_UUr6rd}8FF08 z{XouC>Wu$&FplbRnF8cM%K>~xD-*BX&QBs>bfKAc;xVT8`phk0_EVTR`ojXb7BbyQ zs2Oem5ixY-;ru3YjUJr}6Gujf=HmIu9^V=2@`M+PR_phIqyBB{CL$v7(01q2uVD4nJHSzl-m;qh<<3hWKEYl_Co}cVJQCL9_2XXfKRO zvqvH#U&66>IG)^*Mz>&s-FVF)t!6I(Us$p;{A1RylcfErd@v_{4u5IixS+^`nXo%U6OzCIv%Kgb|V@^j(+C)NFskrsSjLaP2 zDC?0gr~M1e;d)~uKF@)12DfGMSjT4^TrI(=@UDgYt;@JPm#btZS?be7JUN20?3HmB zGFAhrp{d=>qv`hd_N&!ttagz?%mS8!FN+oLS?KlppS!FicyjecLg`=y2o$q~%+0++ z!gWir&vWfq!3TJB>grJ>WK2jpuJtkrMWvyO28(Sb6=Uh2PY^iF{ZJDHrl5~1Csfe+1 z9|SDnbxLTn2gw1?a_#Rh6_EGVTQDJsgmNTdG>8;{OW3JaZ>?ctpn^Au4zj+zA-?2z-mN%o2E_ zV4@|Fi^%Sb5Hqw3{VZie_ee|zmHgl%v&(hgK2cCQ&~w7>@uYVA+HxS8%%u)bKoDRO zhDkAZ2mNV)M|I|Hn)TI|uTI@ZmBsusw?_?i%r>h4BEG^+WbyXtGHDRu(zlBSQEC%E zBO{}Ba??SvrA)mnQSaM36;}9QC_lK6FL;ffs~1p%rR2 zKJ+r2%gxe+{z@02t_$Yy9nQ8I&m?KD6lF?v_%zS@ld*~z5y`8LM76Ya>G=_JCW`*E zVHEhd+XV2%)p>vNK`pA2J+$fN{xa*1ZTVgXMpSg8>b>71YU4;EXQt3~m zqsM83-|Pl(^v5_d)_51kK%UY*^m3_yL2U5|673A9NgAb4q=&o`tv1h~CM&hIs%`Ti zZ1W3dNhAWWJ2G8w4dr~4{NsyeOHTtuJmzrLc2k0ExnD8DvCdjKa#><3W^?^v zHCiDkbIgR2Ul=nHV33~)0QQ(UZHb~+=Q2qGaWpoc9oTcTzk*Dv)EpR110AUQ7jyf` zf$9VZ<2ZeZW!+T47hHsV!xK$@*Y|ODeH%hnX9fU1S}XM7y1BwFRKvFv=~r4g$>-5XV{cNwX!^$E#PtF zstd0+Cg1Gu)PE7l8i;&6K{r}egG}y$=W9BgrWA?#qxrlv)~3xEd5ixjpG1pZZICTV zq)2VxR+El@SR`@_FO^0qPMFstONA+`46r5NflVTmb|df05WDN;WxSFZb^89P;xQP~$J^6o&jskYR=a@~VfBxU{g`RW{74|vk0V6( zghHTf`69M6w&#Z%4oSg>V1Sr~NbrH^HAn@2ZgUA#Sbet99rUm?Ar*N4`D>^_x#rrv zbLlqevVF;IRazrQbpmB37Q$we`{jrB$Ue*sXp1VGQqM4BZ`5~_!4q(!?ZN%5Q=dD} z8^pf>xlK^+xAj`BzfB8BUx+keyps~Au(DG?f@804R&4V+xQGLYCP@9HGMB)?CI)iC zZM#OEqJ&1Wgom9k`}y;RkW&T!&N0rh9Ht&TgX?WmwLi9pBYM2p;1rECZxNGE>4cl;Uy;{+_-q8NC4z21x702*zo6QP^O?f?zR~x<|3< zpdyIb>M~omE;4>BZ=nsz)zJE%V)d&8yF@&EFs3-G(3z681ouSQ^@nC(#Cq zbJ7QdvWg-xh1YD$N^~CwvkC=cOR3z*~#cyl~Y;&7VARctNQ%{MGb@3VQ~VjdS#wrAu8W>e=Z(gXj(e~1BUVZ0 z4d+&!o?Be%=rZ|yTF}Ve>61~#5!>i0yisD05_WrZBts5{gGNG-Cn9Yy`Zr0&$vQ$XjX*c zLeXSW%!Ym-Zo`n{v}e#Kqfuc`+DlR`(=5*A8Q%Fm) ztyqY}E@J_dUZoC8Bf&KnJf}oNMp0FsrNOgmOi#>f?x2eP)#S+G1dHgXnr@Q|h9qV^ zMK7N{y30gvCGypYYE+_3x8WHpKHlz$?jY(I*-9L}kc|^{({zCAUdd*v^g^tTxryW; ziP+SHHiK4Pyi52@iR!WX!N>ar5?O#=|A&F-uLF;0ufE~S4z2!ha5XUx50xm@Z%9pL zH`!_}ecJQ)+MMgl<||wA%<00025{ae(gh)0yR9m47hf>?D|6my`h~#gK$D*?*Ux5I zLEd;NzpXt#LkE!(b?DZAA|K3#Z1Qv~L9GFw&P~cyAo*SePQG(N8}TwC=7c{qY+cyL zxFhd?#>H?N_neIq*;q(PVD!9`@I?vG6Uru}kk0uX1AY@BFXR;P4yl_Xw0Z>|6~CCS zWQVUiNasAg>qj|v4nSC%K6(d_HW9E4AV$LAd6R4+EfBB`O5$x>Y8qI?F+LE3ZX>GF z9g3&XxUZw?LF&OYWbk@FdwfLFwfTBw{ThEOOfhv11yFQ%STI6b^rATZQm#{B{q+tl zEhM%ZX$S}iie?l$8(m9?@XL(y_sK1xxCldqVGFNhLCAt zflQ8!cgK_NF9ODLFOk!P_H?Ig@BH^TI)xXqX?$6@Z&hSHOL^k~OCK0rj@0?&d%fQ? zIB~>LzT^=zWT*0AnP$YIH0p;82S&KX-JrbkbRVvkd_^$HAR%5E{5G7ZwGHoi#9KF< zT=lUzaWca+Cv{#Q74lFlKmt0#_Olvv{8o)|BwlAvM)~R7muJ+md%^lm>Ez;saeWuS zT)f=Igh^v{I-*)UeIrtaatR|I4ivjFj>&nZ>KLwtABo+8eMZK_>LY5CA+!u}?#W1^ zsu!16xNff+`Arvti?*Gke9l`+eo;_gg=>&}7hMKV+K1O~4BrR}fFVW^9!szIff5gB zs`atX?iekdR8#TDizUK~`pO-J#B;aIOICBM@D;(65#x--eK1GBW0;SI4=`E6={|Tj z$G38IlErzzD*N>;3t(Fu=8^XmV>?g2s@%n23l$!9haep2KB|wNCN~+NrHx+QK*BeD zl6DDv0uYDO!MlZC%0c$X=6gnGP@AMN2l zU@Vhp9)x~&lT5;RQZ}!WEb5eXd}u1wWG21B1fDL~AY@&T{zgQJ>JLZz?o`lI3>6z3 z-0EMNW22t)O5ufwrKevcaHUA|(2_xLn+oidh>!&q?;xf7W)Hkz4&IqgHX-(RpNGSu zsR}*r)ApY4BxPp&gOnc&i$$~8Xi>LI01X6?Vnuf0pH0Id8>BdA^PlOGmP~x!JH7EPVQi<4eBxsGK#3pDtR?=!IQASlCnTyI|gS?}7 zYiE)qyjdXqo&DkU#;-cX0~HBx9}&$uX%ix$PsM7Hf}SF@N}0e}>zR1S?$9B)_}qG^ zwTO;2@4gfzytz*G(0ZfL#X}Y8s9Vz;XPnoy9}S0z{zXb9?VNlhz$iy10Arq7w4BvC zGmeV1(kZ*EcLPwV1#&afX*$j0ByrY5C5_YyERMhtjGR$5O^Or+FfBYN$F8+GMihIx z?CorVn>L!uFrZV8HA=4!tOcg;@$Pohhf~9RewlwR#*yrL#1l6V$LH#xr$!Siv8)op z){DsVW_V2Cmn&-HJXq2DKBe{AdA{&{di}X;)%Vs#nl4BYpIT1jlW;$VkFdN8A;YFA zn#qu$dM^|iC#r_{o9JH*pdbTY3T&Xmw~&dKeN&jc)`1BlnB+{#~~6&R3% z_{Ck@{_JSIYF)umQe&BZ;oYwAx)Y@p3(hAu> zW#PE5tmssvbE)5Uh3G>0eBGmnET*N&DMe_a(zxG?I=*IJZ-5j*U%4hsmH>I3uf94i z(Kku%ms^Ky*mQ{sQI}ml1Vn0B9gvE^2bv>`qf5)}foOcre1IbI=2E$g>4_LsK%*iQ zeFq3GR>EYh&7(z#@H~=p?LH%<+Xf~ECs-CzimNXwXiCpU&^ZenX3#9Bg>z$p3=MM5Li*1D-wy(~*p|lYEev^RODThlJl^*X zBUCX3c&SvSkOE;~Fz#S6fhwe8M_<4|5x*ZmVDYlT%RpmeIqTe@Bi!WR%bEXpb66n` zn)~cG8O#oON#O{@&b{5W-%}97v=}E}C4E%~0n?RZf@Ry!S2{GF+0JKbdrb2e$JJY; z1PX*7=(2qs@<uAuHK~5kUt?$ zdUz~&K@=r&Pd=I}si6IALt1V~t447>DyIHnwAYYkOMVJtg|x;ePQ!Y(ys}qC-orOu z!~x4c*8NhoeNq0V{$p9XR#cq#Q=`1Lhmo%;{SOlgDGa7{jY#Gj6n;1bgk7fe1-=Hw zCWl{B9H;1ktX9gL>6~<10B+9#s5OMS7!Z~QWw^_5P_X*$pmi9UNBb;X>jf)O?}`dQ zq?&Zt3r-v+LVl>{5Flu_Aon|BTPX0NJ%{f{+$}@<@4Q;2n}s*jVgA}Z+C|kSPkq5c z%B<~4YKwahwgQ!aDZGm9E%h{7m6BjZQhe)Q&YDZaZJ>@*TF-NX}BG5BnR>p=)8HDgia zTtBTP?vrlyte1931Pfud?1$?PJz>Srop*o588SRKURGuZ0`}C30eiC6`2(Bzy(lID zskrl5pv50ELpa}JwsZ=;;a5SaVjjONid zN6a$Ns?OUX^dFTGD0>J6XfIS3(dip5*&ED9@N0{O*+K_hDCCR35Ma}EjhG4}x&{^@ zuz>BB6I6{!hB1iP`%aq_J~fimK(`QA63GBh5H>k1MhVGk!Y#3q%fi=pQN&jK1T!-rSb!P zpJKpDX37+=3ej#aPw+R7z+>Zl?!_o`8DJmMit2VGE23H(p==zSaZL6L)gAc@)1@hb zKCQpOjdcNh3?36Wwh;Ecu9JJ^)>}+%he9IElNN!+(22(PG2}K?U*7D(G6ap$bAl(_ zt4WAimo*Ua1y%tZ{Sa(SrGO&CwOM_Yj=2w|Ebv1gk|qP#rq>340y&r!Up~pd-_SVp zV|eS`8Q(1OE*2z+@J?&k(2<)%zjw8;-&!zs?=(z)eVM|MVA0}J{-qxK|M>rjqZ6P6+)nKtljE6z{v9y&hrW=4$$L@Riy|1a`8zm}P9-E( zfpHvJM)AMEPShLqe`0)Fv>%f2H*n4!f|?upKmPv@|GXeBo{nelSy`3;0ouw)DoRv} H83+D9pC0gr literal 0 HcmV?d00001 diff --git a/docs/content/guides/developer/app-examples/images/trustless-accept-escrow.png b/docs/content/guides/developer/app-examples/images/trustless-accept-escrow.png new file mode 100644 index 0000000000000000000000000000000000000000..8f7a6c6b0f5aa4aae244d93446cda619872f39e2 GIT binary patch literal 72945 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%0AEqwNLtKQQNZyl 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 literal 0 HcmV?d00001 diff --git a/docs/content/guides/developer/app-examples/images/trustless-cancel-escrow.png b/docs/content/guides/developer/app-examples/images/trustless-cancel-escrow.png new file mode 100644 index 0000000000000000000000000000000000000000..832e6bdc544358af293f7bef05af1b283276891a GIT binary patch literal 60283 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 literal 0 HcmV?d00001 diff --git a/docs/content/guides/developer/app-examples/images/trustless-escrow-locked.png b/docs/content/guides/developer/app-examples/images/trustless-escrow-locked.png new file mode 100644 index 0000000000000000000000000000000000000000..6cb2ec3571fb765b4cfd1b720c401023bfade9c3 GIT binary patch literal 43815 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 literal 0 HcmV?d00001 diff --git a/docs/content/guides/developer/app-examples/images/trustless-my-locked.png b/docs/content/guides/developer/app-examples/images/trustless-my-locked.png new file mode 100644 index 0000000000000000000000000000000000000000..4e1898b6313d8798b31176cde68ab25e5ac1ad87 GIT binary patch literal 26789 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� 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 F{{X?fcb5PF literal 0 HcmV?d00001 diff --git a/docs/content/guides/developer/app-examples/images/trustless-new-bear.png b/docs/content/guides/developer/app-examples/images/trustless-new-bear.png new file mode 100644 index 0000000000000000000000000000000000000000..5aaec9ea07f74b81943c2f4a14b8ee4cee4fc247 GIT binary patch literal 37565 zcmZ6zbyOTpus)1SaDuyQaCd?`!QFLnf;$9vm*4~s?(XivT^C#2U4HQ1d(ZjK_s8ta z&URIGS3g}nUDMBo|4@)b`hxcb3=9lOT1reA3=D$!Jr0E7B0@^RpO9AIFOx!_=sA7}8-d$|z*_bUW(F694R zgI#|XOmj;r0|OHVlNS4~>JEP518Zn5-g1|?;Z^IywY=e#AL#Fofr%*w#i(0YLJ~pa z+I_aSVK5+q_5-y*=Dfr9yyM*5y0#6}ap0HD^P7p9cx2&b{KWTh(rq%6c51x+dYtck zJgD5Ds}o!pPH2(`iU0x`Jk(#bn{*5H&=Lx-4_9>f;S$KlONQO~-%STN?*GczELD?I z%x!O>{@;xcpPMxDD!9f$10&q6= zgF|~0AMS8~bLNF$>TDz^RFf_d#QO(u@cHMzPor* zVn?FrKUA}V4)nEV7*y7>!)qH_1^S$g{?{|zjwIDT=dtFmIpz+cWL|>z;qxaB~X_tT8Y#A-1Y` z)Sf2d@^1A*_2ML!_ybDbZCZ)>U}Z>Er1jhI@JJjm1G}Vf`Rk!B92}W}puI_epr;3T z+sS8LI$*)AEsVOn6epk56>J_k67*!s3hleBZvd??_g=FNv)(sFGtM54AKmVW2C=d9 zV?BW#iIt~e1;vcD{Bmh1=C&T+aRni7$%QfK2ss{Er}7qjHM>$)#bVI=q@jsT1+??? ze<2ep%p@Y*FA60#sgQpQ9UaQhYghSbSsGCrE?9d$xpf;VW8l?qKg6#e)4)EK4StBy z@pu+b8d&5I^VX5F4coQ(()Rdw5C5sqV!@;3q2OF`qsG4e;J#*Ph80B;PeJERwKDS+ z$+TkG;5zx9`N3@q(``But(v1RD(Vy^(V!y9a6PZam`2DqUv)J+c%&#-I{5tFq)IKn zT;-p>yAfjScCAx=)}I&l)pT}%socRbPMD6D`Vw-3f(pDmplEx@Ea^OR<+1{W=W3eR|&cus$&&>11}49X!hesv|dvj+w{8C`*qPWO)(02Da?qlt2~^vqbA4 z@sH}RHVODmbUs$AS-dtq{VNbvEU((XNUv%?z(5AyY&D?_yf>HK^n4rPYh6uO5ftaW z@u^PoTe@RQ;Mc{7M3VO1&_+zc+B1AP48Rd0z?jW(PHw-ww}`AZJN4G}+w(|c=1=-H z8nSc0={=PaG0^k$<*ni-Y)y(Ev~v6ZsBa6@`T%IR=8T9Xb&X7JGJuT{2T=5jUi#M1PFtmR@Z z+)MFrKfJa8is>*2AwR;l*m2~4&5#@bsPW`{`{|%W1*Ai=LjaqI`tDHQ`^D^;nanxh zrBQ!JUqslfDgG*WHnK#FHpYqXXUf(bz7{BjbaBGuh(ts)-eU69#*H2?tjckY#k;;-$QuM;MX3CBG;+&l|R&P z_FR;-1c0py7TaEpZ{2h<*yH`SwLVwiE{FF!XiSI;Eil1oFo2A@ifJuePe%io5UJ3c zwhd?p7WU`(2DbsMIj@lSjqDW|rAJAC=l}d(NC{RBCUp(3H?#}HQw{ILn2;vy2>{%Z zM^!wgZu8Hm%;b(P&E?1{)X4o)T|Q*l?s;Dn+gs5%kdE;3(QuUmh&SA^$XYa(QGDwL zED2Co{KH`E7AGq?gDUa^ykvtCP}ze*oZ8MkLo_B7crvp*p!k-wM^orruUHTjyGmI| zrsFt8r}o-onu*wo5Qi$b;?{f}eS44 zxqqD`*O+M!0&YJmuwPZjAa$nXMEo=yquL@?tnAJv8-?DX3znw2CMMFhp7|=XGcOe} z^e;T|UKbC;{-IBo*@uj6<^rzCVTY1d>B=QF4h6ij_jUc;H#8_H2r! zE;1a$ZS|Y5OO+b-i8PZo_RILj`)(8AveS#H1T0=oiFBj$7o8kMK>%p#xv)kG^Zn(> zeyqk>kzZT{BV0Wgx8dYlRPUMDyk@5t^;sv!SIAO4);Es7@Zp6diA2NXOg%NAk=Qpc zyheM){z! zdVe*9{!b-#^@@t2kSxrSFVWxKeV}zD1o-|HrGI-*>QKrnv;jbSr{e#v!LLM$lt7Za z$t$5SqW$h-!tWQVVy!IkMJ4R-AjW7MMu^&=d&EOVdG`GYjXo4)tt=+OSj zYtktQCnGs%DjPd^M8zEV{??8TUFcGuvBeH69Y0g9PSg7%*c3g{6g>2eBtHZy3L!*MzZ5iHPj9*z!8=bXUcLOwdborA5s;Bn5xje#cNZaDIFHJA3W7 zpk+ZyNm)1xJO!csMX0h6XR?+OvypOr)p8J%qdl6Z%%S5x(?+bKZU7_vkC&=RV|m19jREJI4E)| zN|NU5>r-2yyU#SE4KGe;>L%kr12$Ef^BjxhJW@PCR=;w;C!h{g{iu;XGaKLwB2Nd} zUeW6&LHX=X6;1UO;lj#ax<4qNuJ0<|2Z`ebTe2817XKi#U{^8Me-p^WsB~$y7rM)S zc7>}K6K+sM|K3QbpV0w2W^+7d5)_svtPm=p41+5(AHuiRkAy1~lkrAk>@sDfin*6~ z8B3kt9!X8Dc@+nSlogQ%o4(%PcTF|^_ODaS3S!E{kKB9%U^Ws#C74)Ut`g@24(W4; zp`>7{e9eQ$Zh$QcNQVV{|A~@fw3uy-p2S#);?XU^&CI!E(%`d4N< zjJP`Dht=1z8Ye&K@bCQB7{BP5cp$$H)@HGMx8?$i6|6(uo1ab!rO=csmJ}|iiA#Z^ z`8M3s6W9{h>AdkK&wU@nT~K((#U0Kcqyp)@e4x<1re#yy9|Yv*f0_HTt3g-A??}yq zr{Q-?5oJsS)hjXR@opmfL*zS)w=klwGmwD)bp|WbbH(xoAHw@|RYz{=2?!TPEd=TB z+!TqF!3lhS-A2)DbmoCUJdBNGY(-tv^CCPT64*8v8ocd>MA=z)+Z;GsZ)5RUarS=R zw>Md9W}%{Y+wh>~OK>(dHQmY!CF-pQ%tkeeqZqhvL$_az(reZjLz|DM1w=A+;v8hT zWqX|KY(8O43O?I7DRR-#(K#%erEa$#SM~*C>s!7gB_(Z@Y3N12Kfazb+nwOFKQ64g z$2r=pHN%@o#11wXw80!?dsSX~o%pp^4!gQ?67ZeU%^N_^Tt4k6dq?bwzRgWnts(9v zJJk0T=k3QxNa`22MA8j}8WhO)RqA4-E*L(aIyD_;yc{HDu zsa&qWK5ABTqOinsaGytwJgk*oVH=AidtM1u?Hixo8DpfX87{>IG;akVhEO)-YqZ>9 zKqz)-1gqh@k&w}0rDo=YzxX6;Hrh~9MH7Zr`7#bTcgrzm`xb+jahjSK=))KDJpt>N zAst6e(`FfPGBpnOAwu}uhrPMtH024=BhK}4V|S^rm_b)iNvV|E^DcQ04%@5=v25uZ zf713{=LvMSJCeK0>`z7X^q>_J2*R1NFavrB{z;*}o(o<7NNB>v&SAr(RtV3xH{`m0 z8uv=pobXmv=Q4a+dgH#ILyXG*5wBT%!ji*TZ7D zY)Na1&lim$;UbRecYEW)KafM{qqIN?9#_luEkheqw-vFo1Bba&?5V%Zzudd-jsKPc z%oHVo18>vrJ3^ZueD|DUYkrAfir3AIc_ud4lh2QXKmJ`rZQO^v70Ts}rz*2GpkWms z|09@5H_pE`M9Y0Q`IKgoe!xO7(f{F}vBElH&l;#^*w~NXtXKHNy$c5zLY=YM(#9U>ebMoEcfc(jq=RJxZrDE1VxajQZUP z)nv$YE5krmL|mGk({4GkAdMH%C^J=$9gNs7EtWQM_Tuq6Akji$FhPxDshWqtfL{oM zOP>Q;=zSBrR1YWMe4U$6l$HC!JybiQTFm>-#?bNz@#SdhJpLk<8B}ia)XVPDTOY!b zXOu)1PZ}H+6VdJ5*q~(c1l&G|OiTV@<#y$Gi(RyX7;=3wMsT9KyX|yPOuoGWLUbY| z!;5qn<5Cc1HydP|(#ZAmrey3SK~ig|yBzYf6_InNWqk&JcUiXlrVaUx%CSb9Og@Zd zno8d1QLzcr`Y~9%c{hOxh+xo+bHC|F?0UKuZt(iVHQ0TWvDv)AUc`6)Lb>5_V5{qO zx;V|0FQo4c68GMtH|SxT;tz}`4>j5B^wDf~AWcX}aM(-MFlLty$P62@ZCVdGuIeH( zc)LnP0&f8oWjIW2o((ML2qHkjBC`ic1c}-0jV5b$`3h`!Ur&HNYPOjZHrlU-Z1+hT zZoEK0+_`lI60hHhuH6L^8w&bux&tTNZ>B?8+|G2rN_f3prZ`Q5MSioHyV%z3w8j3p zG$I>LAwSSI7AZ&VHCUfFuA@M5^po|D&+nPSRo$GFQ4o9^ZCbOl0dB0ZqHxfdfHAXB zOU9vP~#S6 zO!pshJZ5Hc=xgbuKLvL%ChHWv}$k-d{X zuyJ)>Y(SZTil*`Yo_4aNWI(|%%Dl?+9kDQgw!#EN9hdF|Au$`wvrt7`cjI+Nkc^G^>?DgcRj=^if}^a z?K`R2p#w%-*a5-PltSid_GCX(GHljNE+$Jh8vQNHtx^g3_GTR{e<4S@3XM4TbCS|Y zW`NN8E2|8>^~L3j10vCdmX*Yy@pB61Mm<6(x8l16Ca3MxfY&wfqB}?7`{X1U|Km6x z0SV$@Ts?r>3Aqn}p*M^Lgd^?iI3<8zZTV<77fhMgNP)T8Zp_XKD`rTz8h83Ie@8~c zWtQvN18w4X=V79x_)zeu+sq7m{!UPTyPW1R7T(%;U$J)IT(}5RKX%QPa4D*RJ38X&FUF-yr z*$T~;FR=n|6xr@OEaSg9`qrMuEhb6PTENfS?*%2|y!~NR)zs7;ru^OlmoybmH4O}6 ziQjfD9yabfCA${W@7Z6!;t_?Puit$wr+DNB6(nBd6Tc4g&*pd_U~Ru32u0otJ^1g2 z%806O6v}N%Q|AO74m-5Jzrm)l0$3|skG`n16e;F}fK-afSd?0WfNt_X$x-9D>!_H? zG~0y6(0cUzkS#oAST1d19!kHvTbtn`(McL>tK%#%Rhhz;X{j07+X?Q=5&cq02-&*E zM&g)-aTC&tvDn8p0Ug;kTP|phFi*urVQrO`Ub=4$F4Iu$y1kguHYQUV53GEVds6*| zZvbtsNHjXh4U^MlNO6!_3gZ(YDdLwId#|oxOgA$0B96IKTl{4^KK|iyacHNXrTdux z`sHmq+9oa2#GFV>P`$i-fKS$yl+ldttd)bX4{r4j!|#Xb^)|;%@~WNs5p0qOk6WOy zIJOlH#~*GteyiMKyE~!cKT*B$PF-`dHY-}uMu~rD=D1^J%kH9=#hY)_m$@AYBxPj% zg#?qM)iUl9&>URNV|q|7B9t_y*VDq&IWY7K>;q! z&#+EX!Tel)AQ%PsiQWkVe1BYwf?#o#%coU7>B_sG8|l|eEC0HALj6&|;{iy*^}NBZ z=}GW--UY^QbXM0`U|a?q1a2FTApqDT8~i0A33DX&)5F^qm%S1xFiL-U=@P+&y`_UcEJ4a{~xZQE(n&r!Kt8}hK0mw-!K@JOE^2Ni! z%4ehE7Zx34`>!~R&ZVZ!GlL35gpsBZz%r&Te*h2z28f#|zS9qmakRWsg87fc3ds1o z-#qsZU8ZfI_Hw(Gf*z~>iXH}Ad^`bvFb9^&$puuSn&AkqJgY_Zsf6Q-8NCVR<1j(c ze2aGrt!?ez)=MNBRR#~jRlh7f?N=BR&372@v-W_8>3i6np)Q@s@}A5Yb4~>z0L{!Z z3gsjLj<`p9Ry@19P@GDr01tGUpc!KL6m!9#LhlI(Qc1WS&uo`;sD$%JqDmiY{P&7v z#WzgW?4i!bCfSkDBC(fUQB3j#!emwBK328~f^~b}S8H9zfxXPptuQYLF9cr9(^i+` zxalq-b1pQL^;Cb~i@dIkgQtr4(={Gyn6S_@+k>#$*1vcbIZlLL{@Yv|yyUcU15YfXI2e-w8?Tm?j9|Hh1#XQa$Mh zbO(u>lt^pKD;E%g)0nzy%;aQ;m@qXUCwtKrTBeeg-KMX2PM)hfQb>FkC0@ml0^r_@oaX1P*1`sIg)0X*~2Ps^4)S1f-j>y4Mi*md4f>H+{9sNbzhC1;~ z6TGFutk|h%)a8ZfUFW8|8IYyn9hd6C!>mh$wG$-G-AvET)7YxBOiS1cgkU5Owsp}_ zILZr5w+=Qta9ZTb)YlJ@vb1Qi#YH)ppso}D?n?#L=?mV!sLy5cgNd>MFAJH>ewHUK zQ*a9SomGi;$NH0!*ibLjM4D#F_v9A`>CK)drN^$UKc{fUW=IdICv#*)|@?y(8r3$%pa*jspte^v@RNM zZ`w@;=j4$GuwRvaYZh5nAZz|2PH!3F;Q8~F4mqg#OEB5SaQ-h5R@d1Dk&BIIBO3Y< za>wZ-d|O5mTVwuNl_@`MqB4NIl@g6(yBaxBz&}gcUmr=Rrfg<*8LGJUxy9+qKqE2n zQpyB0b{?h)R-fXv?SyU@{QKO@*M5n=k`Y(R4t>$oMy#;7Xlk(Xc*y%|xw&yh@$113 zg%bgPoL9mzNK$roV~F*G#ON3`Dk&Z5HcX65in@OYEl9mbhkzUybe6q`uK_ILO_epPew>jx?d#>~|tvOzlmxjLokkGRnTvv7F4HOl}Rg(@tv zi96I>SMAX%ls`p75jlK!HSGT7_U!ZVdBG|aN|=l$(VFv8v9RFs@$9ihr$@~y2w_I1 zej9Yx=3vliL=<`(Q5@$>)xDy`P$s|rSdnfub-fa*C7L+wX>=J&C0_nJ^GmW~)BvXP zR$rS_Yz5xm89O0Y8)^|n|2Ss$qJm!`V>0HHpGBoxf_cB)0dH?CLFK^oqAjv43)r?{ z&?@S2@9gMGr;@fPuKe;xK`1$^qTiogC_-TWqbhPhsxwDv`EQOl8Z;!!k8qE zjnlQPyaiJrODwyG5t1DI0M%293eRaSmN|zD?d(_~JCaN2!OH<=x$3f^(Sn&+bB^J!= z0>^hksjmFV0ejyL7fm=~cC0;-5Q3ROcln!bCJxU)(Zsd!bVW*`Sb5A-Lg>eh@$w4# zV5*_iubtUWyaZ;W73`pJIG|Os6kg*f6+?notnTH&S2V@%4W3RMI-9~aOWH9HbKLxw zFGJq4rb6hB@eOl!3l7i-d{!LjIo8&Jj177nU9=f06iJX@>+ovqtifTwNaJL4^#6#- z;&Y-2e8Sf%B`JI*MU<}`c}N1yU3}wUnMCv+Fle+mXFF%oYQbmfOcf1k=x@ejafAf? zzzb*rKAB*M&oI5&3t~A4ClJ&^lfw*<#C$6YF#SOvQI3#2Zfbxr>V;(f7FkP4f>u%0 zdB0w`3v_T8dlSjg^KzYS1p2Ibop%gxG!ovgyP^EPL2ZA%TebaSG|%M1Y0l8j^d|rk z_IJ!(cMl{E&ANBu*whr8M(uqZ-{Wo~Qcqa4d^eytYcvG&mx>|}=DX(u+W2oagc@Bk ze$R1DpvEoeV~xfJQ<}kP+bhe|5n(VZSlHNzx2WqBeL0Kfr`pAlE#zd5F6hpMQ8iBA zAHkvHuoEP$3fUN?wD!Kd=(fG*))+nfEF_#sGDUNP_rE_Y zhE1-T?KaHeebZEly2oaBpv=5mG$b^A)@uTR-NmIDI86+=AA;7)!!VnF)siHTKb*g? zXSlFttCT%H98m%ebI>Eb-aCHfKfEo~mm;Um~;+$ZB|PARr+{8p^`3^Y8` z&-A(z8y7@tzCGX>W?C7&0b{dJ7^>_QNMi#)NyroUcc|`L*423?kTrO*t&7M-t?eR2 ztd5H(;=2&}3Ssx;+tktSE z6jTrZi2*elDQDch`Tf8rxnEVvrS!W$21QS2rtY=ZOLNUb&wW?qN4{hI;Z}S-Ce`?) zd?bkm9sFyEqle`n3IDYtsU+<@x4k+drce2UT#nJBTnXO$~$7+A=-ITAdAS9{zt}Mf-Cgjtm;pFg&^u%OogpZ`e3O39vvIlRJaVm2LPqW!$Q{B+pb1W_fLF6|uw2^!f5&Zr{B*Xm5i z%Jn$=$<*AGbl)<^Ty_kEMo&;~7QNlmyoj#zHLG`ht3J5O-UFFFs|eo8 zQQCoLgr0e*?&Jd}F&7=bxloA+2<1~9JE$!9?pH@Rc2d-|E9O(a_~*yree!8%2Xn@9oqo(^&@b?P6?tE()dlIkMx9V9@=Dn?cQPv`=UMoEXYld$lDc{YYUz zv{#Q_=~p!C?98wTK(p2J)@sf9n&F|V&37o~MJ`4?^5UqBU9bR4B-xTGT6u~a=)Cr_ zu5&R=eAe~Y@u~;FmW}o$C zpR23Kt;KlYXL6}ZvB~B}hq>7}$0EPANLXxavEzd2n%DblGtfea>t3_#;^C{}Ry5aU zch3168^T{Q}2b2TFF#eFwL%=p#S*0MlLOFostWO7b3 zlf{iaTSqrsW8))TurVxY+UtOxBCXlvNjV>PHCC?}-FHkZVX}P2@UZ?qXSh;=W3#3d zRna!e(&>lBDENAvLqbdjZSXupa>A$i%Om6XviSL6yR=^>rro%?yec8f6UyAw5q{Gz znnPX>XM|gAmKz?;@nM8%^B|!|!e&`fMtPI?_bWNGwMctSC`)hhTVK>l8oh37}eMG^L3ivUL23`mmkxwSe?UtF$W?<^4$VNP>WCElK z5>9K3tL>+6+)(Lg7ZTG1><%;?HtT}Aj(ysV3aoAml65OV8UxAG5Bv89qVk$BusG70 zMRMJZueT4ERf1y17$7b#>{+^InKN7{yQ@N^Zaf|r&sh|#8feT~Cq<4cS71zF^HJ+W z!6G1vDeF`&O0+>a9ZG@vqQlI(&hhqkO+V{Ov|kTDW1hXgIwv+?H7wsv+3U1j=25_J z#C#Bkrk=SbeQi#AV%P`ve1cb7o^6UZKkf1$C+SK7bdZge8kWYpbhLXSkF!M)P`mhJ6a*(BM#BbHQ4F@x(&Gh|kuD89R5??opGrF%1BB z>|Q!sDyqQo@#uCc|4$w(27F@R9O@3`nZEv@hh*-SjS?O|tX zyYl@}V3P0Nd(G9F(f2aaVB2f+U63r_*x`)lU@Io)eH?Cw887v18|6K8)xPWNqTjVd zB^py-TwdU1Q`cMYvxgjq5hxZw5n!+}AkVeYPaDtsvVY&j1!ZzrooBv$+F;N{wZ#@; z-KEIA4Rw+mEkzY=P{9XOu`uk}8Aubbi0KGE_q}hUVPfjrGwA5W;ROKe-&?PKdf%2A zAU*IjA}HbeH347kEdRL*LuXp7$zS!5a%J3y&n8|j(bGGQCOJ>$cs~1x{lG?D)f8rs z67+EAWfY>u4Sr6nj+6b7`txgLsp?nXy*j6hrR!@;FfCK#2y=|mXuhS(z4&U&_Fc7j zxD}oPlGHaj=jMks@Fmw=^y9@{AdvEz#iQ3j*JoRb|LtW}Dp!I$0)$@E{6;V82$8qa zN(&A@-N$?yMC!gTZ`V@pVPxk^A;exgWV^`?e*fadw)l9kH6JULmR6it9NoiVz~84i zL9g94yF{9;w!csnE&AldN>G+hm*fd?Mwga?8d(aQx!8+@C09fHH-b!FNt)_0Jb0i$ z6p(Pm;{Mz>AZJZc6a@-BX5#q`x^_tHPRKtCd;~LXx&+$$;>Gee;jIG5y21x-SmJLV zc5v$)9)o*{`&08Pt0+jwf1)nlp7*V|;77$}@{mCqmw-{kv@@PL1Bw$$o^-FUhti%t-uA`#Oat&#Z}o-Fu=m)D$ioB^jf5z6^6 zb0f-g8e|HYcVwM2pJ=1{Z@4Zm`yNz}*cedT*h(6#9p^sV;x#y*{gQ06P?@R5E>V&E ziY3%AXdaM`*$4xWFqNaNC{cg?-M7mg+s(NtRr_NCgmZd9Yp2X`TCUC7H=7g%@?O3i zo3Be;$mWAB@j%M!&T-_DW{0QBS^Hj} zZoSvgIK^i;6)8LT$9viEkLYf}LkX$=6?ySJ;EPBx15kj#l$e}aUYTX8n3is#zV0G| z{ZxCkBja@a*jVYihvC%-zk{Zf-`adqLXn7Xnxy@*<1Bnn|02RN)MoK}ki&b#;3bfU z;2471=v#5`zlPU}(LFa0Xy{BKxjVYH^MJpN8x_&re#)AKs>{urz72%-CFi{7pI6pZw>lsiIz|akIwbU!0qA03bG;*Uz{N=H-}WMn z`VO3-7n`VT@V{rE-z9xvwXcwSEN2*I=c#O}A!#Sb^rUS2$L@P(+jb5mZ5I}1q`vrdmSUAHlF zjSvx|%wJ=7c)Qzm-+;RPNfm>!l>(Sf#rU^Gm0K^1kHrfFysqbe~?BfSs+a$lj!oDp452 zNqb8{FH_7Vb>WFXe~@&Y;<06K6(NdP13+ftMh=Vw6!L$IF|t0Q@P{{0X?}ar`MDEJ z1E~TEqRK-6SaLSX^+E7#87odr!6%IJ>;(vRN{G%4Zx4TNG{wR&txgf4j@?X_#@v##?lb>5X&cN!7D!wvgA zEhKp;VV~mAfTq)y;ot$W`OWvnv*V_h0uCfPXGNpo<@-6MzkRdz&&W*juz>U9rbm1x=OY^1)_OWnsm6wgf-RB$6E|evN5*SC*{2xOTG$83>1}Tk*@Z!5q*EXh2sHaAShR5MExZAa4 zv_ix0g`)^JP*}1=2`uZBT`jU*hm0uO?^@0Zo)-X>u762%lznS?cKEs<--;c}`{PlC zUqbKSFZV+Zd_M+`l@mwIziw5uNK}^BLkI>f33cZl4LO9oud;*w=^J~IIg;DyekN;L znToK~@s}kDJnWQ;+scLPto;Tyd;Rg5iE^=iw7r|>^j(M* zB7Cbp@p%_`j``SLbRz&IC0D)Q=Yg;pS- z5jrwO% zcvxt%twri`74Qs&?nU-oBLmaaqOSBE>pWM}tFlXbRq{~j7IiLrwoz15E0+b28W~k> zu*d<(qQXOR4nF1Z1|jKWL$0RZbl|39@+y#JI=uoB3L67qH6(t98t=qsWlc;#g&OtM zVx#6XW=s5?#$k3~#yb*;@7M<0*L8;9`KsI!Eb>bWU1!RyXMK4-Q4>HeIn|sz`1hOU za)4#9xv7}jKP0zro-y9e-#Qs@i2VJj|7J9h2#}00hIbGIfD$E1Eu^6}6s5$jlT=-0 zCI<8Vmc2MQm-`u%c|bn5NDhsmISI@VY!L-S5`|)6Pbed31+-e(y>DnvlAogNyxt4; z&oAl*hpeFU-`(@MGjD)&p@08E!f*Ormq!&Vgp@bZR{|d1_ZwS(h@7~U>#;g`XW7@i zUleu;g!sF3jisT94^)!r1n0~RA-{742aG?DaYLVA7^uUpn)P(%zhev$CBJC7ws3gQ zAY(k(KWii)^&(8-D(sGC8|JHTuOp&fsO;fru-}$!Py|Yp2UWUV z_RMw-KEHPchipC9IE*NpK(kq&>7LE1M($FaR?dc%8wIlXBBq9Mob{&6E1KwEv$5wIsY?>(=Hiysds3RmT?7I;+uWSA~c_L2TW zhC?KVczJ>?-fq!oG6LZd)obQw8O~`bEs{n{iW0IOeR1?UO$Ac^fJ?2F9CCQiETOR@DO%_B(qC7PC~MX+c)NQiNtM(c&k{gDIAH2VBq~*k zn<9*wE!l(nSy(tQJW6177PI?Z)}Zx8In#So)lLp~wVJ4WgK)!hs>BtG|3aMODF~l}oS5)bHOSAVVWs(9ui#xs*QA}V9}UDP)uN)ksf4b| z?mc%Ti&A)3PIsn!zi@3jL&`KG+|~nBest%m&T-VU9VK2?9K7c&yf1<=MZGLp?u3R{6d>?7or>FD;`J^kCEz`r@P#1q zJPa<15+kYXe6q6H>?FKCnBp?+Gapi*rtSK9cmI)kGl7#8`4y#;jH#xVD zPVpRM2DZ2J%Vlz-k>LObqx&kFHmn>TK#G15S64q@fW+_J3{7jsVWZ_*b*O05PHtSM z^tYSwv7O2@j5!~~FX7nl!Udv}3Qb!L2WV}cS|qQsMcMvWN$mZJ?i5$1c0M~hI}qt8 z@v$4i!Ua9kH)DmV`c`mZHo`&SXV!Q!yJD5;A&nm?9QMz3B?)aQND2g|efEcsY-?E3 z?Hgt))hA1Aiab|A9VW>Ie~}baXaV7FL&$>M78)%^kUIA_e_k>jrR?^{&>DVN=tMO; zParJH;9}<;$C}HcUi00GwY;y}$&wK}Vfs(j)#+Wur1m(yWMdq%xfu1^C) zq+3nbC6jz%P%9omX~4aJ-X!PpO!iq+BwRHaAn6X8DA}Jy_KR_I`eU?T@Gijd@#HLeK~>p^u!F8rrP6H0r@ z<7725Nb(G*p1ooDE<7k4<~>{~>PnPuH{ImRw_}9nyeWVbK$U?~m2h9*-*)pKQ7<4n z+`n=3Dl^M2K1&j_7|rJ?@Z^=dAE6n@Z(L>|aFnZVN&Syl*?mcBh$Pn#uPJ}$O2PjYE9~zDgVeX6^mW{qNL%o4 zY>`fVeA-?6p)GzmH0v4T6XFM}@#gm*S6r754qYn(1VfRIv*Ft2xrC*BgS5VuHyKJ4 z-!e{OgfkR=S}P%cn=EasGXcsc6%xhsOz%IUphFUz=8h33I?$IWK6WkkV@nuS($hcY z@f;^!?nPrnxrznR(4j|-#%54TKGeF$x$9@VJB{e49R7@Vr*KQJ{1^LUVR|*(aqDKY z`+t&jN+NAE`A`UPET(MHKo0%nV5x0~J)cs62vd~npHfeeHl;)9wNJ_IDzjAwv1R zhy>*t;~AT}1WI?I*bQ$(-FqgE)ZQ48?)cakk%i#n|9GY8sFp?tJ%Q7Ih@TL8Bio&% ztXvG&PG->t31t~B?8&l<+Jp}@bt;Kv#Rm_dAL8^qRw ziX8M>rkYk7O^4mw)(6`~+O6^*+t=#ZKI&M{mdnWfU;mLny|@yo?d^s6Y)!$@GqG){ zii?}{l+U^w>N;-~XafXa`up+@Q4c3RE14m?_#apG5FP5TP^-7vFA^TavwgnzAtK~GtiafVU&!*D{#H(#ie0LNPdA(1sndsxwnIXo0EOGX)w7zu{&_UB?Ublw_D3U`J-8}{teg6u!E+D}x~3qj0yYVIhtnSDjiesv>BILRZA&*Gpm zJowlw(NMndDKql_mtlff=vH+l;t&rG^V_luy3nrVX2BgRn&6PNJe4qha((uwx5sV% z=SlPl!gf|C+K;jJx$gOZr*^E>iig-M&>oIyn60!dGR%^fnQ>vsV~J4i)s^V#@Pxlr z+NjmkneIc>nQo1d^>dzUA|cr!wFs9y9GfCDU;it7ho#5|pFC1(Clm`t_7QykMfsBx zPiQvN|4$%Lh12AVZEc`Odq1iRaN~+j_wNv`9lwd-V7|4d*hh{+5Z+^aqWP@b^e?yN z&$`7Bf_G&}-UjGWyj>Fou>(Y|TK<~d2H`Rw$_1YCuc?mJn4E8%5Pl+$Z*+RE_j7nq z{O=S=H;Q)c_A!c)26q3F=QI0pqC`c;ATN1@xerhFWvi}Ak2p_%w4UR$LB~6e;ZC2v z_zIEYZrNH`R0Oj<^@2am*O*2z3SmkbE@>;0uskISQ{*c22`M)^@zj(v|Bu$K=V9pL zefBU>puYffr4dM^zw2FsWZjxtZm8!iP-n^Gut3|EV&9b+se6}^00QO%QM%&)!&#T~ z|6k}X2M0;M6S>o;7MK9jMnWtfkmO#UJ-GQ|!E`^o2=*aC`9Bh&-@6r>(jbAOqwSDD zI{I-PO#Ujf?Qxay07va<^!A)kKISv#t=1tQ^ba#nrZsJHpYW56_?UWJg<`{o+zr<{ z*Y|HjP>FCp9^u&I{4FCW)7(EIFS+>gn6d-pSa z(fD`ARRke{|NAch&v&rPYM7$4?q)Et&#wLiM*Ww_w$EYA4Fv`eI2lbzx6O!uxaoqZ zKEY!pSe1;jt;q>3(pw8~1P@ya7R{Ca0KDZ_y!-#S{$p^OkSb1wx{hc&?~{-~D{Djw zN?nDvkDXN?COUP$>u$s%d^9QsLGZrza}497U95V1gu#-~b5XIk?}_uR)eawX3XF)c zF~lr`_Vx~P)NwRN&t7RhDx5|)&+|_{I&bXC|5<-1eMHdV`T51XqE;A|^NyIFvQ+4+ zi=H&vrCHR7hrf7p5>BbJqgF}DDfyk1;M?2V4hM};ACU(+fD?^**JLXf+}6_p<-ZA4 z*gzyVIBRG{P3o!IgS>`;d@#>&%@lEGG-Ym1wV<%@^Wnu(n2ekpG9&z!vRzl75JECi zSjjPO^#Ex3-RX_+13DX#{+pBePg~&qLO0k!?CfcX*aZb9^98>@V7~tUxO&U5s-E|I zSVB@#>E?h)BOIkm;?P~vDJ9+AC2?p3=?+1DE1Lzrc}E*%bM9PjV=pP83q$9K zpB-!rgoBEDT74cWY;279iJU#d!M^$zL4~v~=a+s<=g2(7qgLmqGrfbdx6F@z2?Zu-gJ8>^{!>kVfkqg#A>I;1p$5_-lT#?OESGg{#%<wUmjj^c(^U z=12s%HX>$($3sRatZFK^!0$8ZxoKLkJIrYgVO^BZkqi$HPeW-R2z0-1w7dC90b_G_ zg=^e+@u0paz*EgquLaidJ+V>DW;W(O3=`@f@Eu6j0I`!Kj2mIv6sL~M?G%X zm{(7DinSOyo)7r@+S>|O80umZX!5s3%xu@Z+eNpMv-#1{i^ncW_veiP9&5%4^ z0Rq{cEG~N7RJq|KQ_gC%SIEjJi2BQRZJ<-Z@A_)s|G$1o20siPlV6?&d+{`gDxM+v z9b;!WTI98+gZ`p9Ne<5liDz;CeeimQ9#;lwiQ)p9rd-v8iey0 zc#zP6@=8=?zq^Z!@NXX@bjZ7a68L#R`vLWf5(W=CoHQR0p1Y@>zf6~ry}uJDC#=)I zGA|65z6taz;$Z%Mu*3otXwpMu)5R`ny{S>Z2SN_+>Tu)UbyL zKOo2e8Gf|=e|G5jl7AgPG_%--2&sd{>r(2g$!FWEzingE2%IWpzPg&McRb$-%P2pO zUJAK7w?)c_D}0INT{tM}ZZa}PFN!B|yLa2U z(pRX}N6qn>OCtX*lbtR~Fex%>IVv$(Rx;`&vo7OWq;>N6+ty$7=ROSBZVap2+UW3^&A>hI<*A zOB(z?k!gO}gTyq!e=};k~e*612vPYoI}rmf{^peu~8+fj-KIB=<;sc8|x8y6Qh@I63+I&bRs>iy+Lqklrg-d(4E+yQb zPK7*qT{X0wXU)2MM3v8T9JFvH1J_)AwZUNugok`z3NNFtuOy`@4S~Q3#1ve=_h%DK zg_yew{Ejc~$_EdyOlT;@qSe0i^|=Hp&ru^zI#(Y?=^eRhl9}`GDe5Tr1|mQIz_t+D z_z|a6;WJrmc-%{|PM44JV)`m6%3s(=ZQ}0;gI`cqV!|pU=DEW^$Bv4u$uIJp=lrp0p-lgUXKet zI+Y+q$VOC%_*Ll}a~pNVuLeA~SD2h!d}E_I_)aD2l&dua@K8=WR;X7%mDyh$5nib1 z`6*DH{-3Ao1OuL~gVYi}M>Sr9VisoZG$lZIn2Z}lZ!{WZKk06ETb67+pAjzVpr2Y7 zXQ`_x_?ujC={rrn7auOyWtV3*^oL;lVDr*cCI zuk&9$@B_K0#~xHsUa1sUxc7ma5WCVEl%PsF(|>-Ja%!_5l!i1751t0w!%KV9x}kv$UOyP$<=x z|H8=J6qMScPwg!({cGL+RNqTp32-5iq{KhWd~G!n>42&J!ov0^>R!yCF~zaX2B(?A z!r$V;igw}C{rLIMzTSjfwy&;VOR^*Df8~WHs&O#uItad4L(a?AF6Y&d+kfBzK3tQQ z#bdUc#M8f0Awym1185#zjksl&NzKQ_ArKF2frnp4nc1-esT@PLwl0e*%gpQ|-)iGe zbu($+g0ud9qE%{T7)0&c`^w5-J9F!*in0gp7hNY(UidUAfrEarfdtAEbcB%=e0+Q) zd*E~?E@3I6^;J7M(FGns9qHGaM2y46LT=Z#DGyp&+9$1V$@&YwKG&SM_fvFgfh4$5 zxBt~+-P&XM6!NoJSXz!)C)FD5t$y9R97sCAK2>N?JscLF%<;k6a1&91UzR=y2`!Y6 z%jyQD44I4ZQFE7OpJ60^@*{A|GXLrRguV)naH6JOzL4RPk{&Goc8K(Qr5r8?0u>e4 zWSE?q`mJu{GMNOEqg+4A*1?YUOp1(mURKq)9NKUW%OpXbtgPdW3Y6ly84$Hq(7bN5 zS!sP$Z&BVAjKL9X;O=sLw8WhFXpWkhexHUWN%6J(8j2ro5KxEgP9adAs%)Xnl}8ZSa`aPdV~2o`5|e(9@0ZsKXBp7bModwX~q^|Y@Z z*bV7Xk}mRXFsOjVTdmo$zG&np-xK2F_WI6p6uv~BcLwovnoGE)I@-Syr-LDZzv3*g z5(EWzqXkP|PdtjxLXlE7LSiGp;J~bu5?4&pLNNnjDsd>0N$7YK8E+xp0FUtkx5~rO z*A+3L%dd|Cv@-!n7@bd#_p5&bzTAxXNW3S0Fr`QCBxk5L!+>{_LG~FVr;cygu zuGqJ?xB2Yk405+|nRw29Yob3y*M2MC9>Qvd%56Nxo|&H~|4H;SET`{@?mfUhJzC4I zPb;7Qz1_8*#jg%+O2dk<%sim~z|=d4R}y`D=M$}|X`DSJkpC<*B#Pm}7#S8Nt_|jV zw@&w-eUP_`Hh0re+CmC98w9eYY>S3Z*KF%$o87jZp7|Rq;X1|gw3`&IU^AY%n|u+E zI7lqN1;~r(&!4?0Y0NrPCa0#DOAFMt_dc4vhFg6YXw1bmx8nY`-zrG-UCT@D{2rFr z)^WjcWo1tJeI?r?HqzTlR9e`u#GyIVvKrqNSk!+nVmE88+pmgrd+hbyT7 zdP{k@=!JUbm zCY`Rjh}ryeiPpzko>ZS8LHiAfoMOw7KekD=*`NMu@-ej44h{rYxE$-|*eTv#fpN3l ze=7#9pn^8dPyTgyS-=LM!Y*xUkP4$dIi|0bZ$xTKyMB7{!b^IyxUpS{4b=uL6gU+3 znDMzX$42)iFdAqd{nFcz)e^Up%GcAZjCqU3Vd_IZsq}V&m4CqTm4`iMc60V6#@{u= zoEW(-<+kv!s5Re#DH*BHlHyVh^9jmqjOt|n!Y#O5Od9L-QTu;iMbWdqBdBSDU`dd z@KBDgyV?iCu~hl1MKmpS5nKh5NuuXY`WdX*!6snh_a+$=8$z7|bf5i$`JP7K94lHz zt#nqLVN1B=U|wivhAH^mAaL~m{9=jY*0Xq!s~{iv)UmjBS0K8ep; znRWkO>Dv<(VnQ`%ev{V~rLX0&jCUn1@mz2Gb!ubFO`8u=sm1ausU6*w3#O|uCDp}m`=?jyg z2|LOGGWRUFIV_(W5fR@&zimFN&Jj)@WS_e!3MixZ=JCSHQ*BJoUW5<8wtM|KHclp* z4?C*kXi}Q>(_>(|q@4NSLz>Gn>e*JFLx;bZMx8Z=_uW)R%C_FaTGC0f!{}Uxd=;{IQL^TQ@pZ=`ZLIo+UM?Z&Ik&01)uqkZuc{QbM&M+ zlGjP4umo5V(kR*#E*42TN|3-TKX7tnuGNcIu*r5Rl5@54k7wBJ#V`tt_+j1!>yr7m zs8GD~2=Rx*$rEX~apKVsw2~$P^sm4%{_`2LYV<@MShtiuG6|m)Gc8g+{8h=(A+OG9 zsT>>EVexmJk7OXGI_o7E1N}bA_uoGhFci|D8m*yWllrReWH^5`8o)?PBlGmsB?1Yr zqS?4pmA!~Q8g_r={Eo^k-K|QoAkC3Gk=N#Jxk1DiWPY9>vobM?$LNWAdgbVGMcy6V z(PtV*vsU3ak7lgAuQk~*N0WDp+Ium~G1jeR)8Zr= zcyPO|7dYvDe<;}H*9@=iI3cD{t)DJguva7zbz(JyIyQSp6C><2M;yJ|6tzL`XC+oS zCC>swySBX+d&te>K3C4@A9iLzE*u*QuArZ!t&oe zXzr5IGfe~OPiLHDg$|1g%7WmxGJKADujiIh*>eVWU5br!#3OmOCK}HEV2Z(h)uu9( z@gM*-K<(SJmE%H7A8lMm;;bEA2rky9SXwh;G;wp|Vnk-%_RPZ^a1z0@D;5^gcbAsj zBa@muT1^G+boL*ZbCGPGu6D0ksea!TT@f=WCm_$)kjZivmLUyMldR-Q#+|erdr_?S zLHqu;J*{ljZnTtYHD+B%J?*D=PPBLGU1xY*eQmx!YRY#|Cl5$lRwR*-l7W?bLeFnPU9en1YayQco2A>t!J!_@_I+*NhcxYlVFPR z#i!2#$9qe3_CWp{E>Bl`Z9dh1CsP>!qWQgPtgP(e=eVF8492;(1dprMk?_Y-8*_;$ z=kZmaHjc7{qwf|-Rz%64Ek04C#rTd!iTJDhRv1NtiJ*S-xtorj?w<~u!xZ_lFv?i0 z)DI1W=((sVNM)iienNCYgzV8|(!5a>R{hrTMVzc`x(Ijh>sPBkOxU+dT(gptq)=ZR z9D-XF-QW1Ko8(N`(*uRxHCr_8s>lhD$VJi7iwe2b+F6{zequVT4~J>{m)m2yb+0v!8Ak8@b2#mZh|q%ER0ho zb51T|rfl+*cW0a|cR!Kenl3eBd|+kl1Nb^7ux^tio#12+)3t`}^sbG8xYM|d2gJAU zW!RQ|obS`}F(3ZbYE>BB%PqQ2MRHxII-Is>wFb0U$;8227hR+gr@v{HutFB_r?<`7 z^1P1}E(a)@_G0&b9MV0G9XOpZ{g}l2>0FWSzEFo)iV`wc6qpv6+P2EjhC5vwJ^eLI zp*kOyNHMZo%z^vUDiZ8Y5)6r@Ffa-#WyrFP72=JL`zA}4ZF_+(5~*;|v={L})^v2w zYvXfcg=*iHVbq`osumwfS-C8@)aX2K%ef3l?;un7r#1l*5z76_mxS97Ok~iW~PVP9#Pns9;pqAkbzZVqi=# z7(1A%j?IlSJ#6YnBh8zg6)X(x5q5(E36NugI;zlSOC4{~+)V4Vx9G#PK{cfH(dtIy zqe_EZ3fF6#7z6QOUDws1Y5&ClB93o_TF|DWM)b-!?25K^g0^nvm6jl4R2zoP%fBmZ zCR}cl-M&oRvyS!Ge27sh_(OGiM}^S%D@Kjrn}zaa9K{J=aj(LB8|IHS-JiI$9}|^z z_AfU?i10vs@xh%iDYM)nob9YsG_lvVg(sMo-g<8NqrGZEPEs8f!cHue(iMSuP3zfs z>Vs2R`TS9|Sc!8Qzo%V;!ik;KdFI>Z=rw$JMBhCUYOv>EDjs&?+M^Pfd*+5ss^ofy zo0&66nXsn6Nu7^sVgvm}Mk zAUzZ6sexXWQxr>7&kRORq73o_Dvz~C%O1x)z#+_UK8?q6LPCccXG1(SL<1x<6wj29 z!!ujCRgHTo4AR`kzps?!U<4TC)0ni!cn~eG;)e^=GdnJ!*RkTbxS>xmbF0e^V^C5! zpS&5ZKAuwBjgPf|a}vk7IoP@uW63nNnrCZjPO#Dm`}BN=Mo$F)`NFdV9V>zi7$5!aS>yx5$Ws z_o8@c%|r7pqvO8ow7A#MS4BlE1bLYuPFv^BME9;qpg?TRCKW8OSxSE);g@pPNO~Ro zqnU$(CA6{U6joZpWj}eaK9{ih{bkf-j%p4g4 zBL5#?1$n_Ip-i8X%tD05AVA+q;!#UoHEiM!Ut}l%NlSsUPo!pD(^dAF9q@0*wQFd} ziMjvVkY8v6P|Hq($+prF_D;pi;|jEp+8)tx0l9)y*LHqg@=rugi$fw)i~t}nU&94I zX%xOfyGZpfUq_ql1?X)=g2TaAnEWZ*go>py?VGEF(Y{E&^z!fE-uIBkulP3R!>7yXY!@5*e|VG3UFea3N6>Jgo(ax2_GWFy81h0@Z z>j_fkE6`Ig?^#35Qol_LjySWL>VO=w`pQtTaS*-|0cEY@fjX3bySvaGQjKp8J_xC+R zxK3N0OUq$?*70l3l0W`yrsLrmc3O^62a1YX`)E@yQ}DpB0pbMCcYPR3n5`cG#S2ji zP*u#Ff2&@%HkY&`v8freN>hC|#1a0Rk%eJr(rV0#hiAQM2;llWA-I;Y1j&!K=HNHN zmdaaO{TQ?%+B`Y2^;}U{exdoa*+u3=d=`9@)7PE;eDUXja|$eEvd4cZ67cXourP78 zhGL%A9?)unxSXHgq)9Bm&btsj`uou2DTsc~o@7=`{1FV<`N4iJr>eoFo1F$R%dLy~ z>C@PAq|X2y9bJ#cZVKu1^G&oa$TO|h>{GERslU}>mXz>lsJ{t(HKDk8cj%%ioSxw_ z?o*82qOcT$>c0>npcz?tkxKPr7TtssQC6{UlM^X;z~9 z!4);>O)PqwvS~{1T`|;Y0$e?9UWV&zPmD8fxxek&stQ5IB#uD1chF2VE~0;tJpp;1 zpPdcI%=Nv6KI<45apEX@5VAe<=N=7Uy1H52AjbFgQbkn?X<~T+`Y``Ad{^=ZG;a+n{kuHX4&u+z`*k{yVJu~5hqFiM{LaMx zAtcD73h{GlZR-qYC~0+_a!NdA!^w$j`~;uW!of&TU|>zJkeLhIpqoBc&uFfPBl(kuC_ktwIwH;>aVqQR7YYg z1iPLNK75ptt2 z@&;G#P%+zTR*DzyuMP|m2s+5WOWej3dl}8!g(${Rs%vQl6ldm?DNjvC%;r7&3V$%< zDJ>}}!a(T)-_f(MykDNVI<@mEs5qeUb+|edd$<}Qto`my$(J@Cn-=S*kysNU9l(iO zwE;Tu2l{vbd1h~M21+_;j?Lz3_N_#hW+5+6p(&C!4AXhf^5L+K86*6ee;~q-RGYJ0 z54|8_;uz#aUu51tGH;0_I;f7ZU?(Pa8`HX6EO;rM=&FHLRHQ-(t|i?m8N)T;AttEw zessUeN~gV>Xm+jkrma>D#bxM_3;OvNsp;ZgRzilIf!#wsEtZ|M%U``7J~JAI9TToU zTjY-;Jgy>3`?_jZRHH)EAu<(Omi=Rnr$SQ|9xq?q{*Jj+8kJ}->x@==2Im968}gM; zHV8d%%(1X4MwyhFVDhLiz;dKWiNd0K3C7F6s{4khh6l2*l1|Kz-sk1vQb!p$D-ZFy zCSk)?HNK`6nx*%m_LOnlbbSYl;^Mx=s8C;8sdInb%m2U`sP67>>te|8#PN-oItc4=H&@eZXjTNV859}vB5K>ET^k_i3r}+q#_~K%RJU>?W zhr>S3%I&%=4N^*ZzR0!5({h=GXu`kRcdo+$X-p`K;^NX@h~98z7bIE#uqbyl5qks&G2ItI-V9J&#M!)P#X7Nil|*E$4e#vq z9UUjNr-rGs%E}yT+vm2HDqrY+{qhyg5W7U;*L*Ha-eIfB+~GxUlW*U8t7VguC*Q@s z4+7JBnZv3jr`Q74xy<@L27I57`o6m7lO8kX?%2`PIKEHPHsp< ziZWxo!P$n*G&j?i_Bmw%x=*-aU8H;5$FFmea}{hfx0q2jIBz2?Cozi(bbIE0YK20i zR+?mad_3B-gPeJ{?UG_YqM*1^aySx4XB3BC)VT!K+V>FCnsekfsefYQxtzOLVjT?p zRB}RnXkqKIj6)|0wFn<~1~YtI>x)PCa3?(NM>b{4#GHT|*Oyblka}N=Wx#$iUz{`j zJ!K-g-tG!Zn{s{*9G{&gT)S2-Y&Kq8suTBq=yQ9-5K}NH__|f zrsWTlx(ak=$7pzWrI#=@6B4GL)l=_d5dlJ~k4k97@K)am!wwZx5A-{SpnG+7b##tD z9I3%kw_xh|&ivCw7>t;B{Huc|S}{|^osvboREm_M8R9~1?NwY3KVoULIdqDb_dow4dpBRjg7>NoD6o_4;B^LDKsL%IB<4F&Iikp31Op4oNUi{UU93EgJ!M_0A)~ znLRs4hlzJ9k4nTg^$cA5Q%KvBZ%5-piY*c5%?ulr7KkN6nM*JtV;cd@owO_-Q%%#Y zgLyctwUx}j@yV#f@_Q&_vBZi<+{3#BXXFz?@-uKL19DarvO~t#{g6f9zTJB#?y)wYtbuw7isOuV27OTt%`!l^4831 zsZ9CTp_0$`2>ZIf!(_*jd-tjR@fygVS=K4EjvgDj!IE!|#Vt3UJ37;W5lh-*KN32I z`0KYeMlsQ!IM%7XpDQvDp7MHw9xTlUjkn1(-DWy#^n9J4-kiJHP^P?TKM`@~XxUy| zCo(*J>s->C=4rZ1`coWiP~PBt**ax$)vN&tB@q>vwTPpe{L+^|`e~{xSzqh*F2`cM z{FCcnqJv)Jv4@)q3Xs}g14NP`KstExatX!#!Lx8XUQ%1!jw?TG)$Ql+AX~N{GQ^4h zP$9BB7X8)D!NDm66;g~U+LG)etbM2_=WCQ~ss%_t?^g5DvLjK&i{?-^rhGNgDphgQ z`y#0wZsHlQ3(=cTZt_MmnJF>$XMfLb(_7u-n@;1hP4>R`pO}4$fH5CVH@LntzUDT3 zCH^@4c`Y}KVVWF-*+x1_Poa_}e8I=88BE_FG8#1Yib7 zSGG_~o)yoayCLWBi+r%~b~0Fr=FkjBBd=V#;DJ&cyj3wCd^UQLPI;5HWRikn zkBy#o@Qzl-tm$`LR3x6HTgAmZgwX1Ima)vSVA8HzxtkeDm{h&l{C0 zomMKp$lsnJ1)r|HvJ{C$M7fXL5(eXKK-qLEL9fJJ!d3szvq4e!Vm9}KSW@QKx@EBcmL@=$e zR-OGtdOOF#W5ctXJ07NQDP;5o!La0WXaH9iU(@Ha*^{Zv%)6s0U1oAc+OATSXYgoG ztTtX+62rnEWi`2x&KKltS5R==k`bbRRsp`1VxaANndxP6f9nQk62zDX;6vuBwQ#;_1T2QVdxMK9c62A=xuhWwA1N^ekTv>nC ze~^*=7|lji`dcFV`);{}bpGgXxf+iB86*T;gD*`n+KT-g60fBtN|OB-MDjxmGG1A! ze9`39w;1X?H#)`6)cXT7LQrm2K*kz4xbq+B>l6z|zRqGXD|f#-7)IHZh- z21ooF1eXkNDv;uKlB;k_i8~)CjwpTV8EH`!w0DW*NMs>Qa~niF7ubGCj~4 zY!RdfuXPlrs~XM-K1P8Ty_Hca)p_H6Qm@|4&+~CaM{SvpO#UXjF{Y(5YcmTaoMv;e z`La#E0GjiP%ID6EBgYh0?*3*OjR<_l(Qo1YvmMxA0e@HLZ` ztoY;mF1b`-C(pEP zfw}!ID~$O@b}OF(R+Q{}ry9o@h#7&I5EVub&jTiz+n{dhT0+f{t&X{)A&cQ)wPu&Z zFoI})kLQ{^J(_7Pzdz8$h?m_qmd3Ke5rmN}@|^Yu$FE>@g*aI{kZhR*6iJapWl2f3 zWM{8XoZg`K`26uWS*f=Br|pnsvU+peQ>Abaoby!W_!&RH9-HS?V)In8+^@gC(?kv| zo=2yYnWgv|kF{7LleB+g+V*q?m^^ks`XBVybAZkRcN$M*xrk%3dpXe_9fdg-g4~&g z0Vi7%f+vAt&y;<&7@4J##R#r6TcZ`d;;=+4HCXb)%2??+luw44sE z;BD%$WKi)^Ol|MChR2;a)ts#07K=Y0z3wjbjc{2@@}4l9jQQ|SuCG~D5~v=}&nR%e zBk)Cjd(>+6bQ8S&ATEsAubNJfgZGDaY@L%ve0%2xih0x%`ljF&cTOr=1xp5 zS1a=MAO2mLBBe;=;2#H@aBv2ok6^aXvSumChPkF63|t>c&@6h+*KY{0hOz>|FSnH} zv&W~_1AH$WLIRYZIPaawe@_-ZEQqnMwwmlVuQ)!KPi8R+&av<>cT9&O!=kc)opH=f z80a5L{3m!hfx*TbzSF4o9ZG$q{Fb|=#DS#8PidhZSOQA3HB2bo2v*2~)fBY>=Cye> zyRRO)acmKLUjxH>#XfqxC-Vcc0YHmyV+G%;3u2N4C% zX*0Ohr1_V=fozY4Bw@FX(!?x+c8H{KV(kMV>IlH1_J{e-yOqzlT<@u}Z~8k-9sM0i zXT2_pp%+DnM0O?@=PN(AMVJDsc&`Dki33cIn(bj4SS2KC{V8VP<2_<)ca60&CZs*` zde!bDuUqpyRVbB^geCVPz<1(mCC+@|(*}5xz=HyP>oAiQPCWqTAGSa-(k)7NPL;C7 zs363G^TH>yTs^GEi7tcQ>uw1;H`)~%Qu_UL7ypk0@at$)I68{|8;M>1$ahzEQy|m4 zc?V{wqwxB1V3v;K478*10q*Z82qPwg3qDE+6IhmwSA7)R@auSRU|<@J6!r4?+7Aoh zcUWV3OpF9%?D~RO)f7x6J?+zne3J^dFBW4g+&%!o*MF!5vFYNlAt>i-HNt8KXaoog zw)?N>W$pJX3Ib^XYTxR;Tg2a#wOePz;3(k3Wf^S?kokQK@g@41eYv9oQ1W*8qSA}mpy$pIVtzU?PccTVUq)5)=c@{SCcl~~9$f+OPKTewhU!|t55V}hYT z6PJ7rhp7r^!jkOB?s4s0rRItR)Bl@QIttfq|Jx5PTPP98h{K~f+ef^{XL$q#Ri4jl zT_%Uk2>v=DL_ZC;4FF!}|IKN`PsoYf+Ma8df_~FBdR?BlRYkn+9(-InH+?JeK<#jd7#V7E2xPWRaDb zv9SRDuXIh%SW?IiU`$42a2d`-`?LqQ4v6-Y`rQG$iDhLhMXfhqiu7)UPW*JYk!Z=6 z;z+u@$+5A#pE~MEeeXaohJ@~yc?)#8b#$ZRqLl7W&3{Ts(grZzz}Ck`$QW@E*7-Fr zd^v88{}eaZvEm5B(e9iQP(0T+Gv=`#C`iR9jGEDptCbT#Di;p}?25Fkqk9=yq?6Vv zyPydpRa=9imqx(Hiurl0pAtME516h#3JT)c#N;G9;-8})!14!Q!wI1EP0mM>a3WE| zp$ZSTS6hyNCS9M#rsn4}bB%7ZAVY!O$m=JjQ_PaMaaRX)fDQjcdE?*i4fA}1+bHOa zNb093;!BSQLOI|Y#5x=I-j}Vca!Ub|+Unm}OZSbYv7e?MOK%?OP?a`acrbIO+PdH9 zr_Q_GAg_y;67m~D^ku03Z5YYmTl(bhcxv}@!hf4GaDtQV+t7Oua;9*LsBU?{=)8~| zdA%)l2!p^Y6#bBDxa#J}b@>t?Ght3F0cozJeNrk7;%>#cTExPG1NDkr9zP9|02aBa zhFl#4WLGs zE!>{pyz>RWt53hNx(igLxHjiD7JVw&+jyDUZKu5}mkOYrQbb61t<&9y303k-#bS7* zH@9U>G+yHZ;R_OmKdcaI!fMm%jqa3TQ-4(Eh@BZhMQ(rvjlwMYI?)zUTT&&0S-$~a zbg+vVwv;twZo_jIuP9ZK)BBHCsFW=}_9qFr_x zJ`ir%>wEghKAKL~f`X#JN=ZRF;XVCFkK~KhoCsfiy;$1605Ak?XrFO<@}E>N+<@W zyf(ZMO>qkb`;`4-ES$6knezt_fe6J;LWn=Hf(#)ZZXv|!_asdy3Xq$u%R1(|F>sW&-)&51xbLKJQmL?#VPb zyN5fMl@g@qcw6UV0-MvO~@gvOWc}i`Y!1)9#iQvQCiMct# zT19!5io7T{e#V$Dq>zEk)=IuqkX0I)U;F<0TpEU>$xMpI?N&@kY z#_W!wP4|>v{s3wZ#aV-!@HMuLdPKf%=u@}m?#%@)|Lr2VRb*+mBjvYBHRo$4k81hx zZzE@TFg_`|L4g25Nr70%ij66Ov`tD?0p2s?n(LSblgaU%2~RIYyo3Mzk6K_f%{SuR z8R#uE4jR+pCQ)(HN#$Japxb$)Ype24aLHZDaYgzvPnpZTtYSw|l;CL3XGxpk;nJr^ z#q{wqU7DL(KLu;=%|<8q+u}CNd$xR`g7kdPoLmcKymx+Ve{+sO%YJ<$Ct`3~SCsci ze$pdX`kBWhshaU}CpK!?dADRI4mBYz-a=)_IGOqryD)vIv%(!g_-E9;UR22lN&0lH z0E~%$q}jqtt9(x}&JJ2XZco6G@`!~cp=5n@XhxiWff~?y{@ZY}w=Pq36h_OwiRJdU z`RQ75%>^x5Rlj9W9ymw*{VeC;Lw*puRVR~qSqgpJ1r~hvJ=PKGR2W3uR{A7A2938@ za@dj8`)K=rIe-8tpn}ooaWU$2U>mb!oP&F5jGG;$*OFp+a&0PXucufO@HA-~OE%NV zTqK6#8|-b@ak;;reVi;ziPkj#Frn>MX;1Z!21LN~Gz_F7aReZW%r?(Qwtu|Z0Y+PLFN?SO z+Ihu~BqF>%x5xXHXO`(dhUj+Pr|)<@E%#$j-@LftFI2 zfhDWD*FHhMA|Sg_?(Ke#^wT$PyV80Lz!ezhn+;=LW!hesGeL;TYSs%d*aowWTlmAC zdRy!#%h`>ztIeULA%MQuRee9i(j>D3?hQDA)kv2$9r2jk*sT0HAU1eD_IYL`&~a2m z89K5v*zR_Cy!?xP8uh6G5Nk%5sB2cDXnQ=gLI3$qYx#cpdN4%rVbu_Me>D;Th~g0w zUp}u*LWFfSkbfRyL*mzfI+jhM63r)4_B|00B z_g1oQz1{Nk|G>)$C@i#%|MPjiUr7RZPnT{58Kc=bIiUKG>WY@?NW*i?Tp2QJ02voJ z4U_K=#vu6-i||L6*R~=||==RC~ny9br;l&Hs4u8Mwppxj!7> zKc4*Jv`HuRJn1;g!t#=c61X#KSo^_f@4+%vAj4dt!%gv>BaFB8`}Gc+RkcN*%+v6* z22bpm;noa~XxGOuyl(5?KX6#Od_6}q1O>l;RzKi-i%c@pzy%*f{ST=ii2Aet(Rwe} zd}!~OJ*{~`nRSEDz0$nS(jVP21^=w#H)*6Hp3{gyAv_Y(w>KwdeU#- z!Qb_;dgC0JQ933gMs`v>orJKB^tkBA@g9N=5QjtYm=TBz|F#@Coz?g8v$#Ue{fQsx z<=v!yk|W52)d3N5*-+%?KkhRn#;|Jh-JSlv+wBYr@dX(UGN)-p1h(f+f>z293U61+ z%&oAqdq6>!s9I#M=i$hu4gD6LLcqE2;w|qV%?Ft&tCdzA^82~I;0yT-fhGUg1V;5i zz+vwdwm7~Gqu4Fn(h%6ejpt#!TMb;!8a9&by6FaobgwEMzbed5bL5W#f-ycpI-z!5UghG2Z@WcWKu2%oxP+IV zuIfTq(auwgGBbdSI;bd`T#hk+Djri}zBl{c{(~N5Td@4^8*o_x)sc$H=q0S?s2+# zZ*gRp51@LlyQg?71ioby@vp38{8COX8b%r2bp0Vl)SW#zN=PcKXSOVoXQ`4GQK_gz z!$PTsz0^AjtUek?k0)!PrAd3a6lW~HN&1!V(e~@OXSAbbS8bV7O*KEj|LstBzrd1} zDo9DM6xq}Nk|PQc-FA9WrMHz6`RuSYe9?l(s3u`*YI>LQ7L0<8^0xYe-rZ!n{8sN2_l%TDxrj^ICaYc@r^D>tf#)y1wfwO*4$H3l9$tG~ikQtzyP)gXTM zwD`P1Cx|*q8RRHFhw$?d!K5dCVk-Tr`d@Gn=z;HXS02lmDe$$y$F{&*c)PLX}4f!;{+l5wBL(S>K&HoX5` z*Lqocc3>*V>-aC)_d6N>DgXZ0F{wV}TYt*v_x(NUt!D`U)AJt!1xld(?qpups4s^J z<~JF-r`s_fIn%J43M+Wty>27&bHZCdIEawP%E9;&=>fR3={m^$9PmsSIr=ssVH|lU zrOiKcH(D=>=bOGwAWfkmVv{iJy|<<`$JWWe?H?MT%V7HBHe$H}+^o7S_h{jEJETY6i3ssPF7!Q|P=jMnXZzWduoentpC=~F9GrgJ}m(@)^%EtUSq z(nZ}Fw} zm@4h}5h@Mu+2?1g6d#@FX9~r*snd$AcX##^dGaU*AxL<{`z~$wOIaKi=H{r8YsseR zMAfMCJRw{P4kD1@!i=aeicYgM)*5!NfGz)t3%%z%bwA(n4oWkzp9`iN!=V{5bYo`S zF;nt_{1N3uA1B==-Gt(IqM0K^Fu7^WI3y6r;K%H2#&+WgX+@CgAqCPoGRVgMdORp^ zdCV3aC}O|eR&SH8dvwEj6JoS((6XYAj{h6aiVl(avK?CMtH_t*5f~L1b;v#D7R3Zy z`{gL0uH%&O0GSRRef0_#OHx!=1z4`cZT@37VN22Fn{m<<;!dF^e?dfMtTYe|jmMUU zEyA$vJncC5^pyjTCioLNJ`>7qD5N6r?RKOi;paXIA5Tqbu?K8P9;f_$?6m^rnj1-q z?lAkH@f4ChiQi zjTkbl0a%$Tk4RT*zNTz($rniS- z3VoHUTsnSpAyl>{gU&+2nx+`|qc}Zr%lEkf6Itd|?ZMUKk~x#s*4CKHXl)OhtO)d( z6LgXItdXCrcV3~8Ea0X0O?}=7qS)v>3)1p_-)$*)0(QAd1v%_KYLtXU28R%5U}BvK z&&dR_b=JsnUJY?i2|5~MzxPJDp^W&s8<-5sJU6@;W$8t z-n|)l^`nsx-8fFyn~YRsy`^m3X^E$3ys9v&lH8d$pRgt zelcL0pyoLTK)m?FIMoShfaYKivCm?P2E_0$>F%2~_NWZIC`DuKQL~60GfK(aw~=Bp zt+7v3bh&MdB&X%h^*9WQW z+uT#=671fc-H|wLT$qDssqCmfyG7ZYMMwu?_@)farYOszRnmXec0R0OVMsDfla)+$ zheZy_0|#~V*F_+hTWWt!Aa25PKRY{C0K)kCzfP~AeP3jE;fKU$Lb^q}jFWmOTaToU z6xwF!d!!DmBUz(w))U}fHz1h>i!ccWl5N{?t(~z!$btO~2zndZtC0sbuo(G1pZovS zao*us%nG|s?;iCt34ZHk4CFS?HDg= z)Tj|kqE?lPiqZ0Z@qX|3=lA^mJm)^=KF_(XbMD{oIzq8dJ0lg51aMivlcFC^WgD5I zC4*PYiQ|K*VA8D#%|;s)VVNS8cXF73BHX@gevngRF?#o~4fD=NpD0?g*cvi=_Z=(=pC&Z+TbsEI`^-D(&TTl;LYyRrl3X~9*v|01!9+Pul7|#?ooOAv z*gPH@F(#9AS4f=YI3lZYV0E`p)yb3i$$6B75q3ChI9d`p;S-eDY?nbxi`Q;w4FB$u z)duPAp!UowWTTddpqI0bnpyXGBgd=MTPB|e#q)8P1G`Hn=Z0CFgZi{#Z^SyOS(;g> z;KVD$zEZU@8Dd+hS}Kbwemv@ufKOr!UZ%$;*0^J6z z0-lRX$MHKDw8>WQwd7x64THcnQ~hf(hx;!f1%37!L46}0D1@buh%2y9;_1#qWEY?H zL~yp(`(XdcPFl;I-QGJ1bFlA?x23j*Unv}XNh#QPt^48+JQvhz>>!Fo4Z>I zAC@9s@eKe8N7qjqb}Dl!F99wH?qN_$wqcx*0$?#M?yo=|&vSq=n(`n|MR70;FYyLg zpjW)@_!PqDc@i!yW{yR|?2UE-;_Lj_%FKg8+Pp>_Vh9v{_eRHCqe}DI!MMl0Y@=Z8 zIaFD8!O;?El@v5x=ZPdDhEWAOx=^-&sc>Ei0m)>m@7G>(yle2+wlgTonCUr{B&8_B zfiR=zjERQG?*b_<9Tz)TmrhAPTL<5D`t`t_s_hc@mb?d0oi6p3SkA_ml3iUOO6M~a`?$|XCq5rC4flx`$dNzLlvhaOzixXebFIKwni+*4DOW6Xbz z<46NJuri6)=ZtNPHR_`GYjx<^h6!xV=iEEB$r-qw0g>5l3w_i^%xF^;3H4mQ^khGL z!K+*H7{WbnaGn`Kx1#vWwd^F;mKUUP8nUC3xs302d2+ch@M_caC zCoO7~0Zjm-P%Nl&s|)Di;i&>Y=TasMwT;J%RT+qKFU<}izE=)^_*|;g+@TyBw}Pc8 zP@q9pCx)ZpRI+38Sx(jtI+9vA8it2IOgMd!)exE+G0!_P2RQR zJd3M$JgtrUnaYKkpCGpX3QwggwG**a#w2y(PK(1Ulz2sC`0aN81HDTjXR? zt<7n4_(^Gy4p^oldZn%PV7%s}FH+LtnR6dhN}(I;nY<-FJEM|&r1Q`IkfWVhZlQ%Z zr$1@nQw?}^C1vL%4035q$oPV*e)FOh}_%|I3oC~1emL zctR?OoflSGLm_zik#!by9oz7vWw841^*RG|{=ryDq%;22H^>vQp|QWLK>vGaUL>H% zM#Il21tS9FGx~pEfyuZdn_W7#JWC2WsAZLfmi;^&m1Ny2SYJ=lFR@ka56gYjpT*!P zZb~0X_ENX9tniUC87WHxBzTy)-F(|ibJM=%#G&`Hf@aP#WE? zS3lxj=DUjQaP@vh$yEv~$nyhuGLVfi}k_` zpWOY~r!2Cn_nqwP0-YyEJnu!^KoEUiv?UsK5Y{0X*w&X}<5(<8v`l~}Tg+!Zm}GB& zhNw5ty%u<%;ybT(+hQ>rEx!Pzr~pdT(~06=fZB9Ys`1@H zbJIq0g~$iH`tj8;Y5ut%8bz0e;V^%wU~gV{5vMTJEXfAT`poFOxW#{wX(P< zZl^mt>Vl^Hi3IZnmkL_uAM);HnIhBx4Nl6vk(bKl~>v=_Rj|ab$N%3Q>0*$!XOAen^{Um zNiZqV<%JjeRRZ^Q)^o)8U;E;Dc~e|S7tzgzZt@vWv+3)pDpfMYRrhT%ETe?Rq^uZ3 zrrlRDt}MR(oM^vdliU4ceeAg&p+02DE4a6_vU|PkfxxG{d;LIx5M4_52&3x@+r@*c z)=UgafW=nT8urATp8b0BOKSmJS&Gr@0&aoK)`=VNn*B|%mFg|(Gb#UCdMifJdd)RC zIlle&y9;T8kA5&2G_$ktIiNRPfp}k6)jT4&-Ks2NBd}CCT)N<1qk9HtKi0oF@;nb4 zIpMzw`PF0cXt@BZX*+l)c$gKJ!wV6LlB!vM>H$8M9K6|0*+WCQrp?4G^YFp!ic^o_ zo0;y1&)f#6oaqB{^hVnvM|w;@SmQWyEeFdqqHd=ann0}|X_x*Fl0GT_uceEjq~l;y ze7TYoX2btV6qo;>mq5H=zdY5=zZH&zuYz1VQ`U~hrfb2DouSqb4t~0E6!37VGod(= zDJ!65n44MJBJ_FzCG%L40kZ~iTsBeflRKX`pL6UNa9(%UT6BFYB1O9*&u}XJY+6>* zeH=fu5E3%csg1e!Blmn#p_6rA3llKGwCq4reCEd z&ugn@I?YymzAN@QRtIHS|NcD(E84+9UPVPkPX_JvWcwF_HNI_6Kjc$K2Ey%Us%bIn zYJs@{HNY#VP*K}A+wb;|EfziZ>symIs9kK0s8EjITM@5@o*`GyOSSKJ1+({s&NqT2|Mr9tz@WzNz0UAu=tK@i>Mf;r4=wBP2L=lIBc{uo{D9S$|( z&V0@R_NX*PB4DWc5OZ|AqUsbE#g(a!@)dD5agTp~p4RHm+y6V@!S11Y3!q>jK?O^b z+0C0-Fm!}>=w68sf`S6PzND#cY@5|PF(?V&qK_RTm|7rE;}U~J_x1IXFPrT#PsV#Q z6Vj$W^>@^luq0hkuLPJjl+SKkvt`Mio)swPe9V|!ZQ?(s8Y!wLm@pwBzZtztt@VwN zj)()3hkM3r-N*$wU>|!S1zGN=tQ-IFY3h0sr1g1qdoPlo`E6(H!x8-<#yP?0-e0e$ zmCgb4`DHDIQPxn$a5mPv%dWYQ>p@eH#Io5-=QB6%-Dm5U8_k>l*N3V;#ZYvE@-aT* z>sCxeSlAU+enA0MNQFT_@3`=kl4Lur1kFs#HYwg=+Rj?xQ3GYKZY$!1e@8G)W;t&L zttUDqXZ>tIwLtn6E)c;GVRq(s!a`|OVo>O|Nn$Hyzd)HWi$Ex?t2UR1d}k!bGwmsMxh4|3zuDK+m~NOA|GK)I;*U(2JNrkuG~Ct&aUToq z7*=QZlT>+c_cSx9;ur*Vrzq8wJW4%<=V6!LXjm53KB4G+XKAmuY5DX2EoCOX6Ao?p ahpjxhX}c=i{l*FAV{+BPuv*{o#s2`tmx$%>T0Q*lnQJ)R=Wbziy<%b^3vWBZmWgCa>dlV|$L!kE)Bh zeP59Xax$MEc?5ujE7vm<1ybF4Q8D7HD5rpb55xue!c4-U@GK&n!zAs9OKBIvx+LrL zozatpm>99A6tKeH2;r@+Uif5r=!jJN<^Zp|`9X>2P(dE&2L2tnzr8U_1sh#igTGyz z9fs9Y!hgH|>-HEFyuSOO^Tt0E#|aK6xuY8Kg$lzGgo8`O{J(ER9jpOF|5W7z9ytNd z?>gJzzn5W_6Znw*k1Y|AVp|fpC;8xi8~L-%JF3ezf0OLbpUmHJ@#7z;c18XD(SDV} zk3XgPyFPxE3a`NF$S2aSeE6F{*is$&wg*CY{`iB#W+=xAcMc0m1`yV#eQctS))xI=?I{t&%Um4^omrlS3*?Za78sCq;f@Ufm+vzq{3UXm zo6*hgTS?$)>ico*8i2~z-S<(A2q)8cHWei4piAx2?Af7(M7D&xvd8ZHLvFn*mYL>~ z00{LeB>0j|J_NsP#o#x&gTuIgwJK5P#BG(ugJLP@D0t!9;I)14aNcqtM!ry$o?Vvr z!oY6g8_Nc?z~Az&b%3mj$My`HYil}-^U6H?Msq?}g=d?q`)4P6vQ?ijcfUsf0+mW`|`&F%*faw^wItUPjlCgD3hvI<>`{ zSliBiq7%!1_TiP*PkO9jXn=`=1(-650~ryY#$Z2L-zZ3-wC@S9)z3TMA1+!ZrM4w@ z!A1#Ci_Mhu1m0gM3hpmdGmZ7yU-lmR>cnT(_~5HvX=QK)*4iJgG7|W7wUiTiEX-&M zJ*jE9?}VdqW%%BsgmomfhpeX)wO?e#>yin(=#uKG6ZtsRv?Ts4^jNX<^@VNh(E&|po~noBjZ zLhepl!dh_-TVe!enPVr8cZ=nwU0DTYFLwytx^r-*eFWs<*bn0E6gG7IWZ%<=;^4M& zeg-|0aAV?dUj9KWl;Vb-^-dLi9Yue!R$(jz(xHXu==Vv}oG*A=n5^!NQd-WL8CmYs zuUuD~YdtF)2VH+OIJE3y0`G1aW=eSZ3*$3xn8*1t1H)Psbj$Mz8{KK?XZ9wa8@(I) zg6_`#y4u}%xQ!Vr)}GeC%-)9$Kc5MD|J*w>SN>xG;6;9QnfvaH!My!(Q+02vowQRu zYOzv1^j@{~H8a!g%aPZRL*!Aakl+2-t>lq|H`*O|h_g^qs!#|tVXF<9e^=ZS6?02dO=6(i>|GdI=-jw!5 zX9(LKMXc}dDD1{3J-JER_p!W4Y5B*8IkD=GIJl3VnU6GIvVx%bjQZ)E@iw>hqd&DY zs>tCnu@4h|Ab2s`KRZ4-xA44wmF`A;es2Y7)z)4njnVOw@s%R?Nvp$PoK%=tBdf|E zji%7Nd3CO@pSDP?cCUgE@+`>?tt{CCtq;5fy8tOipHt|gad2;|nGZI7g4XVubLzH) z-=dk49ylx%I0LPunQOhYnhLKJ4Ct$md#w3n)VNNUJCO`LDKNNT*6dqjaF)i1Kz@A6aTnL!&$w;O24F@_3}v zRo0I>qBBL!bL2_MGAw)J4D8aS6b*%gMhkq`pEgIOWywP@=z7fDt{8hvKBRm$K766Y z8+Hpt$DBAIAU>#_FP&uAGC%V$CVy>grOd324<+eQ2?^P$XRu(uxB!zQJ0fis=T(as^@^m_YP z{q)+H@H{6fSIdFnzaAg!id~qy@SE-Mm?lw+@ zjgk*78R2FzZJp`Czi)$%IPl{VwD5omgEeSv_D{(ofn_nlml#6}hKSV!{j13rb&kgD zq-)n4Tl(b*37k70LrtnIQ>)W&UA_52=J=S~)M?sSuhf|D>-DLcA!J?)y#wF1Zz`WW zwAQQru+o-b0vCm&@B8Hjea-3&yRPkQcIz4|Z;kcG>}II=l3iB4$+BN)(tJ*S{cI>h z8XT%z7Mf?vqOoJl2&~u0cnkth(3~`RY;BMPLFSi5R!+kD*j;xiNUD~3rNf|mp@#>VG*_z$FzczQL%gBs za+7NU<&zJ|`S#sHS_K#bnr4B=X4%!dkWJ{No0925aq{+A&3sqjT+E}x@~LxKflgRP zF686;;l>AK^Rny(GucTK5BYjRYL`yR(j0J~801dm`4lRI-2c zHM`~RRj5|!4mY&IfNoOrJZI)^U-zaTExj_Vffm+ zIMqs0$<%&!ruF)y=h51o4WTzFCiQ#Cs~#rFGE7q^hS32I@XGGma=wojE)gcOtLX;N z&l_;98b97MFT`V`w(2}|MTv2B4uX3>p+(ZGfg!2LeZ&2E&Fq%p3F=yLvvn4lmFK#9 z!Zwl;#$!~Es+r6vvc1Q7GN2;39NEjr1l_tiyw4X~l= zJUNA4>l!?&?m}H`UyhnRBlVDlph<>BW4cLnYaG0XW<4Q+>Z1vKp|Ug&hg(N}WaTBC z(Lhgj6ihZD2Zab;z45D$$BedD1Z|sVJd3S?FZ<~{uOFV@(`%eWS417w9?LMOLYJPf zgq6LcR)R{2E(8b-+I+0-9@WtHD5PZYwEjkgc|PzTu)5T_?&D5#!K{^9on+r@nuTRNGx|pJHg@S zpOP5IAA5hEg~!VHOVCI!YxgFLm9r|RybuO8)^*W!Ei9M`+Vmkx&Sx84Jq&y~#2XWi zU{~|f*rmm&C|LtTJ1jBngrg>od+jx}R+~`rNVU9JJIsTzc>@!2GrOX5I?Epkf~)jT zTfothCswE?vLU--?dBwuc)^@zEs7QaHGZjXP`{&or_Z398<*&Z{SB1D*{jg!agSaT zNWRsR6;81YdD1C!HFgu$g+E-Yn2*fcf`2XYzvH{H`m>BNRxye`vGI_)$Fs288m3RH zlJ}l$yOLIEbGkXZH#k{e=8vN?DfCP7jj6_TRARBDWlxN05|0s5BKm4)uG*&j*V+v{ z*L1wK8guqW{(A7*YM)}mGOAqrYvCpHlfdCx(1K=w(S9>H(23{AJ~f@(=;xmulpWqj zM^cB5x1C8-}9DqKyl~2<<^g15>on|S&U}}Ma`X|>%WRQ_Rc@-=*Z9$p-fpK_pGxc z@2Us0*KpUM(%j$>o&}dqf>1ZF+2EC6LHAx=5avwbu$`$T8L6xl3PZl+rA_f2#19vK z;kE+V>s}O4qKrqs|ylh(5**BWH?bLS8>09$4U}eY-K{ z8iN>4??1XaQ)?CKEO9~hSj&vHT7=5bi8)n=m5O#yT|zaf)cNyH!lIIT%>wzmBJU>@ ze%b;aSOOJ784NE5s(l{_vGN97ELyZx4$9V@o3>rNPB(i}A4zTm(%}?ZzFdpNcogmoRS;H#OXmI?; zV151?G0oUxkBhe^vgUg>E;|Mb1B@$PnmWNc=fhMB#a^QA4eX6fBvan`6JAw11Qxl$kq;iIyvLH zzMYsYXu=_ZqKgD5CB&r|#<6*}Q)E9w=_3ck12*wWBuHK>O5y5Lnlkr-S}{CMLrvG4 zwMt7*;(i?25gTNf%1T(O#yz-kbvVrCS0Dk(rB=;Gd(V9L-VR(Iegqk12jEFXeTopH6@W56QwOFB zHV`Hg#AoCNhS#D-da(=oxkCw%#v@d3f`l$twEw}{?Hvf>+Zg`p4x2{S?2c0xG0CPf zdrSdw_Z*&zRln4R^T$?Bn+cFQ4{y4d)1z!!{3hHF9&8JDMPuG9osU%%-May0_aMx$o=?1R78z8jOxc_e96_Cff$ngp2 zY~$vrsW7cvqjd;RTgtrbJD1aRIc<74WsmqOIi*ywjzC#HaK|PrAa%`i!w&EH^0{cZ*eQG+^x?vlM;Fb-Adz$=hJ2 z(mPf;y-qc6F5Q6+AxhO4R%+>8CnKk+Ehw`}Y23b4h=R|yX#9^E;wwbI-^q#*W4*f( zno#MS$}`TyNu;Ab2f*T8@WgpllJXhm4bp1#?W%0L=$P;ti9tHTqkg=7#Pk8pHTt=o zx^p4k_#HQVF>VLGS0Ev1+e4Hp6c|gzdDQT=TQii}ZlBr-1=o9cncmMRtlK_n68>VJucwzjZ zpOEw0!F0s- zb%W+sD2L#8v_0%>)ahMw**b%NzNOEK_RB0A7t3F;A=p0c7Qm)g;`h=f-?p(OI^cxkivqX+* z#__4yiTfinL}V{^HMa_nzXTI7)YjOaSB?49m6&+!G`EgsnQrFDQqK^GaOt(yUDT}W zi<{&6Ojldibw5KG#m*X_9Mwm9ym#^ANY?tehML01*1lq9FNK%$ct0sI_fDo|{k#we z({tl^8K!Qc;JUMZdjk>yXz}0|SJOy~Ve{NEX3z#foJXUxCqgc zHD}-kvD4s0%^?Pm$eFz$Qs0xEO+s==eZ659jWM(V(mXwN}{ z%cp&iAEIqFvnoBPCWo-pRW-^`$<<2w=}d)5a1{NtN&mTu)k5p#!RM1fT^3Rz<~=2% zeAPtg72U@C)aic6_4;HW{CFYRQQ8;Sj~vWjq|{KV%vCUMb`(5=yIEsBPCi}D+RDI& zStEM%ofeyN11|8~^x7X9mbbPwFtmTh$8 zb>y3=mD8c_>J+(22|eqpzFBbiv$8sVqkJY%gRn0(vK|2)UtDMob2_1Lk$r;q-~;84 zs?Hv_sT8EOp-l*1DQj@4;udK+A8IbIpo(}#%7o{%b#uU_TF*3IwtfMWF;r2g5IASM zXtgDenFxR_rVx~62|S&ijjWsF?4|I&%7Pw$Sm~~kXCfQRAby0<@UOZ$mtcP08E#cFVYvbYNXCV(0rW>wc{7_3B-#;} zB%IYIi5jYJ16A-A11ZW*P!B2d?aV`bx?H+q<<(L$zR!KI!oSmCBVY$zpv%&(S-}Y4w zj7!4~B?m;m`*9n72}1P8!_W_)7OxIfqZxURod_Y@=|lnC7CtXQy;;1~{_gK5F0a;T zF|AKh<2>FfWEqRw?`_8rSJ{r@=)v@|n0~;?kVbJoK3Gng^=H&uv`V<&^Lfyg56pz_ z=#Sy=CtU~FC@rE*e7Dc-bo=1G1vey7Y=x*XX0;)D1JoUbxnc{5ga?z!M3!PsqCRb_ z`LA%hfoijGf4q|7Y}Q+|QN6pc|DB<#=oLy07Ezl6rs zAaBAI8JM+r{lPulX#bUh!*|=u?4?8g?m2hcnLE9PnHt4&o@1us^L*#GYXKyl2SSa* z7sw1Fo9M_*xwr`imxkB-xe6%Gr+~4Yk+M%Ps>!ctbr+u(@3!3$GaEOkg~O4i>gkLx zSo$|$HpX9%wC^$KJ(0%=PGK7<_Z$|Wd?Ty5=uES}(G8FjdSWMQ(=?Z!YLr!OG)WE_ zx4JZE@kQI8;KPDieMgt<46Ce2uM!5PlX$^zOqxu56J@f@ntjW~*3|f})3QDnC?{2P zoFoQbfUI-*Ties zV+rDFsCqWfyiQ&c44;TYyX!hwPjW&!6eGx}P_5D#>YCDN1HI?!|dfT^$qaH_nND9@!bEIZyO_H?nSS#%Y+cJjpkSkb9sT$aT=IN*eU^~bJgT!a0?`Z@`l z#~H285`Ku@C zKE#~N`T9Am3mxtdiN+sk0q!W+AY3ERa&K^rha^nzVsm0B-h4BO(TFYzWT#e8*lY0)rjx^{)1`>Pr97d;WBZhmp_hf7E5bG}ELEOu_NB7aeVcRF_DGRZ z+EH+2Z%iI24h>bgmmSV6J#eQohOGwNYZ(QMof;;G!046IYgZ%+Qy2Swjo3!MiJp!v zzMFxToLy%;MJyNe7ZMudPGWla9^YV-9`YBjIzC;#%F>{dnR-H|Zp%k->2h0V9iv!j z@2QfX*@GXRq4ECM(Cz%xs(X2y8~lw}E7G+UgyI#0w^Rdo*85`ACX@4 zdaaxM)Cq`dXC;_4RnS(AQITyQX8}pv;;|e(Zxwrr{F!QiBv}i8DB-7uC;HW6mTFKX zzo3PN;Ew}5ok7m=^Ov7(qge;7YDQUECga3lne*x%T_~rUY8c^^niJcg7R`sJH_jV? zo25eEQ<>N#b#{oWqwf!L7Z5jaQ-y>nYBUrao&MSJO8f_2#oIpMbo&KSB(KvDRo`ig0Yk^mN zae0I5UjA%+m-G_n}OiWTur7#Ud9kf zk^FOp_YK_xcTV$w=dD)b!vGt^98+1tB-6Z$8|ee_$<4zKR);SHv9s8T*p4QuSm!$; z^GyVKn-ApJ$U`*akb0>9$f@m6Nf5PNRL(!{JBpoZ%~HFYc>$FZxj;=5#<-t3dFbVd8MZluK7L1fU-&GOysv?na&@-x(BpbW1nk8d zlh1B@VE5X<()uwJlh>%2RX!oo$J8R$eg)5YnzqLO($O!$OVbuj6GOZuNa{g_4qfp{iQ#+(oTLQ_-coi2IC3OV6d>rMod*v=Nn&$53Xc$207hW zyZS^;B?=S27MgF`cq$6?Acw(KLKR3SupTy#PZ{V+hKahFGOHsmT9io8T4Q^~p>|r@ zd5haq@}XLmvU&OL;Z6N#c&ZDR0cs^F{=$oeDCMljNrTx4J1OjnGf0m0rm*>eAIipR zJKrhaanP;|e^6Z{006sQjP9Ol%RcH%!aW;YfA481k&gNbK<-SRIY{EA5m35u=Nay3-jUm{#+9ue zQmH~Si#}cJ5cmlgN2M+7^0&Q&BX7-AfWU8k_EzEwUTl}OC6)~#XE2(`4rrDB#FpviGWx86}=fN~gHAJ0kR-q<=Q+EJqly-fn z1)6B8R%8`iT2+ctNH_ z1eM?Hz=5ZyhH24!%EczEBmXJJQ?c1s`};teUc(EPc;5$JFVocXwp9zhRWI7kM<}%M zv~D#W!z>x}&~x9WJ<^{iTnju!X5`+uf9W;@SGeX#6+pYj53eXtqNKqZMM8ud?9jBL z*NDC7Ra70r4tGkvrhn!*-#4wxX&Xd*4wKKo+x#}1p8+z;v|`?aL&Ettnnrv;tHLnz z+W~>*FLf1reJ&sF9*#bIhG!@ts(;Oq{@6Q0aZZ9X?i|DqAi?G-q=L~5&9m;KB48x!u_+nUw z#yV8hQ+K;ASO27p!aU@HDL{DO3Z8$46yA-+>^YOUZS8)+BP5T&_WlU8){J@F8-0P! z#SCbX&F#ilKAIxlr3IHKrZ#*Iv+Gvg5Gz+3>hd;;4py>fwiN3l%5*}9a2eP`n}QAT zyv9V~;<_?A(JdF-=CEeITzCJm2OnB&edI4KC>+@ZftBt*8%C{@1bHjnO9Zv!QqWOO z**ZSzO_r2?!vfXqpxX~2Nv)qK7sji57%f{ti`$W+K&wTuWcw#hWIMK_L5Tpu-Eo1~ zQh1pg2JO;yS|=8hrI`NWu?_vk!s8?V;|f26i`B?FpjG(Lxizl-S2ZVqbUi^xQ%l0g z#5dG9SnUt~Br;*pF020p-$6>-EukBwr+}aWg|Mp)XW0wyL4s)Eg}5EDT35jhi!w7` z;H3jDu&FEsG`WcUFvz}!e(`7Wk`b43kjGK|%)P_SMl)*L5M}6b-)$-}iGbyO!$#A) zYC!+H$YlHB1h+!MkMTbY>Kl_qOVc6(-tkDllLHj;x2KQ54b2X-^t0+Gra&LL0+)i- z^&OEVM#&!h*GK)FGu6-AW>o}Xhc-VEu^x%!{4kpS8p|Q7%GuJpje3KJHU4w_0NHWS zfyb`j(Y6Q5!eu-hNsY^V;GjkpNU zxtrfIS;CH-buW#Y$)S%KIx$4WH=*_PbRJLAHturFR6S+`E$$~0}M-nFR9Zt zLTe{KC1JThD%Ua)R;r(J1cxcK7UbSS-4Vq}Va=+6P-n%LTW|f*rXod`tP#dQ1 zACEQbd2Wsj0d9CM#C%sZ`qtrkX}!tOig#Ak zNYmEPO!5^QLjqKARc93zz#!d2_2KLzfYXZ}A2+7V9n-c9ir6OM)T2HJF}C0hj`7-n z2Xqains>Ob$gdz@g6|jEmgiO$Iy9Nsq^Ts&4ingCpe!Jps*X>M2u@^XoN%qg2Fsgg ze?AG7Wa%Hs>Xp_51ppW#kc@t?!)%exp_+UVhc^-Er1J^-!0`b-&+{iSKrTi&fnNsd zyrgqu-s!&7GkIUd0%1r*26G%H07Az`aS3%5XWFr2{OU9?;53u<&<585>SCjmfvM#A z#ifkBJF;ZGH8@h^j@+UVdaG&!CM{jx>TP`_85fAZ6vI0cHG&IN z_m|M&^_>_Pf(w{EB^7?x=z44Z4j5kNP=An~-z5|g7SxCuVgM+{ZnYwzj9#%7`g|rBy9#~w{PS}N7R%ObWLHrd zR(EXoYu(vGWncIi|NAb8URoZ~WE4MA>m=OTep zW9Is|TG)&Qf00jvZWC`y({em*YvX}m6UR_m|B;4nAALI^A!KMlu`V5oBz5moZ?0ZQ1iPI+i%hY$qn3LPN5Ro z5z_yFRmd--?7!ZgeZaE0IV|!i{!5C#TE@1AC7aWnq<($&+XLh0J_|C}N)XT@{_o2E zRrehsd?G;CN6dikKd{s_A7EMU%6}B&|APoLST_2rpZ-X$ziAcwJi#1yu`;lI)cKEL z|DPN`Zec}#v?Al0_+N7Uby+UqmkbooxqhRA-@t$MJ}6Mf1R49fD7S=b^B-=wvlk-w z^Qf4qVS1u(?Kj_|v82j9&C-GnZ;kjD4?3Lhju$CWaiT^Ia9SGLc3gwvI@&9Lz|9msO$DD%DHRV$L zU1zz;*j~5pF55`^yXaVL;>Wl2sjU7kf!q-VwiiHl*!8i*;J;t?(hV|?)Auf>|6PJ` zQ*4#Fla~m)-v$-VjdJYfjf4L)-rv;uf5!X2k@sJb;{Qh8|9`v9aOaNve*LnZe-Prc_b|t1Q6rSGIevzNF|4;u+>)|ZO1fnnTs|BMhHlt$Dv^^eH*EaWAczkzI}5YyjWyCMH=tYfT>AcwRB-RIJ^J!{bmyCn+7n<=_&yTk>wU`qB6SV&A2HQI+y;wtm^^S9K z8nSep96RRc23G~Ue+k*yYU-)9?F zVb_W z)|tqy{hWeb8Bxh;(p00>@IrpN>e%VSJ?ySOV5V|_N$dBWyp95I(tuz4*LriFhM}5d z^-Gh$lVy>No>v#%@H|la=abd5wN2%BBpo+$cC801F?Queg@ZCX2e4sTxI>OV=A`E?=)h1#+y#;1wlxEcxX;P6 zOYS#JF5wg z3|8heaX}{T5AgE!x=Q5Ii*Z@SW^W8zCUmj_N=i&7R)#agx$_hQ0E1@WS9t2M*7Khb z?>`r<|L&Q8&U}Jy6P;q@=pKx}4GO|J`_4KN0O&w-F)L=-R8lFi;^K-) zH&FDVR=>up(bdP5(e)VRcC&uPeJiJg<>nZwgDOy$IxOjcv%9KAl)qFsnZk zzp2#OcDzLshhj8Cb-A?9$vw5lmvbM>*|6Mm50f4zU>s{5Bylz@yKy&9IxG&L_G(yr z{-|zrUPfY89ZzYdbrvv{FCDkpc9d&BTVp^lzO@$6Af@>^Xv;r`Ju7A*;Cilgl2NIy zek^Fw{8QPOd#a#y4cv2kmQBs{EZdeD7)g+!oW#Qip7>V1`!oPHukG!!=5aI5t+{R& zGwq7N;#y^MwUaU0ZXDSYZLimcnnQp?G4f<1;tIY3mzO7y%goC;vz6{>ek>0@Hpki) zo(;&>>LOV!P)DVeZMiQbV@XJV)6S{WO~ytG$C*e4mDvVoX~YqP{2{DG@x~3Yt_9hP z$EgHyZeBBCOk|`&Vj3a%#0V_y%&LfZ{;i(y$TI%h17z>(uyGJ0D;YCLqu>Ckf~VrE z8qF~{nBTcN8`&24MnGxutgF?PI|Hnm&6oMuOoDY=mr@S81zYmYF=_Li+vztndx`m) zs=fTP`E?0#w@3<=Ah0f8Um5SEI{Zi%u8-`6-bH&3ZL|bDvd$+vWfPMAAxx;#7@>>0 zI^f}?zAafuYEAz%-ZC!k(Art$31x`JOle zG>YERpOdIXG&a?)9wc%f%#t2k^^KM1tCyyEF#QQ4|F27OBAVSGU!g zm9!H){(TlebQ2|;s^#HTO+a43N7~Cqlsuxc6D0;w!*wFVt+hWc>@^S`Cvb4nt0u>0 zP8m%ZQ#*>0KITqvbZI3YzWbs}x!@&mgL4Qo5#s;*qocBhj+h z%@fFes8ySC_t4z-UK@Kh&uVL=Nx()IwdGK>YiZcfDf;+`Myo=JI3C|ma}Vu%3YL4( z->^@qU=stI)$t~!x(^{&lL^>cl=ZM~u5i(v4n2GS+hX?mLy*Ra>bX6__BPcZ&CvjC z9I+BjkZ!K7zcEu$J1(%3n*^WTV0>-)=sW|N^s*ElpsS7CLY(L>v4%MC3-%ROIFrg&Gm zvns1q?A#A9?)2SM=yHQuKF}OLb+$ICr zwxDf?2KB%F5RZzfXmYoMw~tT=MVi>Ie!z|H?^$B%Uu1b&pf^YDQ01%^Fju61J9^I7 z4aIY*HqTDBgPmz=|NKZFkQ~PNxf2ydw=n!XDpux_U@Ak+0p8+3`EConcj4~4p~Y5^ zL`<}KDeiV!0h!2oDuV^($m)VQ$-e8BY8gm)+LkwK|J@3sXrqB13q$~x)e|_DOvIy) zX451$nrI>lJ4(ZoT-S!+`Ab84jWOLDF>-2;%Wga_TK6WQ;^RZXTOT^r26P%Yn27{? zDhoX|etGTCwTOB?v zHEz|ZvL2)uEKliw`gZ^&xB_1|1pyO}|8DnqizzDzeW&DFOZx0`k_|tOkx}wDfU(`? zrk{jO+;BHt|Hm^hq_9|z_nWxVnXc!xSn)g*nrc+i| z7#kdP{%cYFpJBiF8W*8@P)Ya1^&gaEb{`9)^?QcZ{ln=ZG5{?-}d_v`u~ZOe|Dqx zWGuXRb}*OoJD?sE6pe*5|4+dG?_2N!GTvZR@7TNAKZ#gg<;I?0K{k5wpK0)-1<{X) zdn(wykla8DwuEONmLppOQ`k7xlZ+dEboor1?6N}3($_wRd3y}K`>S_9GLU2P#gR6ij7eXDrfqTv} zF_?bCWgOpy{L=S{7C?jR!yw*xCr9!CA;@OP6d}HDVeU%)S7&TcX}=U--@AKApYY%V zt0+^2g4KrubLg}yH5)VYiz-WH6&y~kT`Kp#%pmvnW(~U*cA~ni4`uy;7~42>5n`6p zV%4BnlGw577P8@2GB>|7EPoQ({pc?jaEA>yN1AZ1;jVdzGB7Vcpp;eF6#$B6C1WiB zW@gA~CCokG`YXE=On7&Mkjr0m)P~AmZ(nbe5lE}FEZ$@EeJt`X&BWe&lNEYIqmZqe zTk_060NAX#F;X{H9H*cQ|MH)487_Fk|M{rRJtu_o7(Gy;=F{3|j%E{`w|~{4$zh%y zI#3-UQ~gZgLzQ_P06swvq&@y~2hg9-+zR+S%yIrLcbG@hM0i?sSYESK+5g|t=;98! z#{9eJ&`eUhC27%rmh`P$pNF~52PnoBY#dg^IZAYkZ~x^ia<$rJ2o*+SuCZwmlV*?3 zp_%)M)XFCRc9U{CB0-AG z)?|n@-r+NDu%)m!6@}d}i>DKFRDNOpx$7X30Y0=D#~k1Xd}Zwc#O|PH)yNuP?Nj9> zrj*Ip2+2c~Y5qG0HJcnH^VRF2O`P|wW%2da9U{WNEZyEoL4-YeD6Lw-K!DROjk3{D zJ>xN3*tIm*HKRCSO$}$mlx+k*vCMS591H*=#iQrq+0-7S3KssFgDcI{6ie6b|0nG2 ziQLEv^+QFCF#fCCy^3moNUhrBd|0?W579vHNUq(yD!Z$I zJI3Oyjv0?1trZ1x|2yzz-(M8(DRR2~>0cq9`6rQ-UVyJSU!z>r}Oo!x)Gnf9AGgnF-7sA&xf7ykx1ZPA_*?341k)t?BFK{F>_c8#nA zER3bHC1$7$1C-Am?m5{6@cUey5-+P9SoT_8ObxSHMNpkcl|4tTAr@uBjJ3Jhff+Bc zXJ0r*OFA#-*I?I2_$ht{Hp5wo6kURFZRW{vvALzt(OdLkRsJRo9 zvj8;xbdz%?s}PFZAc|2MVB&iem)M^?qbBKzit}KQ=vNb>KZqa}PUO;jLeM5Fpmp1q zWw^ulUp>Q%JYs4%s9c5+g!4tMSsftVNoH^aGxmMd#$)=RbiolU>*rEdX0#RsMU4MM zJJ@z_&()im+KnisiTGo8=kjm;|LFSapg5Q2>zjlKgg|h2T{O76ySr>~clQv2`{M4h zxV!rTi@PRh@Zb*Ll6&9Ze_z!Uh1J$G&rJ86KHYr=AM^Mi@FP~f$gVA=STDnUL_D2^ z@=H$)2o_4GTwOZf{_KtBjp{VdG)sDD6Lj1iqsXcM1ykBN^DJ%Ly4Yjc@z^bdH84p8 z`7zIU4<+~I5w87Rk3Qa4Ssy7Mp9ZzhM-H=w)$1lBFYjz z9T^z8Vldx)v{PM-OnQP$NGbq*7GlmBggP<}PLo4wsx9&^lhKXg7m8%rVM=b|?X zo-Qg#xK*sMDnhDo857nVv|egkya-|h94)mS9eR$>S8q}+tu50g(l?B^lZi(qUi055 z@)Pk1>)!%J?zdHI?4EsZ*J+{Tunr_tbv#cPJxw8loK0@8D^4diT?45K9FJjwN{=q`Mpok**$_wIEtZkblDNXI{0>ke9k@uV4ZC znwGDcHt<|>4i2y{*CAaquI}ik8>P?t+#?U4VfeM2oMq7+yh(T$z0#TPa`*AscckrB z09GGa-w<3Roua%y?r!fguDKb6M*C8ul@G`ys7J9L3qNBnO; zqQ{89q+w3T&gF;>hgFN|OlZ|(VMOJU2qUnAw3q*`OTYB|d}D?Sroy7!=B)LS*;s^? z?$*Ni-*!(Z+}zo+3Bl`RDh1nS&!f~q{+#ec~m06tg3KNycBs)iE zHDF?Rv~fkg6nvhS30&)bRzx6HWMx=WtW69JaE*7W)6Nb6_?q-xgtQsf&a% zFe$DJPPyPKo2^yPbz zQDh^*lP_S<19x`G!IG~~N$A#1z~wn}mG0RHBxim2Z`79p$V3U=s$LQxPf05 z(aq|=z={4>Q_1PAcdpqKH;d77$34!{j_dk&*$`?eVLvH+XU&a4egKRX0r6_ZNnTx4 zle^@mZD85!+pcmloNnl{bVs_Qj);aa7f8_oHh>?G>(NPLw$v~Aur|;TpCDuzn&hFE@|vQ9c5fOif0NtiyECJZfhTuE-4tin=lBvwWCk^=(!p zQPaF7@3QMGRH~K%EPY2I5GhrdmI}|z(d@u;93~|&F6t3ktHt?<1Xp*8#66ZigS#&7 zVsBb1=lk33dQ&;;N^sS_=EVr=bo~Q?2b}~G9`TC|A7QH{A@$L0e%6E!pHGnSX!7Ki zaL8^o@_)QRQxXi@T%)!;A0gj!QI{p|J4L-S+!?#o-x<%K*J-d#h|Lo~wsKqk$dh?X zJhLv~`s0n1wpI@uJcU|GJo8a$rAgTBggh+4;kL_h=XmHoz4?3F>)j8SBT;He%dw&L z1zH3sWchK;$qza9%ksloG+}-%WbyU0#}|wFV;{=JtBU)UkMfMDK9?*$u#CY)97|Eu zNQ)XRMeH*dJVKNCfc)DKxOd6FtX@&Zpv%0j&;x~=MajH={#fJwgt%DiRNBWZ68~M+ zjN-9nJ$F8P9#v0z01;;^AD+4yORg`2Nkx2~=F_P8TJD@(+c9ot;UJeknVAG1!}QUn zvme2ldYP&gSiiKw>PCnCJam3Pp;M~9M9uoO6%?2cA!bwD)(?utHaX|G+*_UYaru$t zWITSn#L>D3aQWFKG=CrSu|>|yh>JoZ>ToP~@0Y8bJ_{G<-KXDF=YHuXagIeWQiydN z{q0{M36nGZgO9ER4sKn4;>z%m!)1Vua6}AS*LEHuIS$ z*5onWim6I#lh&z--h3X3wj zR-e@3c3wz9(s3G&(rYExnJXL9VWA!3P##4T!4q((VM44qa0ywiSambqnEnx$G+LyQ z8gUP!K+mFZXbO=@@#Y>#!m$|aq27gh#UeYflqGe}rzK9RbRIwd(TqmHm#X*&xqtrn z4p(mu>ITDF*jFwnhktq!ISMuI@yj~^)sq$|mD~YwF)M&Or$&Qb;F!*TsfG_4-*&U@ zJ&v0vv9bbsEH8-sDnRG9?d1Vk4i&-m_dbj@Xzg~+@17}i@EnW|C1vY z008>1=uxJ%iCIkNH)N^r-Qmt=C2Wsq48e*ItiRdbnB`e-*!ui#a^>UXa#3gDE63zp z1DtO5$FU#rG=JCNE-2^!obZJu#C*{_sP_~8g}-bH>zMPr{64-ZaK1vvtQE*}Pp{uH zTJh|)?D`@?673`KY?z+mAs0Nphu&!c=So5zw?`243=3!^bJ1A3<6{nB7)HgI-dK)w7W`@gruYjMUpxf?MQ ze_}T7z(@7S>6V!>BN{z#M&PqEsa$5R#M392C08%|>{^&FlQuUS_ZwEqa5k&4K7?1v z(YSnaY4dFlmJiD_aOHTk|07bnQnnW`j_qA}Uh{YNcU`}Is{J|z>yVI(O5bGv`4i5F zFn$ElHICEN+v8{C0jl}yf8aOnW%kkGw+rFn(pmUoN5kvP7iDeV!VTBcnwGhJjp<{* zKNzHw$CD+ZK#NCsa-0ji!d2IaCgd?NrEZ;Op(=aKHS`(0ve|}38e-hduA<|sIeI!Q zMoR_&jp~vak6#pf)`hiDN1o65p|w19HbzcFmq*ho`~>{UQG`5{7Sn~X{Ow)~#7Sex z4IU$y^UgJQ@S3%hmD2q*3d?Zusraja)SuN^I4$b;&7Nn@mrGOGzi64a0{p9m zr4}}i1taS5bX<&}q)iw{{z7ubawo0 z6ds0kQdW)Jm2D!X;GK1Q)m)y~DA)DHDQ`d=nGL4UaRjd9Z3_X@9hhGi>pmZFx-FGK89B%NB)ruQO}rSGm0(tY%pas#nlFSk1EN(RPiRHN)~LoT_`Pq~v_n zxCH@8(BQbMrYCX#rM+|YUp~no!{`3$2=(;0pl1Eb;9Y0qk@KSvQEV?8r+sDaJ$bm3 zjIDmFrK4@y*Y0vbF0cLkl^D1}i4hd|FYS@et~GG*58FeK>7674)KDW-$M^4albTK+ zN3FimVmnki1vcs}=k(?_q*~FbZ-xGGjjXX*;@KNlD-|hM5UBT>08v6$U*&ksg8h?V z1^k}6Fm38yUfnn9scwLpet7adhvN|vSVJUVjZhXGJnC-)gTyUJTwrtLi`FrW<@f<( zJgD=B0@|lPW`HVzBarTC<Z&Om1ZBucUUX$w$8>8CqgREDp#5XX;OoAFyKC1}( z;Yl(>Y)8T01JsUf9DqpW^euca#TU4^On2TBk%Nr<<~P*;v2s6`VbO=j?$aOqEdmY8 zfB7e3x|b(dYWAu;ay?ihruve{C!KC`eMFM9>XpfPf6$VRM~MvDOF(zuY+GSIf#pb- z9X8=0cyd{>c~tT;q|NCTxJC~>RWZc zzD*bTHv)l`abq)dIVmDOzxsLhAH_@g8ksM-&g{hh%U*hyVlvN>AX)}<8%tk zu80Lw>3^vg;=&j7qjJJK|1WO^t9*1X?#@>!l65@9^Jn+Sf)zKp$sKC?QXU$W8zs5TN%p_4_nu{&P?usuTX*Tf6CRW98r87^SlF%|nDCi;IFPDm^~CNop%Gg^P@O0$7nDKsFyB zdy@a-RQC1p4JEcQs@-4|g;X46!ascF@Pu3xL+KD_?K=Ul-B;KWE-uftrRDpp?S=t1 zUGLoRjJhu5f49R4Gv-|X1Cbzx6Bho&Mv`;ACd{<3@U?`e>6#R>zog&cmBo7|UA#oA z)i8elRGN_i>-UG+CHhs2uX*WbH{94xq8m&+MT#J=J# z6qTa*TB8shI`ZOv$St&dW36{D1y21S0y@p7r!?Z(ir&|rdob3n$B}6vp>VnU38`43 z+@&%%FiGIQXh1s6`1@Qhj}}bP#c3YwbJ6DT_u*fmE*yWDnHE_(KX$$Zef>gLU{r4? zw^3iGDw`H2o|v6)Vx)a$T5n(VS_RmNoMNj5hGqnyNUT^&k6yUTs+-lmm3alQ2@iS` zqMk&G+i27~l|X%%68%si)F(%npV#XaWV6D4c{LC|WJi>USa=%1?gL873KUXemeM1BDu>0-$Vn-^zq=xFUtCTo#9MM1b= zf%vk)mT5tbP9vdX;Fq3R3~KFGI1-35!p)nVf@N(QtZ+zr-$zK>!PUU{0G^c0it!V> zRP0oerhRzVTZlc#X0tz@lu&+SS@o#awoz}bNbVW8{q7TMW#^ikU+w&j#SR_s%>>zv zy-P#D@_ri+p2S%2zw}zttmm!DpyDBS`hNeVOMa2k? zA|nDNEHyQOP-EKaRsbU{@!$sZLB$#_IBNUv3)(5FrSB|Gn#yi4=OSILPTKDE zR~KN-|AZCocf&2?D=(JycP!k&RzB(IN6ZN_(bRGoVPONGAfZ%zR(1B4*qXiIFuK&QVM!l$L{187Q z+p7Mh<_DRapz^6Cv^#G{k1lS89iCk&5}y>eAjI4_j^6>ISRz*jqNCtCmUbW}FR(qD zB?Un**WMH5YE))&Zs(&_Ti-g4X7UxOCAD7L`3(+Ldl_`TLGH%0>(FzHswgWObbij( z3;y*dFRDMyu3g3Lp~R|k@aa8K5CrHQdd}DaM>Y^K*t`q;p;c?v*fM^}v1T~n{s?W{ zAM?1n#e#PD@!r_4b_}o+dTwQ5a~J^eJw_eej{~s|TqeCbe{RTB4~8(At}Ss?LsNK= zi!yyNgOG>8d&o#tlkt=zIAwrun){+b6z5;OuZ8|BT@LpqzlMT^Pk={|NQvE4^ZVed?X)1Kx*KleE49qDj z!ym+VLBGNkz+`N@U|s_q=C8V~Lq}V|0yKh)(8vC2^GQQp7pMz1ntInGB~SPC5ft z((&tN%!Ymnxj*$M!79{p;|4{h)H^JC+U=`Hk9h9iDsc79FJK*--?M@~NI{mWSe8`%jj7KW;d*UE%sh(9w> ziP-w@GLwf22Afcdk?TnWl9J&fUzzwR*kA;l%Pj^(HPMB@hhs4znwiW6F(v zs=3}AO)0!ip3FP#dc6L%$^q=%jOLFx_w|ZetjvT9wON?Rxj8q;r})YorbbM9 zDPp-My+bD?f;9a~)pLIbP(CyF64{JG{xBv=2^0Z{03%T>{Ih&p|g z^31Ps|8(fIpr{?TY}*WvEMPCN=J|*bSABVdrXX}OzI**Ev-P--mXSYrkkI3UUB?yk ziY-S+$|*f7-iYNk28R35Hr5xTJ9J&|U$=9%9sg%+rdYvv{%c12X8Z zBdkO7M?#Cs1r_Eo%GfKB4A4-8+n`$s)6iKgMYGC8D2W`r%9HP1$noGb(A7X(1K>2uD^9kotZsZ$r6x((x0YHd`vuK7WMF;M0- zdOzUB^oIO4+7zz+y8FH9jQ^YWf`N(tZ(Mu!*{rfleOc!RB5)|^(sw!}BC!oxEXAW5 zr0$Ob%F1NTLz5Hh_=tm6muO1+R(NwV>{qITI-{H}lq8bLIv+?)f5Vr9`ENmTtgfTx zsv-6)USs&)RKlRK=j=CE9Ou&5xobQ8_lJ=TdI-=Cv}l2`HbzZNFQ`_n<;WqS*BKz) zW6a}bH83d|5r9$R`*e%td@}b5R|zDMz|dArkcU zN15xO_&e z_)OVKv*eiLRL#S}!B<^5aaE*GOqh(cV(Yxf%6zUrX!}BR?nGbD{+Yk2Dyxx|F55~r z#w}<{2j!p(rY-{(B`HE+OQWuz^Ff;_zEUr0)b{bG?6^qZuOF3#y68F9C`^52JQT#P zOEk2zVWQkrWY#w6c@-Ol=QW~CK8+2~hk~rbFXwY!Dnfvg`=uPPS!|-I1s;p9VLR<_ zMi(*(#L7m-(*PCb-m*eNMZ?yI;nGM6<#m3aRQe>RH0JPelAGz8($@@9Ssd|zzV zWsBh%i-B~#ah}7805pZ?*#;K^zOOc=#Q9Le$x1umMLdYt=KZk%Jgk%>wv4q1(93gM zR~zBZ>Nz7>yY6iHhf0ole&Ij=L!1KhKNNAMN171SPi{$M3H#^q@$9hsvwMtGKJ!9{>Q4G6|rcp}>xGEq~{esQ&Y1jU7^3ib$3D zmBNsu+pq(Q)%REVUIfL|<)|c*>egsEaVL@e7@acgtp$%Q8et_727)>*tmV&*O=~;ZGX3C zVX_&#=D5WZnB#Jy|2n?#p(V%6Q|IV6O3PPk$^`|p>UBaZY z_(X=%`u@)`Wn|GD7_YoSjmciEMaXgif~v}LcjQN6m>Y<5Hv(1FDN7q}HF6Fz-;=V9 z(Bep`{SjMX4k|;VDsZ%rPm3Q~%onXdRb-N4w1ul&S`-)iDIM#`N#CzBPKD9gQ=`BV zbFms93Gv0Cy6~07jB7jKg4k+zTtkYoQVpK3yS-crfGtK(;{ryL8x%KpX*k#dw$^D3 z84QKn`b+>u1_pNV74GZ7Ebo>{rZx9X`ZDeMC1VWe%@q&Vc=+ShYLWi>&fV7bj^V=s zQ!=R`s39+kHnMDOg`Ay74#Ta-jgiWY9f6go zf|0~fK{cD53d3a$p!Yla^65g#ZEa=nlRP>I5%s^Y(cJ8HL;&bx@(X<0^3CJK{R?ab zb>N+o%|O$D(yY)AXyM?=YSZIllEw}@)`~>85j)91Y>6-tQS4w8&<^J3=EFi0iIEZC zd07IQ^wht7Ed7k0*bAyA&y;Do)Bb`k7#1Q7FkIM*Ns{^TB|2WJxxb4?tR`VbPYUP& zNO6)$Nmo7SrZ@qS7Yu8ZyXT)U2OWorais8!4Cb>!ZzgLhR$U2{6(py+ud`Soy1mQ= z)+2A#$XoBno>{~fkOl6r`R{Jf(w*jTB9Tsmb?kbE)k?F4l`Hl69M<{V42qs$Dyuf& zaTE!B_4(&NBFNxnTg%Npw5Z;18F%3tGr{6*JiBEq4s$6*X~!+Nt0K=$L@79XO$UsA zY>TRQR;w%u0u~XFan2)j*##@!ow2lNfpwo~NXb;f?*E)kc02qRBxweN0U_AyzmME7 z|2Imqq4)|@FxU6~^RwHA??mG z`7Hl?u@jH<371nBiHuGyaaIzHGvPGe{#m*@C$|k3ythb=HD1ufLa?2{HZ(kz&|J_R zmq@E6vpP}vOkA6qF4sqXsij=`hCo#2m{ml|&tS%pS1(qcrHD0Puq|98F0pY>_j2u` z$@C6!-AK_$llzFjJt-_q+Bn?7qt~?uQj}6wqyh9KG!l?!O_LHN1bKVd7i_thvhDSu-U~=jj)Nm`UnaxT0jk zq7ZB}#2~1pHUrAn9_5n4jabuxWb4eOJ9ZV*!i@+NtF4NfkFJSl^|3ufhYVMapa^4D$GIFwx^09$NHxCR_f?R^N&;pr#)|n4yQ(Ri|WkjEjRWw zTfM;{0xjG+__umu-Zh~TacwhhQY>Ir6{$*kG!zmk=@nxJ8rwxNNmMLql|+*}8{K}n zXbY7b;YK}%M&sN36rbfOq6{x1VP&K12~GQ%Dqt^vOW5+OVEibTgE>5*-#d7fR`oIY zMx~v~PUX!Jd5L2-wz`C5|1m>Q5*XRyRBY4kg#F%z@2c(J=(Vds=*71Niy-vo6OJ;L z`dBnXE2sly64YuBYX~q&BxGhH4C*~8Lfz3~Wr?A$m17~>Rb<3Hai(vY3t+bpEoV|5 zQ1|coGeSQ#QXwB`Fo>jt$nf2To;Hx9SU|KT$3i7~hepPQm73#+n^~a4mL0}5Dusy&O-tWKeTsA;uWTRXrFdA75v3J`giw?TC9!09peQj-5=K)x z>C(cg$B^V@7ZEZ^lP}>}&GhH-vuvG4hCf?d1{uaAp?v{|W!5u8$>3G5Va)@@x`q$8 z9$d=%>Jc+N{2>K!KNB(5m>ti=ekeOg_K{6yY_Rz*81qm%DI3{bI!&dM!9vy8M{WIr z0{8vKc+zX~nmBTG2!@*dl!B*j160~sd8dJ|9xaNep?}!|93AHV-1NMLIcV_yfAj_6 zhc8G=gqem%e0AuX=9P(eupfOpklWB+{$WAsW$y7Lg+u#ld2;Y#)yGptME4zBa&lk4wRU2%B)SXsnc&$Ox_lk0fZV~J#H1p zXF=9OfQWTs_R%8u(G;>GS4I?pMyJV2 z)4|r`W>~DXh*sgxDbKWEMAuyX%AKhwr*lSRg*qsUHQH^th=pO zja~vM>BjvHVHhE5NeK3*h9%(7r-PB7@WOtg<{dSWAs~wmm1qVX+V(2yYJZo8MAeMk zb_=5SAIy)b`+H=_<1c}neOQd zZ9x~OxUAy)NL*BUkFa~+Ke{7xsy~N82RlQ7<|N@b0}9Nw0bX7@QjjMA+}*S$WAG{|lLHy#_a7Yp`ko5rwcbC!{&V#|KAYz+ zpFN(rs-#9wVL0V^y=T*h+ZrEf(V(RJ7%2KJG~`>J=|Xjr>2p3dQLa55Qjzg17p!%% zG`*F2it!=F9wj;k+eO1n8=2D~56j|D@#UH!Wen{o0KH&oru*YXnKsaCl#BgkWD=Ag zs=3;XxvIXtQO%ip(y$~sAt##`H6eO+@jE4*On`-o9XUo+ovNHhiVBHTny#>ip?ROhOG)RDTcMG_vE!b^@rdabg7JFa(pS%Xyf-VK&=8tWLI*7)jUJI92jGa zvpCbHBT5NH3R_ZE)T+jqWTddQkVIL}m82t0kz zNk5b|-o{LpEvk#4b6-V5$+IqIpk;oNtC36tXp~|!TSB|lh^Le}^!!CM9Ax5Z_$Heo z3>r~DqUh7sq92^R^6MD+>U(d_g#QIDu&)_Ou>8Z=y)`Gx|Jh;#%5NBYE>b5p z0kXXkcmT1Hd&Y(c(Tx3W#Wop1y2KBYdKXJA0(wOAS5YId=>9rk{M47f_31+wLyAx; zNj^R9X)o=Xq^n(Fd_4wP-iSPm`DOTy_OrB1*wnToMDP{5G<$r$U{1I(Ete=S>Z7#u zDmksxLxMFx-a!X6N{v!vcvchov%tiS1|NLhXetF(%zw9>%2%)^I~h{8Ly4ng*;URj z#Z82frAj`1^sr*h(pi2fv3t3=1?Z7)%UoCz{kaRo+~|!Kz*sL=F4F=2U@Vfio4zHO z^nfn8+-%h{R@qO2Tw8Uuw73f8?+aH4cDr8QM^zq-mz;4>NOzdnsWrt{9f^W{;}`5s z2_MsSrI0N$vVvZem{hK-XFLSETSvDhyvNYfrg3E0N~jaX#*p-ev!INQqMy<*vTTFW zP@axbIocShz&s@_J#SCemFx5898nFg+R$gEe9KQO;Jpu_A)sZi&#y5Gicv|3DYI(N z9F@>6NMwe`di*URj?w`lWAGsYD&j48IZYvAxt5E4_r>Ds$s?nmktvzx$0QXv7L~Z) zW5oAN0c)coz8UXOzmAWvt0@-!EQ4|iiEoBp3Dp4;F^iB z^Xp<6?+Ah49K?Nfp7b{SPp1N<(MkKjoYBhGKLqyKO~!AY+;@RYj(wTG*UGJ0^&E~` zF5UMMIDYgeySBc2PYLsM{sf`0t+vH$Ga!^U80(<8+{A=riN|;a``beG2j`~btr+KQ zhQMac*1`pMGVq67+FY&zL?{DkBs+!`D;lJ5O$ziX-*oP*(w%I|9FT^o;ACZmng{rgh2kFpcF7WdF8g$hzbz1@x6Hk z0XdF%XlG)^Ia5Z5Nb5(7NN+OBx`LLqXt6B-nLy^KnPMH--L4oM^gh#NzPL-vsk)kfmNz$Nu^{Qw=i&X3W&f95@D2f?3f%Q^H=P8N58-TIpYJEzwCqpEUG^D z*7k~bP_&YoJsIRI=12DZ5AJxsCSai4Q<9YWFNhu@wFl^P5-Ml+rL(qmK;3tWH$6 zpMsu+rN9*SrZ!>|t+>QA!$Q9qhX+PvlVwnxQ&Z1cb0fP0Icz?U%}5CJxn3;Q`XxG2(vi+gV6wfP%xREb=9=WcvGIxXaRyCR zYJu;X&%6QXxh)3~9_c?}Y*m!TO6wfh13+N4wP1Q2GpPFO*p{TgcETA zOtj{Hz^8JB^?AJfz^>&DjL*j&h$K)u!C8Hr_xt*CKXb}BrqbS2_&Ce;b$`4?)7jZa zIUrQj>vWsrPp?94M2vfngT&@Nk(uGbajW4&)8x%O%XpsM`r3kB7QBnmL6Zc5!-pWm zwf^)p248(KvHqLm;4FJ+LQ<|@C;yIbd}ZRSMQ2=;z&kFkPKE^U?fS+q+ohG;Uf5r* z9e$I%PadVuXmr%7vag1yPaWu77nQO0$_)CP1U&zOvC{oH?@xdn0#-2Q;^Ut&FCv_G zOKulKcR0Fte0EWfSu;x zGXl9FI$D~^lN7^^yUO$1AgRT{uq*f~$qW)@rJ>gjo~6|YC*BeiA7A@pijgbbmpfC2 z_@i%uhm^w6LFQWFYk`wfXw#PC9*qNtf}*tkEtvtF z36dv491+Dv?3mm$N!bavnUBUVDd1|$b{eP&X<%tuQhmYy8h#(ME*AUK@yh8`)_uh>dz8m7*nU3T~Fe_8;R&SiF{-qA@wpO5bkJCQ3|Hb^1A z5jOIkeHeB%QlIV~!op-C7VIx#gEwxBqM0L7TLnEmN@+Yp%I<)HZu2&0A(K&?*Nj(cX@E$A_zYNH;ftY#b3 zzu)sIF?XxtEtO&99{-?216M-r+FP%It#ndNl?BFAzW1fblpQ2=f@9!*##bG7JMEUp z{6bpe>iIjCDksIjujNSm+{g2&e_m8mTiuPH;{}cW|Mz8;8gm@F&3q59H8mi~uQ-@I zoH~kC%SDa_O&7G6SK1DFMstutta1_Q!^N;zkx#lvz*rT%4h2t<6_`AwTF%6m2hy@h z)QEb2xOpJ`=am>OR&QD?iTJ83gwU~Dqy7~b=Pl^1Nr0(Hf(^B}y8J8Bjl3;s#?Pk` z0|{0*Oft+ds-GwP4#RO@D~Ojo7`5lhb20-zK@_F0!;oXue?o|Y$!0%bdT?nu+BIkF zFFW-ayibcj&X@_BQjU9@zdWK*hJL=&e>3RgHtRuS;W|;2#uMxMTxp{-8THn23(T zF;A{g$<`L>qQE4~$Mc$bm;E6xMHUR!KOL2}tBVc`q9Ft?80rCcU1wby+3`yj$354n zq<3OxRdu;9e!kgX$Yk6|anx+F4unwF-tDy_*nT?Md_)#tB3%Si5t+5@*8&(TyI@o+ z1CCznT!t?saCgqce)edkiRtLTE^<84)X!p?iS^*{0B1dAoW5G)crE^UnPjbnfEywI%HT>j;hlzTJx*9W0oPFQ$3l7ZxG zt8;|~Hg}~Ni7kN?d7=Vd`EX;5KKKkMsT-hra?|;JKk`7+kf3~4dAM8?nfbhD*u82o zsId~>EvuxmV!|l-g(e{j@idv@APeKh97)+^7FbG0W_#xAGMTVCafz4}yHj~ch!lVs zOG{S%M^RP0@+`KHv>5&4`}&T92k$512ar&~q9PLHt8#a#M6_^wp!}@o#cy>EB6_mY zk_z^$q)JVb8WVl5&5V}KRD-;oh)A~8N*vKpxsjb2MDA)Zu~B_uMb7tV1VI|j`1ts+ z5Df$QSzrvVRqAa%4!>pF?ISXa9M+?6@lc+{q0jvV^Y2mYm|>Z)dabl2>;-uUM2yOrAmY3isC^wA8<~qpenDRD0r?DNG4EC>T}9GTCUm zyq~C*xNf;uXOd>An=$t;HU=Fv4;~lR&ERI8{KfI~uzcqXlR`9%9w&Y*WJ20ceqM9O zctN1SUFsNdZTgMI0?vcq-;PAYJ2_!&5DNTakgjr5u39dfGQ}|1iA%wpKT*hQ{v1Ss35+eKxCBILR#}Z4S za38^4rGAv*2fAB}F&|hHJpt5EWenhw#nIRNfskfQ7nnZ^J#rYKu<}XYAjJnixE-a%RfdAgSUF0pUVo5ji501ddtGo4qZ4DL9v&W2yx|&l9V_zWV5NZJXRD<* zR!ZC4FSa$MwzH)T`h}i|NL?CFRS_k_Oa#>hk)1_9*_tM_AO$uCVojgXv2pX?bV&u3 zv!x^a^C^&=Z%#qBpvdpM+&J{mphZ2@oN^G8Ci1HHt^E*`U2_7*o{a zRNL6BFlBb`Vm`2L6rX9*RXS9+#F$+TQi>~tBKW;S+I@8+IzHEEfjlp-L6n|ci;*2A z24A^h=X7Y~0G*K}nCYv!11)A8s8MpF48O=kjfNcDq)MHl=;LWebF_3Ps>AW-l1(~J z7LP4{4n*U_ceXHnGbj?x#{JFn!5n8r@A`pYoc|fYd7I&psAor8W?qp=#>bzvSE?VN z2d1mW*xF5tAl0LnOF5{;<+J2`A}ejP@W|jdyZqSlP=Y6i8K2m(*MNY!G~CA_*(qSD zUM{y=x^1uCoVvIeBtT=E?lS-w2+@U>WZliz-kdlw&TnRS@8N4H$!oAo-?l&Pw2G5k z95c5dq*s6%%ukhBfO@gVxg!-!Myzg`F0yYsfS7bYD!7Xlzj8-a3>R)TG+3yo;yNol zozb!c;kuSCnAImP=sarQS3KJs)XtoM!W^_Wii8bIjJv=^@d)-Gpedt zmN+`W$NOvaYGRtgZZ*=MO%x)<>bp~FYZpWyrCW*oFkV+JEhr_8a+vW)h(uq>n<0k7 zpsy~?550WU&;MMK(4&6ip&u-p#Ej~TnXhjR;YTsf=Tao35lh6jk|;=rVme7`WoXFO znXs{=l;ms65C0a8r(ukp;zCIl)s&tL59xN*99damsC7(9tOpl?Dh?Af5~B3p&6%oc zUe}bjSvAaKBi zd7mYA@c}QIT@{j9o!7`;D(JSS{Ht1Zmh zI%x*lJrn63142w+{$?x82J)*8t$zumkO)+mG=aYt+ z3V>sq6RP7D8mnzCX$1` z9+|MM|6HfW`qN$b^JHQJ2JO6If7mSL8!5R)Hlu!qCo$V3Gi&VuvHpcRzT-o zTNASZ4P2%0l>+E5j-e?@F@qfMNjWN8-Kim~l9XXjKpXW4W0ufA##mH#dJYv3mQX#B+FWN0w$g~IUz#-3`?RM` ziK1Y)SOmsTX{KZrl;L4Ck!*YwTH@vOuVnCzTFN{NOGmY6d-hgb*cxdWJ163ew0s_Y zPp?4{4Lix&K4|M~A~G7NE9uR9oOkOHH7lUPYh!g5Yr~kG1r7)4+SW@C&F?lw1dZ`h zMn;Y>v+IhIA=YA&A?-Gfgm6;FS`ON9VC8Ane#KXn`R<@-qvfl@RD9`UF~YN%-7sMY zgn<)!ikOIGlc$H<->fN8n4d2Rr~E`KwQ9$VhuwKMw8%-7Sy4fbRM9ttY9yF3vqR*y z)M7K4VKtYPAk>j~k8T&s05X1vk{)DF_;gi3>O6_d~YBCC;|oRM2!~A(6&eYp;nhpK=Sk^OMxK zQ_9o#bBOrRr^!?gSSfD8FIbslVSx(tbf;o6-9Crvp#Cypf%Tx6iA3uDw_72A1j3!k zsjkyd?|l3cO_%mt>?N5}gYDugyb~9kO=_SPP-rXLrVThIf8Ko0gLSZj&B=N}B1^+* zJ(}KR>W}Bc-}2*(1Q=ader}w4zfNo=4y*2w`hrxVN0$%Ap1JF&+s<%M)G@DSd~sYP z6MM{YbYCcHWbaDUtV9)+k;(9Km3uHTn5ginyYD=R!YV-uqWP!*p16XoO?f3e<3RdO zg*J`h37sFAp9;3A57+RTSKoyfO*zJgGP(KsGL+Cr|Ga)Xir`=(X7w{cZFQsOgF5G- zuxFC@mfHcm#x*>t^mcd=tc(z(l{@d&x^e~@CpAChHUFo@Wwq|1nQfQgm(S`Q=>w}% z1HkEEuKZ)r2~(ZeF9WZw+ydC$C}1iO?1ikyynAi^FA<-SCCKa>YvrB zg!$#AU6{E#c@uGc{EMORUqeE)SXsc+VNwWUNjg9VT2*jx#0W~T0%D!fZ0FZs^F%|I zR$A2Mh=%<&YSe&_zy6>_eW%K!Vy>-;r73ONW8S%ozE7rm-QWpzY$A~7+?Y+~u;RYE zBB0S?zzDf1`DwqMeLVqRvymnzT0{!)I47m&tDXC!BW-uMpMu`lOB9l;b1jUBJpq&s z@zqnW=R%JCFI)fOHhBGw;gmj^trEgg`j(O@S^uSfzQHxb3o;uf%4_W;eh?Q+>uyED z6taL%q|^SE-KqT$){;Gb<3ujVZPF%fY}>XP+l_5IX^h6UZ8x?W+h}atM#FpZ zE8y&faUUz1FkV^K9lIRDE%{tbXDoBAF5uHGCCG-l@PhaU1ay zY-E16h4b}y1i!kq28ac%3HpxwI+~8-Svmi99|H{tJWa1azoju7?d$gVdbK0N@7bk` zhAm5FxIc~OnXwEf-k`bP=_Kou4$$AkO-H*S@)h-kEG@m;vfmGe>e&WLgd?-|{3jdHT{sp^ekOHp8 zFE_XB1OF{%c$8jWNKh5!b?@KSK)@QXBmnpq3}kovPesiWRF$woGEme71-l#t;g%ay zkN7BJU&}4%SM_e7=&jAx&Q@Yob)eI1t_YdBsAwg)uqE9=d?^08+TgHQ-~F}OI-K4K z$kPO-lbTk+&AJ{0l?Jq?#>^qD)rCD3MgqzJE^HO!vEVN|1>pEzLuj+u-}vL{i#Q@V|wMr{g^jr9=Hk`A~)IaZ$VOZ=f%5O zIpw)r_>{0q^gnZd`|cR2*!XTzQ?LF5#b)M=wC;a7&}+fI^5ax5`GAhL)F|zS$(HrN zpmCHwRG;<#1{!xClu>a!k!XHo)0zQVj9ETh_-{cxQvO}7wX_W~igQj zFWvv~)k&a?wQ71uVJgwfvIf^mKqqDX;Q7D*M+>$G`!E`c3ISiAt10?pJ_+D7M1?wA zL;jtSx9}q5Z^L956-{6~gqt)rGE*UYc}3lHF+=~|hRW-0R0j7_4j79f#MsgAM^kTq z&CP7cO+^zMaQckt^Y@k7As_c>tkF}9L$fQzzSY{1WdJSz4A7=D?U)IFUz0fkTEZ%# zhZv?1Jsn+_oWhiqdITx2^iXMI4_8G$xrW3q_I+}ky6v6n?ACwC&F{5N2>-KPRFZfa zgJ)=rk)V*%kMMBe2U}7>**P6_mFL+%vQuW)$47GL=+IpKPoggTq9`$T(oi!~5t;eK zo=^sH;GlfN^0Ksl-1qB(;NuaWx0_~WT0EJ~so?jRn$VVf0(W(P>18D)wU!Q8Vy5|P zOTeq)Z+SLwS?s(b)0ZJ)6c^$H>omFvTRcBllat$bmwN`WbX)vySmzc%ry_U+^YmXn zHPoJl%>HQ`cx@gaij*HC#3y?F_5X6swSJVASZK|lISv0iXus|I@6Tv4PhDAAYa81C z%bQ>A_5XkW|JTQlb>Z-4ik6q~0$gE~uIe zcK?GwjS@Lv>{M8xR%;_Ovzr&o*aS3;YwBA zMJT9>f%ZYT3TLRl7VM=3ClczTSQ^DjN&>Qf0is5)Hqnz?bwMtGFLQMuBl4CkNh(j7xzP{w<%vwHzkP1Me zV{7_)y#D8yMcTW0;a?qpXgnjG=t$i(fv5t_zs{<+@O$Q$@*|9YLz6kZFgq=~WnL{tYdFJ7f8 z8;YBkIl1~EgWV8WRaIh;%x3y*Yj60nXm!U6ybPp7>53bjII;En2dR_L(E3M5;d6%7 zbMqaBZ8}7qO)-7{ezJBoxN*q@cDgA12Ri755|YlC|9xdJj|FCIYB7k7aZmT3AvEr=69eodtsG5>w6 zwm7(*DxJxCcHW&~FHB^Q%)*pzCF+sGw_`S!s#3}CEQ>0FrMD|Dpn5_uEbd|>4kwvD zlWouW;}l^S?D^wQDb>~L0xhATcDengPRH{_W~OUVaW|MF>fd{JyQH{Bx-~cZYMseT z(YURDo_gHD0pbn3nwFLuCymF_q`u{CNnXRl5=V6A#>?)Of1ay79v+y8&)#WF(6ZwG z*&Dic#}j!Y#g7)GR2K9%##nJwr%c~Q)wgzcv(#qGF1jo)&ws{ig%SLIyLkvGa}jl# z*}>`yD}+|Pf=D!zvxh=&ya3(+e(rtjsN`-#ty;M|NEWZWUO9pkn_I|tB@GQItX-DA zjKGf%M-fKPm*&O2>W$`T;jH(pn09+nr3Y;QUl7x!dz|%t4xyr6efQwdl1G`N3f&Bl zVC=GISy`IPBEGFPciAeVaPIVbVQW7SyyoFRM-{So zLa8ykNlGd8M^UH-DxCqB*|!K`KNj7+?u~|1+F;#1U=eyFiaauXxC%Y(wviIni&nK( z_K;%mh?mbjJdiKXc^jVmjI!FIvA&+IqcWN1&d=@%8tkHIeenvW?89^;jvew@P<8v>MWxFJLcNZgNeU}w5by)ucXTj_d4StLB>5jYdaukHc(UjwF zOnd;OfbuZHF*u*iFl$VwO*tO-^zN>5ZlmJj{9w2qQCU`8DY#y?a)?g_VfG@76SVB1 zEE{f2F#+o2o#}#|y7hGJ-B#CaRPuqv%~Bnv>;38r@2O_X*(D9cf{kj78;;W+T=Ppu z0MO4;PW*88C(XPO&6G1BcB9)q{ER0mhxbR+}<)6bCM2T%Z0L1WmoxBJf6A_$l*vF=E)b)r3;;6@2YN|j!$9CZ&Fv> zPC?XN&i!^=sjfe-H>|GZM7$WyJ>4`zoSi)2BrOmR zv;*jlCOZ;lj>W5L=vp2!lO+YqH>g1n)UAj}NJ#d2G-`F2!q~Q${!lm;-n?c+9X>GZ z@aVMZE<5uLr_UZ!*SjD7B;MxKfN`b>j|Mw`=Eux^yXSVhWZ_HLlCu8o1TQ_s?7-4| zdr*P(VQE!oR)=7#uNr~Q%H4wFYRKC!5_b?>bU|h47t;+;=&fT@52 zPY*=b!i(Kzw!d9frY-y)Bf#!0H`M+WtZ*%W4Ut5&viD6b<(?!juPG`c#N>Yg3UgBUToz8c3ZE|p}6+KB#?mXV?5 zSac6&LYuX*WRRd4%Kq|*GBA3vSuP9hkf;x5vg&r5WPEUVEkndr28QE|*v7U)>Uuk( zG;ym9XZS45a&ppiYADvjn5O12LP0jK-8%_g-hA_U1!epo4ke>&QtGjKI?uu0XGq9) z^OZ`br0yIxaFP7DFWf&mSO%5N41Lx;`O>-U@yzXdwxXtt>pcfBhE2np&ku(7WR(M7 zo*&56sVV<9ECc=;=zMi`Nh5@8njd0o80!a?1##x3)*_W z!I1j(v66Ln=`t(N2oQ=C21tMhqmxh+ClkkuFLos4

KBRN&*EbQF|n+)P!Y&}rNUV*Vve{by2DADSF46azZ66l zb|DW(4YsAx8#Xq}If0`+naFTVsrEpE-Wqn9ClS=9Jjt}C6@DXgy}rn)?hLx*`f??Tt!gX9+ zUVQDds9#&M9W86>o;OPO(g=VQy0u*X+GVe_x%uLz8*VcABiK~49Az}jwv;^x)sy~VtgH#S#*u+APJAdAGcjIdE%hNO&1PT?scYLpnYVz%3^_W0g ztJ~qV898>*?B9`hAbqE%A)#9FH7NJaQghiscPCQgStldiRM=#|#r5`DNyIjm0J+fn z@ohF7nN~<(q&`2PbXd{E_1S0g^MP+PI^#69+A-5zy3z3^I3-F>m9ZhLO=08!a+ypu#vNgh4U-{4pT8Sp*>_(@CF zb&SyDMxahMFsE zgNrX2qiT5p*iW0ihvgP_Jxh7Ii;<{i`^r!E7QrpUyRB~5BaFTL$RGbBVz-A&Y8MBK z8eDLPul5fb4;WjY^OBQ8 zvExw@D7c43!Pk!ri;1N+t%R(|2{TdYn3cyzMR{G-Fvd7oXl(Ajhxqy3(dv*O-R=23 zBu*OIWt}SJ}14^u4e@V`tvZVTd|Ts*WH0q1{zH52d3A;RAf7} z;Ohvkx^Y*31k0)81{om_4)&d@R?;GiddJs6erHw$CuQBSf0NmZBcx&=;2Yr)vR3`& zxvvRbq_Qh&;r+Pp%ev)p971(=$#Eh$+^YMnoLRtJw)xXvyaKlrNv`wf#E~aQ%{Nt$u~lRgR&`7Y@)>!Eq^ZTQx41yN>LFZ zhGcS?qO77~czmyt&yeG)8_q#mu4G>m4?tgAV0Z!K#nqEVujgWjAKXRG+9(KEu$F=7GI_IHYqCGUkq>Jd;kgJn zj}-L&lfNT-?U==sXda(&z3lo$!&Q-O3eaR>GpbE&0KmQm8Tdmn9MXA5%86IkHV=?x!b&& z?vun|G-PV|jTa=tHaA?$kJ2I;`k93eM=58>6|QE=)Ap(W4wY3K*AA(v!^gqvL&``P zxBeNfI*q0X(8E^r*oh+Ol^Do7L|o~d@1isYs#ZtG6oIer_EZHRhA^;k?ZR4S|R-j zE)9suC>;vHIVF?c8$4#y;5B(% zBrUNL2d1l7s z^;{&^AB;=(X)H`k3d7J<&2FOP8a{Wgl2`82*!6N~I55{*Tw7VX9_J8Qt1iq|>^Hb4 zH5sy1{sx82A3zu2t7~p77wL%s^j_9Nqs@W{TC6!GUl;l~XZ!XbYf4$}@J;=qU#zcF zLE#;VwTGS_Q=Qb%s$FGlFZyOyZ^769+Ahq$y?zj*y(6H@pCF%B`g3RWA#a*5`iqpD zznbX+$q<^bvf@Bs5DWZq)wR8xt{+ z3BAT-^R5~B$C!q;bv8*iOW;q>p#jO+y-%-UM};2z-d8$NkFb=K3YU~%p3(sh(_iO- zw4mJh9q6DvFl5*f1A`ViDp^$C)IU@LW99WmVHno1nR$le1a!shQSm++Dpaagl3P;; zErw~RMX=271SQriMrwSfWEY)G{2zYsnFZLPk1t&Ti5VEB@W13hK$Yq%-F|{!h)3le67iv$M$%dyYkW+BWX4x%4ipXsd? zgEO1;sQ^wNZjU0xr`nr^ndaof^1i7lwNv|B4KS7O|0@Fg-{@?3Ki739vU`S-1&luO zOF9^DwG+z-AJrdQ3xFVf73eB}o)XEAM*kWRbpnk)vhG85z{j!2uM8-eG0;cCLl9s? zbZpw; zP|Od#N4a4N`a6={=w>ZU8pH}c=t%CEUjhPoYy0GX1_{UWIs`QkbjsM%ZP0K*bIoyvpMf9FsDU?=FLV*0%8JdDs|V57#VKL zpoA8xVnzw>rYohFfk9Go>h#gfUo;f=0|&`%;x?vZf1FFS{zG1m3IO4b;{vJlTgg9& z=^~C7G*S#uo067RCPmcq&kbh4C>}oOKM;c>-(j2?E<&tw@gq8zQX9a><|!G3`9|oe zZGhIf4r?kVE?tw4N~iQ;1NwU)J2WV{7+k2RgKUu+WCJJuhoEzZV5p>|q`*A`L5?a_ zi84Y_aeD)Mp^E4qY~2lNUwGv;$+1n$5~uZ#i%TwKBHXYC$)0j;@T{-hu@lp2%}6Y*FYCgt z_rLT*FF!jA`j#+g}<&=az7Qu<{5Q@%t?01=3SK{aA z1>zlq(eU|FUC*pSZ{b9SSZSMybV3JP#%BHYIZ?_Gm4P)J;?)s_8-=t&m8@^BDV%GObX8XW9a&+LL#ej@ zN8w~ofIFA$BRtZiOk8LIZ=Q|LCcr2LH{MU|wh^5rpQ22pB4)D`x4|PKw!Ba*NSJci z0>dTnszWj;N}@Y|v7N~I?MpGW%v$e zEUPZxPwo_EH6xy2xFBCK)m<&Sk3ykn5w>G(-~gM=(mvzRs<|ih{658MI_>i4k|x>h z#p!Il(Jc%B!TP!BEIV6SFA_J;mLOWLLSk`! z%IP}}6Q^#IRa`2j)i4}QHYoELxn|kW8hZrWBsmH2;Cj~I*k5`jX}%VmMgV;(J7q&zb%6-R2ynK1dWq(ct?HrU=oI)KL0R{!>ii4kbWxXj z)rc z!8KQmWC|g;h!O2EaRE?0hiexuYY>CAj|L)f;#TU>lD-+ZgJQ_IT8b%hcx2gmX3Qh3 z6G?khM}}OPNI6WfB<(3KZ}IB%es?*Xk_!1(J%fkhb%hZXFgxgBcC!|QX`wm%-pNGZy`YCA zf<+p`KM4vkMh~!ePm)sN3kU$JtiFT+;EcVYYWH~}4w0=jY!i*yOS|4ugFU^+sSz4Y zZ%ocVU9IH7%+Mr;99-CxXthFm9pFCVqjnRx-wiSj^#_Tx8*xNFZujVVAM=Hk9PLbp ze!r5)b)pxLBli~`T*>Yb>o$0l){Z&Lxtz{FB{wg;!xxJp)0=dgap%nEJQN^=ODb`@ zUr9HxRGrC}?1}n_aN|9+-Pv^7Vzpxk&3H~i!2luGc89nsk)kU=@MLh>m&71>N|z(N z>Gg2h)nwJ`51cK9y8Cp4S*^wS5q_~Ei~oFiR%<-~Z8GcK&qn)0!J}WKl@Q4Xws$%K ziIf$9Bc?0yj#juizU9W{?{06|=1MkwJ3yQA`Inr;!-cK7^*mAjBEySY+0E1ZZbeoN zV*RoW0=D~_d-L@@1+m`YIZ3+rO2*h}7pLQLkdme=bOh%G?27BLLBq18E5oLmF?0O% zAO-o^!Vryi?-g0YUFT)#vg_ZFVubj0y^S+{!{5XO3V798aDVnTW0H4R#KeL`lEPZ? zYuS9E3SW>HNoRcJl_zR&OyW^<{AWOf()=s=FTZv+l%Y1uF}tU>p+h@T?>x)u_J;U+ z7ZhG}P^<8eMf>SHHo(Q&)CZPa>?D*RM$Cq!9#P6Cl=w~Vd-kP$SZ&-U)o20z#p!~F zP3reaMK;raJLDiCaGygkX`c1Faj9qSC6aZvgH`FA{zq~0P?g=p+pt^R4+@^{Q?$LIx3VH+Z92o&o3zx*UNk1;W)|1%Vc=m!IpX7$n6i56}%TidnM}@soKn*2`5ziNVI% z)R#2#!PV%JYBgadE#G$}r3VCdebkctLCQCeuN$c1D8_SCqo7!X6lC{BXl{X3SffXB z*C0su-qIrFmpJ#l&Q9rVzPGIWZ7sjt7(Ug=1he5|w~NwGtplNOR81?b4Y2R}{wk6^ zncWV*;*>BVa$DW*8P%wFnGJ$#jZFO`n2~(p)ok4WAd=R&ZZfuTGL)?;-El4pj3oWJ z*y8ZBOZ$Q%uSiNyw$^Iv9vPAI0`!sxe51oLzKY2gIe*6s6C<>9BjQ-Kz=6X1y$L1pW@|s1W9INo$rILtF|9vVqg@#yjlP2r=X? z^501ulN=L#l#_J;8Y_Y|#8w5GMMp3Ko1YI2RxzCz0<_1EG9sf+VmI+;KtV)qKTFG~ z67fZr%n|d6D(Wb~MYzq__9MvIlzGC;By82 zaG*pMu(pP~u(^a?-6PWV@@ldRm)SE6Fkyd2yklm?(Oj;22e)aD;EOv zCdPPui!-^MjIHpe80KD#p57UZoIkuFBi!yyKD^ zJeZxU*jk51*;8(H_#GL%#{qE9mmh|$|40spXr$m^xe4W@byrh<;3mzZ8Otc$8r{^D ziy+yLh~S?gFT?=3{nn%bCgVI0&=B}|iY)v)W;RZG)thmkn+P8oG+JQHT$nO-i>2(y zXNDlf-?o$?&@Z6Qd1A12!Pl&f0q4~zdE8cO;Gk9^qtZ|`3&F!x5yrM6e|G~vAoQ*o zEy+d}Qb$E_BrP7#z?@g02cobKNV^=JjV2`z-NoCP%MWLkLPxk|LO ze7nN$p&YPj-@J^iIKQb=NVB+$p;U>!9Ze_XLDfMJ>GY?EKolc0i2Fk7hb$(Zm6zuu zV=S&lilO@H{UB*w#;V8K*1|FEyVp;y#c3~EZ(G5RjM^Hekf}5wy^1&v3L_hKbLfoM_nZwcXlFn=U|5Uwqqkr@67L=v`Dp!8r)#1ai!xdB zSNQ%f^!ju%A~wlL0XZ`S8;TQee_Zk8aQIOa^Dz?y#%@+5S@vez8*!kl`KW#r{Gps>NneWd zDKyRczAz2?JVczj&R{43!!MUkPiPURtg*8$nN_EymGheIpnzcE0mu1H=Xg=W!gbqs z(_%sqVIAo@7vXf2^@)-FsYXuSu}sKuIitL?c?q*=!%?ZpoZMZ_vG2J4v)+ZA6xV>^ zXrd*~NRnBCmUG-t(Z-;yDFD~JUO!hs5yA2jDmHL?c=w;al#~9|0(cTIVf;NWt?*~V zNem=(27|G!>9;?gAyCR|f;JajO}QLl*>^^?Ot0-F3isUADto0H@ZvBue#xo z%`6$U^2a`k+fRp)GBIGZ3_+R=oGDvK`WS2@DnoH3z&~Ra7n;>PdgBjMEqc!j_N$`n zAP`#~D#ies)7fM2Ezqps;wOn&-Bze7;eAN^iEKTP*teg`iR0_7%bHoRjq=CJ*sT`P z;(41QZe`WfjNa2ypU!=`I~bro-1qWWwwSzG>Pj-+-7Q}&XK`btR#JT!*;ZO8h#~+g za_RdsuI%>MP+?)cvMlJ|9cPM)iZy-^CYRvy!yN~&MNW<`c$_-DXRPK(ZnSm(oAh+Y3kdo_pNBz%`vRlQcA*B0*95WLtCfMrswRBrA4bBy|4wA_y{T+$=&MAZ>Z zm@{p0x#2VMe>R8v4ug-!`lrA2qTMbj^n%@yy}|Ec8S!cN3=-wS`P3y1GZQ-9ns_|v zJ3U)fVH%IJCTkT0oZ*bp??0?p6p7~~Q`$G6=qbi*Kk=JYx zS{YZ_+zdE#(=<>#hq&DdLsWoL#jJxZXr=%uVN1;!N^JX`v!y|8exqul89%Am9VI)2 zttT5xwYsWaKc9C#lkQYv-7qN!|EQn42qd{KYywBWdG^Az_XMjU@h{qX(C{9*bd=)$ zbL?n7gt4qO#80)Qb(PMpgf8hs;vFaj*Gpo;37T>}39n+;<1I zcxb?>yas&09xw;lr%kO$&jHylASA$GcJK{rJwTJ5hx|Sg&MSv9)MPEEq!OKoJP% zHYwBL>fR_i4N*~gfeTuLZ@}4o7tpJAuE6R`H7=3lCfUKP+@b<`P|@s><+!IZSWCxc z$E*CLl)KjL$PsQ)505ptXr#|2-%B5fV@UgpkvBnXZsY{rCZ-%(tYh@U5B$C>f6V@cVK+w#>%Y<3+8wEPsTWDMc>`J0ahKVN1vm zNst!Ya9Dn0;*#m?{U9$HjvoWlf0Ow-pHvB+8<|wM^M|8?f1Z@|)p&!>K7F#mtz%RJ zN>&PriVHI_Bx<6fL6-y@)`s`28H9l>fQs~z!NYLs$MS4av2i}dT8C03o+%v@l{a~M z>7-8~9A%6n7^F4%3+R`A7gQ^lbROZWd_UgTAs4&ELE@N%tq1zi7nye~jwO;X%pRa0 zP%$Lx`571>`@Urznj!tVz1ireJRin~@RWRUVUx-NKeQ(y#;^;&@>Pg

cOQ8){bNbpT$S|wvHc6BrK=H)n&2Yuy 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 Dmz&=U literal 0 HcmV?d00001 diff --git a/docs/content/guides/developer/app-examples/images/trustless-start-escrow.png b/docs/content/guides/developer/app-examples/images/trustless-start-escrow.png new file mode 100644 index 0000000000000000000000000000000000000000..269f54bdb65f46bf3b25c554a2f7014e2e9379e2 GIT binary patch literal 47171 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 JC>JyG`#

-Toggle full source code +`owned.move` {@inject: examples/tic-tac-toe/move/sources/owned.move}
-## shared.move ([source](https://github.com/MystenLabs/sui/blob/main/examples/tic-tac-toe/move/sources/shared.move)) +## shared.move In the previous version, the admin owned the game object, preventing players from directly changing the gameboard, as well as requiring two transactions for each marker placement. In this version, the game object is a shared object, allowing both players to access and modify it directly, enabling them to place markers in just one transaction. However, using a shared object generally incurs extra costs because Sui needs to sequence the operations from different transactions. In the context of this game, where players are expected to take turns, this shouldn't significantly impact performance. Overall, this shared object approach simplifies the implementation compared to the previous method. @@ -56,7 +57,7 @@ Instead of the game being sent to the game admin, it is instantiated as a shared
-Toggle full source code +`shared.move` {@inject: examples/tic-tac-toe/move/sources/shared.move}
@@ -67,7 +68,7 @@ Multisig tic-tac-toe uses the same Move code as the owned version of the game, b In this implementation of the game, the game is in a 1-of-2 multisig account that acts as the game admin. In this particular case, because there are only two players, the previous example is a more convenient use case. However, this example illustrates that in some cases, a multisig can replace shared objects, thus allowing transactions to bypass consensus when using such an implementation. -### Creating a multisig account ([source](https://github.com/MystenLabs/sui/blob/main/examples/tic-tac-toe/ui/src/MultiSig.ts)) +### Creating a multisig account A multisig account is defined by the public keys of its constituent keypairs, their relative weights, and the threshold -- a signature is valid if the sum of weights of constituent keys having signed the signature exceeds the threshold. In our case, there are at most two constituent keypairs, they each have a weight of 1 and the threshold is also 1. A multisig cannot mention the same public key twice, so keys are deduplicated before the multisig is formed to deal with the case where a player is playing themselves: @@ -89,7 +90,7 @@ export function multiSigPublicKey(keys: PublicKey[]): MultiSigPublicKey {
-Toggle full source code +`MultiSig.ts` {@inject: examples/tic-tac-toe/ui/src/MultiSig.ts}
@@ -122,12 +123,12 @@ newMultiSigGame(player: PublicKey, opponent: PublicKey): Transaction {
-Toggle full source code +`useTransactions.ts` {@inject: examples/tic-tac-toe/ui/src/hooks/useTransactions.ts}
-### Placing a mark ([source](https://github.com/MystenLabs/sui/blob/main/examples/tic-tac-toe/ui/src/pages/Game.tsx)) +### Placing a mark Placing a mark requires two transactions, just like the owned example, but they are both driven by one of the players. The first transaction is executed by the player as themselves, to send the mark to the game, and the second is executed by the player acting as the admin to place the mark they just sent. In the React frontend, this is performed as follows: @@ -198,7 +199,7 @@ function OwnedGame({
-Toggle full source code +`Game.tsx` {@inject: examples/tic-tac-toe/ui/src/pages/Game.tsx}
diff --git a/docs/content/guides/developer/app-examples/trusted-swap.mdx b/docs/content/guides/developer/app-examples/trusted-swap.mdx deleted file mode 100644 index f5bc8beb97bad..0000000000000 --- a/docs/content/guides/developer/app-examples/trusted-swap.mdx +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Trusted Swap -draft: true ---- - -Content coming soon \ No newline at end of file diff --git a/docs/content/guides/developer/app-examples/trustless-swap.mdx b/docs/content/guides/developer/app-examples/trustless-swap.mdx index ff0eb90f53978..eb42f9dd4599f 100644 --- a/docs/content/guides/developer/app-examples/trustless-swap.mdx +++ b/docs/content/guides/developer/app-examples/trustless-swap.mdx @@ -1,27 +1,2083 @@ --- title: Trustless Swap -hide_table_of_contents: true +description: An app that performs atomic swaps on Sui. Atomic swaps are similar to escrows but without requiring a trusted third party. +effort: large --- -This guide and example demonstrate an atomic swap on Sui, which is similar to an escrow but does not require a trusted third party. Instead, this example uses a [shared object](../../../concepts/object-ownership/shared.mdx) to act as the escrow between two Sui users wanting to trade. Shared objects are a unique concept to Sui. Any transaction and any signer can modify it, given the changes meet the requirements set forth by the package that defined the type. +{@include: ../../../snippets/app-examples-swap-source.mdx} + +This guide demonstrates how to make an app that performs atomic swaps on Sui. Atomic swaps are similar to escrows but without requiring a trusted third party. + +There are three main sections to this guide: + +1. [Smart Contracts](#smart-contracts): The Move code that holds the state and perform the swaps. +1. [Backend](#backend): A service that indexes chain state to discover trades, and an API service to read this data. +1. [Frontend](#frontend): A UI that enables users to list objects for sale and to accept trades. + +## What the guide teaches + +- **Shared objects:** The guide teaches you how to use [shared objects](../../../concepts/object-ownership/shared.mdx), in this case to act as the escrow between two Sui users wanting to trade. Shared objects are a unique concept to Sui. Any transaction and any signer can modify it, given the changes meet the requirements set forth by the package that defined the type. +- **Composability:** The guide teaches you how to design your Move code in a way that enables full composability. In this app, the Move code that handles trading is completely unaware of the code that defines the objects it is trading and vice versa. + +The guide also shows how to build an app that: + +- **Is trustless:** Users do not have to trust (or pay) any third parties; the chain manages the swap. +- **Avoids rug-pulls:** Guarantees that the object a user wants to trade for isn't tampered with after initiating the trade. +- **Preserves liveness:** Users are able to pull out of the trade and reclaim their object at any time, in case the other party stops responding. + +## What you need + +Before getting started, make sure you have: + +- [Installed the latest version of Sui](../getting-started/sui-install.mdx). +- [Configured a valid network environment](../../../references/cli/client.mdx#set-current-environment), as the guide has you deploy the module on Testnet. +- [Acquired Devnet or Testnet](../getting-started/get-coins.mdx) tokens for development purposes. +- Read the basics of [shared versus owned objects](../sui-101/shared-owned.mdx). + +## Directory structure + +To begin, create a new folder on your system titled `trading` that holds all your files. Inside that folder, create three more folders: `api`, `contracts`, and `frontend`. It's important to keep this directory structure as some helper scripts in this example target these directories by name. Different projects have their own directory structure, but it's common to split code into functional groups to help with maintenance. + +:::checkpoint + +- You have the latest version of Sui installed. If you run `sui --version` in your terminal or console, it responds with the currently installed version. +- Your active environment is pointing to the expected network. Run `sui client active-env` to make sure. If you receive a warning about a client and server API version mismatch, update Sui using the version in the relevant branch (`mainnet`, `testnet`, `devent`) of the Sui repo. +- Your active address has SUI. Run `sui client balance` in your terminal or console. If there is no balance, [acquire SUI](../getting-started/get-coins.mdx) from the faucet (not available in Mainnet). +- You have a directory to place the files you create in. The suggested names of the directories are important if you use the available helper functions later in the guide. + +::: + +## Smart contracts {#smart-contracts} + +In this part of the guide, you write the Move contracts that perform the trustless swaps. The first step is to [set up a Move package](../first-app/write-package.mdx) for storing your Move modules. The guide describes how to create the package from scratch, but you can use a fork or copy of the example code in the Sui repo to follow along instead. + +### Move.toml + +To begin writing your smart contracts, create an `escrow` folder in your `contracts` folder (if using recommended directory names). Create a file inside the folder named `Move.toml` and copy the following code into it. This is the package manifest file. If you want to learn more about the structure of the file, see [Package Manifest](https://move-book.com/concepts/manifest.html) in The Move Book. :::info -See [Shared versus Owned Objects](../sui-101/shared-owned.mdx) for more information on the differences between object types. +If you are targeting a network other than Testnet, be sure to update the `rev` value for the Sui dependency. ::: -The guide is split into three parts: +{@inject: examples/trading/contracts/escrow/Move.toml} -1. [Backend](./trustless-swap/backend.mdx): The modules that hold the state and perform the swaps. -1. [Indexing and API Service](./trustless-swap/indexer-api.mdx): A service that indexes chain state to discover trades, and an API service to read this data. -1. [Frontend](./trustless-swap/frontend.mdx): Enables users to list objects for sale and to accept trades. +### Locked and Key -{@include: ../../../snippets/app-examples-swap-source.mdx} +With your manifest file in place, it's time to start creating the Move assets for this project. In your `escrow` folder, at the same level as your `Move.toml` file, create a `sources` folder. This is the common file structure of a package in Move. Create a new file inside `sources` titled `lock.move`. This file contains the logic that locks the object involved in a trade. The complete source code for this file follows and the sections that come after detail its components. + +:::tip + +Click the titles at the top of codeblocks to open the relevant source file in GitHub. + +::: + +
+ +`lock.move` + +{@inject: examples/trading/contracts/escrow/sources/lock.move noComments} +
+ +After a trade is initiated, you don't want the trading party to modify the object they agreed to trade. Imagine you're trading in-game items and you agree to trade a weapon with all its attachments, and its owner strips all its attachments just before the trade. + +In a traditional trade, a third party typically holds the items in escrow to make sure they are not tampered with before the trade completes. This requires either trusting that the third party won't tamper with it themselves, paying the third party to ensure that doesn't happen, or both. + +In a trustless swap, however, you can use the safety properties of Move to force an item's owner to prove that they have not tampered with the version of the object that you agreed to trade, without involving anyone else. + +This is done by requiring that an object that is available for trading is **locked** with a **single-use key**, and asking the owner to supply the key when finalizing the trade. + +To tamper with the object would require unlocking it, which consumes the key. Consequently, there would no longer be a key to finish the trade. + +{@inject: examples/trading/contracts/escrow/sources/lock.move#struct=Locked,Key noComments} + +- The `Locked` type stores the `ID` of the key that unlocks it, and its own `id`. The object being locked is added as a dynamic object field, so that it is still readable at its own ID off chain. +- The corresponding `Key` type only stores its own `id`. + +The lock and key are made single-use by the signatures of the `lock` and `unlock` functions. `lock` accepts any object of type `T: store` (the `store` ability is necessary for storing it inside a `Locked`), and creates both the `Locked` and its corresponding `Key`: + +
+ +`lock` function in `lock.move` + +{@inject: examples/trading/contracts/escrow/sources/lock.move#fun=lock noComments} +
+ + +The `unlock` function accepts the `Locked` and `Key` by value (which consumes them), and returns the underlying `T` as long as the correct key has been supplied for the lock: + +
+ +`unlock` function in `lock.move` + +{@inject: examples/trading/contracts/escrow/sources/lock.move#variable=ELockKeyMismatch noComments} +{@inject: examples/trading/contracts/escrow/sources/lock.move#fun=unlock noTitle noComments} +
+ + +Together, they ensure that a lock and key cannot have existed before the lock operation, and will not exist after a successful unlock – it is single use. + +:::tip Additional resources + +- [Move Package](https://move-book.com/concepts/packages.html) defined in The Move Book. +- Concepts: [Wrapped Objects](../../../concepts/versioning.mdx#wrapped-objects) + +::: + +### Testing Locked and Key + +Move's type system guarantees that a given `Key` cannot be re-used (because `unlock` accepts it by value), but there are some properties that need to be confirmed with tests: + +- A locked object can be unlocked with its key. +- Trying to unlock an object with the wrong key fails. + +The test starts with a helper function for creating an object, it doesn't matter what kind of object it is, as long as it has the `store` ability. The test uses `Coin`, because it comes with a `#[test_only]` function for minting: + +{@inject: examples/trading/contracts/escrow/sources/lock.move#fun=test_coin noComments} + +- All test-related functions and imports are annotated with `#[test_only]` to make sure they don't show up in the published package. This can also be done by separating tests into their own module – e.g. `lock_tests.move` – and marking that module as `#[test_only]`. +- The `test_scenario` module is used to provide access to a `&mut TxContext` in the test (necessary for creating new objects). Tests that don't need to simulate multiple transactions but still need access to a `TxContext` can use `sui::tx_context::dummy` to create a test context instead. + +The first test works by creating an object to test, locking it and unlocking it – this should finish executing without aborting. +The last two lines exist to keep the Move compiler happy by cleaning up the test coin and test scenario objects, because values in Move are not implicitly cleaned up unless they have the `drop` ability. + +{@inject: examples/trading/contracts/escrow/sources/lock.move#fun=test_lock_unlock noComments} + +The other test is testing a failure scenario – that an abort happens. It creates two locked objects (this time the values are just `u64`s), and use the key from one to try and unlock the other, which should fail (specified using the `expected_failure` attribute). + +Unlike the previous test, the same clean up is not needed, because the code is expected to terminate. Instead, add another abort after the code that you expect to abort (making sure to use a different code for this second abort). + +{@inject: examples/trading/contracts/escrow/sources/lock.move#fun=test_lock_key_mismatch noComments} + +:::tip Additional resources + +- Concepts: [Test Scenario](../first-app/build-test.mdx#testing-a-package) +- [Drop ability](https://move-book.com/move-basics/drop-ability.html) defined in The Move Book. +- [Testing] Move code discussion in The Move Book. -## Prerequisites +::: + +:::checkpoint + +At this point, you have +- A Move package consisting of a manifest file (`Move.toml`) +- A `lock.move` file in your `sources` folder. + +From your `escrow` folder, run `sui move test` in your terminal or console. If successful, you get a response similar to the following that confirms the package builds and your tests pass: + +``` +INCLUDING DEPENDENCY Sui +INCLUDING DEPENDENCY MoveStdlib +BUILDING escrow +Running Move unit tests +[ PASS ] escrow::lock::test_lock_key_mismatch +[ PASS ] escrow::lock::test_lock_unlock +Test result: OK. Total tests: 2; passed: 2; failed: 0 +``` + +You might notice that the Move compiler creates a `build` subfolder inside `escrow` upon a successful build. This folder contains your package's compiled bytecode, code from your package's dependencies, and various other files necessary for the build. At this point, it's enough to just be aware of these files. You don't need to fully understand the contents in `build`. + +::: + +### The Escrow protocol {#escrow} + +Create a new file in your `escrow` folder titled `shared.move`. The code in this file creates the shared `Escrow` object and completes the trading logic. The complete source code for this file follows and the sections that come after detail its components. + +
+ +`shared.move` + +{@inject: examples/trading/contracts/escrow/sources/shared.move noComments} +
+ +Trading proceeds in three steps: + +1. The first party locks the object they want to trade – this is already handled by the `lock` module you wrote earlier. +1. The second party puts their object up for escrow and registers their interest in the first party's object. This is handled by a new module – `escrow`. +1. The first party completes the trade by providing their locked object and the key to unlock it. Assuming all checks pass, this transfers their object to the second party and makes the second party's object available to them. + +You can start by implementing steps two and three, by defining a new type to hold the escrowed object. It holds the `escrowed` object and an `id: UID` (because it's an object in its own right), but it also records the `sender` and intended `recipient` (to confirm they match when the trade happens), and it registers interest in the first party's object by recording the `ID` of the key that unlocks the `Locked` that contains the object. + +{@inject: examples/trading/contracts/escrow/sources/shared.move#struct=Escrow noComments singleSpace} + +You also need to create a function for creating the `Escrow` object. The object is shared because it needs to be accessed by the address that created it (in case the object needs to be returned) and by the intended recipient (to complete the swap). + +
+ +`create` function in `shared.move` + +{@inject: examples/trading/contracts/escrow/sources/shared.move#noemit noComments} +
+ +If the second party stops responding, the first party can unlock their object. You need to create a function so the second party can recover their object in the symmetric case as well. + +- It needs to check that the caller matches `sender`, because `Escrow` objects are shared and anybody can access them. +- It accepts the `Escrow` by value so that it can clean it up after extracting the escrowed object, reclaiming the storage rebate for the sender and cleaning up an unused object on chain. + +
+ +`return_to_sender` function in `shared.move` + +{@inject: examples/trading/contracts/escrow/sources/shared.move#fun=return_to_sender noComments} +
+ +Finally, you need to add a function to allow the first party to complete the trade. + +- This function also accepts the `Escrow` by value because it consumes it after the swap is complete. +- It checks that the sender of the transaction is the intended recipient (the first party), and that the ID of the key that they provided matches the key specified when the object was escrowed. This ensures no tampering occurs, because this key can be provided only if it had not been used to unlock the object, which proves the object has not left its `Locked` between the call to `create` and to `swap`. You can inspect the `lock` module to see that it cannot be modified while in there. +- The call to `unlock` further checks that the key matches the locked object that was provided. +- Instead of transferring the escrowed object to the recipient address, it is returned by the `swap` function. You can do this because you checked that the transaction sender is the recipient, and it makes this API more composable. Programmable transaction blocks (PTBs) provide the flexibility to decide whether to transfer the object as it is received or do something else with it. + +
+ +`swap` function in `shared.move` + +{@inject: examples/trading/contracts/escrow/sources/shared.move#variable=EMismatchedSenderRecipient,EMismatchedExchangeObject singleSpace noComments} +{@inject: examples/trading/contracts/escrow/sources/shared.move#fun=swap noComments noTitle} +
+ + +:::tip Additional resources + +- [Full source code](https://github.com/MystenLabs/sui/blob/705ee1ed3ce8cfadc4597c6facb6769d7dfb5896/examples/trading/contracts/escrow/sources/shared.move) +- Concepts: [Shared Objects](../../../concepts/object-ownership/shared) +- Concepts: [Shared Object Deletion](https://blog.sui.io/ephemeral-shared-objects/) +- Concepts: [PTBs](../../../concepts/transactions/prog-txn-blocks) + +::: + +### Testing + +Tests for the `escrow` module are more involved than for `lock` – as they take advantage of `test_scenario`'s ability to simulate multiple transactions from different senders, and interact with shared objects. + +The guide focuses on the test for a successful swap, but you can find a link to all the tests later on. + +As with the lock test, start by creating a function to mint a test coin. You also create some constants to represent our transaction senders, `ALICE`, `BOB`, and `DIANE`. + +{@inject: examples/trading/contracts/escrow/sources/shared.move#fun=test_coin noComments} + +The test body starts with a call to `test_scenario::begin` and ends with a call to `test_scenario::end`. It doesn't matter which address you pass to `begin`, because you pick one of `ALICE` or `BOB` at the start of each new transaction you write, so set it to `@0x0`: + +{@inject: examples/trading/contracts/escrow/sources/shared.move#test} + +The first transaction is from `BOB` who creates a coin and locks it. You must remember the ID of the coin and the ID of the key, which you will need later, and then you transfer the locked object and the key itself to `BOB`, because this is what would happen in a real transaction: When simulating transactions in a test, you should only keep around primitive values, not whole objects, which would need to be written to chain between transactions. + +Write these transactions inside the `test_successful_swap` function, between the call to `begin` and `end`. + +{@inject: examples/trading/contracts/escrow/sources/shared.move#variable=i2 noComments} + +Next, `ALICE` comes along and sets up the `Escrow`, which locks their coin. They register their interest for `BOB'`s coin by referencing `BOB`'s key's ID (`ik2`): + +{@inject: examples/trading/contracts/escrow/sources/shared.move#variable=i1 noComments} + +Finally, `BOB` completes the trade by calling `swap`. The `take_shared` function is used to simulate accepting a shared input. It uses type inference to know that the object must be an `Escrow`, and finds the last object of this type that was shared (by `ALICE` in the previous transaction). Similarly, use `take_from_sender` to simulate accepting owned inputs (in this case, `BOB`'s lock and key). The coin returned by `swap` is transferred back to `BOB`, as if it was called as part of a PTB, followed by a transfer command. + +{@inject: examples/trading/contracts/escrow/sources/shared.move#bob noComments} + +The rest of the test is designed to check that `ALICE` has `BOB`'s coin and vice versa. It starts by calling `next_tx` to make sure the effects of the previous transaction have been committed, before running the necessary checks. + +{@inject: examples/trading/contracts/escrow/sources/shared.move#finish noComments} + +:::tip Additional resources + +- Guides: [Test Scenario](../../../guides/developer/first-app/build-test#testing-a-package) + +::: + +### Observability + +The `escrow` Move package is now functional: You could publish it on chain and perform trustless swaps by creating transactions. Creating those transactions requires knowing the IDs of `Locked`, `Key`, and `Escrow` objects. + +`Locked` and `Key` objects are typically owned by the transaction sender, and so can be queried through the Sui RPC, but `Escrow` objects are shared, and it is useful to be able to query them by their sender and recipient (so that users can see the trades they have offered and received). + +Querying `Escrow` objects by their sender or recipient requires custom indexing, and to make it easy for the indexer to spot relevant transactions, add the following **events** to `escrow.move`: + +{@inject: examples/trading/contracts/escrow/sources/shared.move#struct=EscrowCreated,EscrowSwapped,EscrowCancelled noComments} + +Functions responsible for various aspects of the escrow's lifecycle emit these events. The custom indexer can then subscribe to transactions that emit these events and process only those, rather than the entire chain state: + +
+ +`emit` events included in functions from `shared.move` + +{@inject: examples/trading/contracts/escrow/sources/shared.move#use=sui::event} +{@inject: examples/trading/contracts/escrow/sources/shared.move#fun=create,swap,return_to_sender noTitle noComments} +
+ +:::tip Additional resources + +- Concepts: [Events](../../../concepts/events) + +::: + +:::checkpoint + +You now have `shared.move` and `locked.move` files in your `sources` folder. From the parent `escrow` folder, run `sui move test` in your terminal or console. If successful, you get a response similar to the following that confirms the package builds and your tests pass: + +``` +INCLUDING DEPENDENCY Sui +INCLUDING DEPENDENCY MoveStdlib +BUILDING escrow +Running Move unit tests +[ PASS ] escrow::lock::test_lock_key_mismatch +[ PASS ] escrow::shared::test_mismatch_object +[ PASS ] escrow::lock::test_lock_unlock +[ PASS ] escrow::shared::test_mismatch_sender +[ PASS ] escrow::shared::test_object_tamper +[ PASS ] escrow::shared::test_return_to_sender +[ PASS ] escrow::shared::test_return_to_sender_failed_swap +[ PASS ] escrow::shared::test_successful_swap +Test result: OK. Total tests: 8; passed: 8; failed: 0 +``` + +::: + +### Next steps + +Well done. You have written the Move package! 🚀 + +To turn this into a complete dApp, you need to create a frontend. However, for the frontend to be updated, it has to listen to the blockchain as escrows are made and swaps are fulfilled. + +To achieve this, in the next step you create an indexing service. + +## Backend indexer {#backend} + +With the contract adapted to emit events, you can now write an indexer that keeps track of all active `Escrow` objects and exposes an API for querying objects by sender or recipient. + +The indexer is backed by a Prisma DB with the following schema: + +
+ +`schema.prisma` + +{@inject: examples/trading/api/prisma/schema.prisma} +
+ +The core of the indexer is an event loop, initialized in a function called `setupListeners`. + +{@inject: examples/trading/api/indexer.ts} + +The indexer queries events related to the `escrow` module, using a `queryEvent` filter, and keeps track of a cursor representing the latest event it has processed so it can resume indexing from the right place even if it is restarted. The filter is looking for any events whose type is from the `escrow` module of the Move package (see the `event-indexer.ts` code that follows). + +The core event job works by polling: It queries RPC for events following its latest cursor and sends them to a callback for processing. If it detects more than one page of new events, it immediately requests the next page. Otherwise, the job waits for the next polling interval before checking again. + +
+ +`event-indexer.ts` + +{@inject: examples/trading/api/indexer/event-indexer.ts} +
+ +The callback is responsible for reading the event and updating the database accordingly. For demo purposes, SQLite is being used, and so you need to issue a separate `UPSERT` to the database for each escrowed object. In a production setting, however, you would want to batch requests to the database to optimize data flow. + +
+ +`escrow-handler.ts` + +{@inject: examples/trading/api/indexer/escrow-handler.ts} +
+ +:::tip Additional resources + +- [Full source code](https://github.com/MystenLabs/sui/tree/705ee1ed3ce8cfadc4597c6facb6769d7dfb5896/examples/trading/api) +- Reference: [JSON-RPC](https://docs.sui.io/sui-api-ref) + +::: + + +### API service + +The data that the indexer captures can then be served over an API, so that a frontend can read it. Follow the next section to implement the API in TypeScript, to run on Node, using Express. + +#### Query parameters + +You want your API to accept the query string in the URL as the parameters for database `WHERE` query. Hence, you want a utility that can extract and parse the URL query string into valid query parameters for Prisma. With the `parseWhereStatement()` function, the callers filter the set of keys from the URL query string and transforms those corresponding key-value pairs into the correct format for Prisma. + +
+ +`parseWhereStatement` in `api-queries.ts` + +{@inject: examples/trading/api/utils/api-queries.ts#enum=WhereParamTypes} +{@inject: examples/trading/api/utils/api-queries.ts#type=WhereParam noTitle} +{@inject: examples/trading/api/utils/api-queries.ts#variable=parseWhereStatement noTitle} +
+ + +#### Query pagination + +Pagination is another crucial part to ensure your API returns sufficient and/or ordered chunk of information instead of all the data that might be the vector for a DDOS attack. Similar to **WHERE parameters**, define a set of keys in the URL query string to be accepted as valid pagination parameters. The `parsePaginationForQuery()` utility function helps to achieve this by filtering the pre-determined keys `sort`, `limit`, `cursor` and parsing corresponding key-value pairs into `ApiPagination` that Prisma can consume. + +In this example, the `id` field of the model in the database as the cursor that allows clients to continue subsequent queries with the next page. + +
+ +`parsePaginationForQuery` in `api-queries.ts` + +{@inject: examples/trading/api/utils/api-queries.ts#type=ApiPagination} +{@inject: examples/trading/api/utils/api-queries.ts#variable=parsePaginationForQuery noTitle} +
+ +#### API endpoints + +All the endpoints are defined in `server.ts`, particularly, there are two endpoints: + +- `/locked` to query `Locked` objects. +- `/escrows` to query `Escrow` objects. + +You define a list of valid query keys, such as `deleted`, `creator`, `keyId`, and `objectId` for `Locked` data and `cancelled`, `swapped`, `recipient`, and `sender` for `Escrow` data. Pass the URL query string into the pre-defined utilities to output the correct parameters that Prisma can use. + +
+ +`server.ts` + +{@inject: examples/trading/api/server.ts} +
+ +### Deployment {#deployment} + +Now that you have an indexer and an API service, you can deploy your move package and start the indexer and API service. + +1. Install dependencies by running `pnpm install --ignore-workspace` or `yarn install --ignore-workspace`. + +2. Setup the database by running `pnpm db:setup:dev` or `yarn db:setup:dev`. + +3. Deploy the Sui package + +
+ + Deployment instructions + + {@include: ../../../snippets/initialize-sui-client-cli.mdx} + + Next, configure the Sui CLI to use `testnet` as the active environment. + + Use the following command to list your available environments: + + ```bash + sui client envs + ``` + + If you haven't already set up a `testnet` environment, do so by running the following command in a terminal or console: + + ```bash + sui client new-env --alias testnet --rpc https://fullnode.testnet.sui.io:443 + ``` + + Run the following command to activate the `testnet` environment: + + ```bash + sui client switch --env testnet + ``` + + Before being able to publish your package to Testnet, you need Testnet SUI tokens. To get some, run the following command: + + ```bash + sui client faucet + ``` + + For other ways to get SUI in your Testnet account, see [Get SUI Tokens](/guides/developer/getting-started/get-coins). + + Now that you have an account with some Testnet SUI, you can deploy your contracts. + + There are some helper functions to publish the smart contracts so you can create some demo data (for Testnet). The helper function to publish the smart contrqcts expects built smart contracts in both the `escrow` and `demo` directories. Run `sui move build` in both directories, if necessary. Be sure to update the Sui dependency in the manifest to point to the correct source based on your environment. + + To publish the smart contracts and produce demo data: + + 1. Publish the smart contracts by running the following command from your `api` folder: + + ``` + npx ts-node helpers/publish-contracts.ts + ``` + + If successful, `demo-contract.json` and `escrow-contract.json` are created in the backend root directory. These files contain the contract addresses and are used by the backend and frontend to interact with the contracts. + + 2. Produce demo non-locked and locked objects + + ``` + npx ts-node helpers/create-demo-data.ts + ``` + + 3. Produce demo escrows + + ``` + npx ts-node helpers/create-demo-escrows.ts + ``` + + If you want to reset the database (for a clean demo, for example), run `pnpm db:reset:dev && pnpm db:setup:dev` or `yarn db:reset:dev && yarn db:setup:dev`. +
+ +4. Run both the API and the indexer by running `pnpm dev` or `yarn dev`. + +5. Visit [http://localhost:3000/escrows](http://localhost:3000/escrows) or [http://localhost:3000/locked](http://localhost:3000/locked) + +:::checkpoint + +You should now have an indexer running. +- If you visit `localhost:3000`, you get a message that the service is running: `{"message":"🚀 API is functional 🚀"}`. +- If you visit `localhost:3000/escrows`, you see the demo escrow data the helper scripts created for you. Likewise, visiting `http://localhost:3000/locked` displays the raw JSON the script created for demo objects. + +::: + + +### Next steps + +With the code successfully deployed on Testnet, you can now [create a frontend](#frontend) to display the trading data and to allow users to interact with the Move modules. + +## Frontend {#frontend} + +In this final part of the app example, you build a frontend (UI) that allows end users to discover trades and interact with listed escrows. + +### Prerequisites + +{@include: ../../../snippets/app-examples-swap-source.mdx} Before getting started, make sure you have: -- [Installed the latest version of Sui](../getting-started/sui-install.mdx). -- [Configured a valid network environment](../../../references/cli/client.mdx#set-current-environment), as you will be deploying the module on Testnet. +- [Completed the smart contracts](#smart-contracts) and understand their design. +- [Implemented the backend](#backend) to learn how to index on-chain data and expose it through an API. +- [Deployed your smart contracts and started the backend indexer](#deployment). +- Installed [`pnpm`](https://pnpm.io/installation) or [`yarn`](https://classic.yarnpkg.com/lang/en/docs/install/#mac-stable) to use as the package manager. + +:::tip Additional resources + +- Tooling: [Sui Typescript SDK](https://sdk.mystenlabs.com/typescript). For basic usage on how to interact with Sui with TypeScript. +- Tooling: [Sui dApp Kit](https://sdk.mystenlabs.com/dapp-kit). To learn basic building blocks for developing a dApp in the Sui ecosystem with React.js. +- Tooling: [`@mysten/dapp`](https://sdk.mystenlabs.com/dapp-kit/create-dapp). This is used within this project to quickly scaffold a React-based Sui dApp. + +::: + +### Overview + +The UI design consists of three parts: + +- A header containing the button allowing users to connect their wallet and navigate to other pages. +- A place for users to manage their owned objects to be ready for escrow trading called `Manage Objects`. +- A place for users to discover, create, and execute trades called `Escrows`. + +### Scaffold a new app + +The first step is to set up the client app. Run the following command to scaffold a new app from your `frontend` folder. + + + + ```bash + pnpm create @mysten/dapp --template react-client-dapp + ``` + + + ```bash + yarn create @mysten/dapp --template react-client-dapp + ``` + + + +When asked for a name for your dApp, provide one of your liking. The dApp scaffold gets created in a new directory with the name you provide. This is convenient to keep your working code separate from the example source code that might already populate this folder. The codeblocks that follow point to the code in the default example location. Be aware the path to your own code includes the dApp name you provide. + +### Setting up import aliases + +First, set up import aliases to make the code more readable and maintainable. This allows you to import files using `@/` instead of relative paths. + +
+ + Replace the content of `tsconfig.json` with the following: + + {@inject: examples/trading/frontend/tsconfig.json} +
+ +The paths option under `compilerOptions` is what defines the aliasing for TypeScript. Here, the alias `@/*` is mapped to the `./src/*` directory, meaning that any time you use `@/`, TypeScript resolves it as a reference to the `src` folder. This setup reduces the need for lengthy relative paths when importing files in your project. + +
+ + Replace the content of `vite.config.ts` with the following: + + {@inject: examples/trading/frontend/vite.config.ts} +
+ +Vite also needs to be aware of the aliasing to resolve imports correctly during the build process. In the `resolve.alias` configuration of `vite.config.ts`, we map the alias `@` to the `/src` directory. + +### Adding Tailwind CSS + +To streamline the styling process and keep the codebase clean and maintainable, this guide uses Tailwind CSS, which provides utility-first CSS classes to rapidly build custom designs. Run the following command from the base of your dApp project to add Tailwind CSS and its dependencies: + + + + ```bash + pnpm add tailwindcss@latest postcss@latest autoprefixer@latest + ``` + + + ```bash + yarn add tailwindcss@latest postcss@latest autoprefixer@latest + ``` + + + +Next, generate the Tailwind CSS configuration file by running the following: + +```bash +npx tailwindcss init -p +``` + +
+ + Replace the content of `tailwind.config.js` with the following: + + {@inject: examples/trading/frontend/tailwind.config.js} +
+ +
+ + Add the `src/styles/` directory and add `base.css`: + + {@inject: examples/trading/frontend/src/styles/base.css} +
+ +### Connecting your deployed package + +First, deploy your package via the [scripts in the api directory](#deployment). + +
+ + Then, create a `src/constants.ts` file and fill it with the following: + + {@inject: examples/trading/frontend/src/constants.ts} +
+ +:::warning + +If you create a dApp using a project name so that your `src` files are in a subfolder of `frontend`, be sure to add another nesting level (`../`) to the import statements. + +::: + +### Add helper functions and UI components + +
+ + Create a `src/utils/` directory and add the following file: + + {@inject: examples/trading/frontend/src/utils/helpers.ts} +
+ +Create a `src/components/` directory and add the following components: + +
+ + `ExplorerLink.tsx` + + {@inject: examples/trading/frontend/src/components/ExplorerLink.tsx} +
+ +
+ + `InfiniteScrollArea.tsx` + + {@inject: examples/trading/frontend/src/components/InfiniteScrollArea.tsx} +
+ +
+ + `Loading.tsx` + + {@inject: examples/trading/frontend/src/components/Loading.tsx} +
+ +
+ + `SuiObjectDisplay.tsx` + + {@inject: examples/trading/frontend/src/components/SuiObjectDisplay.tsx} +
+ +Install the necessary dependencies: + + + + ```bash + pnpm add react-hot-toast + ``` + + + ```bash + yarn add react-hot-toast + ``` + + + + +### Set up routing {#routing} + +The imported template only has a single page. To add more pages, you need to set up routing. + +First, install the necessary dependencies: + + + + ```bash + pnpm add react-router-dom + ``` + + + ```bash + yarn add react-router-dom + ``` + + + +
+ + Then, create a `src/routes/` directory and add `index.tsx`. This file contains the routing configuration: + + {@inject: examples/trading/frontend/src/routes/index.tsx} +
+ +Add the following respective files to the `src/routes/` directory: + +
+ + `root.tsx`. This file contains the root component that is rendered on every page: + + {@inject: examples/trading/frontend/src/routes/root.tsx} +
+ +
+ + `LockedDashboard.tsx`. This file contains the component for the `Manage Objects` page. + +```tsx +export function LockedDashboard() { + return ( +
+

Locked Dashboard

+
+ ) +} +``` +
+ +
+ + `EscrowDashboard.tsx`. This file contains the component for the `Escrows` page. + +```tsx +export function EscrowDashboard() { + return ( +
+

Escrow Dashboard

+
+ ) +} +``` +
+ +
+ + Update `src/main.tsx` by replacing the `App` component with the `RouterProvider` and replace `"dark"` with `"light"` in the `Theme` component: + + {@inject: examples/trading/frontend/src/main.tsx} +
+ +Note that `dApp Kit` provides a set of hooks for making query and mutation calls to the Sui blockchain. These hooks are thin wrappers around query and mutation hooks from `@tanstack/react-query`. + +:::tip Additional resources + +- Docs: [React Router](https://reactrouter.com/en/main). Used to navigate between different routes in the website. +- Docs: [TanStack Query](https://tanstack.com/query/latest/docs/framework/react/overview). + +::: + +
+ + Create `src/components/Header.tsx`. This file contains the navigation links and the connect wallet button: + +```tsx +import { ConnectButton } from "@mysten/dapp-kit"; +import { SizeIcon } from "@radix-ui/react-icons"; +import { Box, Container, Flex, Heading } from "@radix-ui/themes"; +import { NavLink } from "react-router-dom"; + +const menu = [ + { + title: "Escrows", + link: "/escrows", + }, + { + title: "Manage Objects", + link: "/locked", + }, +]; + +export function Header() { + return ( + + + + + + Trading Demo + + + + + {menu.map((item) => ( + + `cursor-pointer flex items-center gap-2 ${ + isPending + ? "pending" + : isActive + ? "font-bold text-blue-600" + : "" + }` + } + > + {item.title} + + ))} + + + + + + + + ); +} +``` +
+ +The dApp Kit comes with a pre-built React.js component called `ConnectButton` displaying a button to connect and disconnect a wallet. The connecting and disconnecting wallet logic is handled seamlessly so you don't need to worry about repeating yourself doing the same logic all over again. + +:::checkpoint + +At this point, you have a basic routing setup. Run your app and ensure you can: + +- Navigate between the `Manage Objects` and `Escrows` pages. +- Connect and disconnect your wallet. + +Note, the styles should be applied. The `Header` component should look like this: + +![Header component](./images/styles.png) + +::: + +### Type definitions + +
+ + All the type definitions are in `src/types/types.ts`. Create this file and add the following: + + {@inject: examples/trading/frontend/src/types/types.ts} +
+ +`ApiLockedObject` and `ApiEscrowObject` represent the `Locked` and `Escrow` indexed data model the indexing and API service return. + +`EscrowListingQuery` and `LockedListingQuery` are the query parameters model to provide to the API service to fetch from the endpoints `/escrow` and `/locked` accordingly. + +### Display owned objects + +Now, display the objects owned by the connected wallet address. This is the `Manage Objects` page. + +
+ + First add this file `src/components/locked/LockOwnedObjects.tsx`: + +```tsx +import { useCurrentAccount, useSuiClientInfiniteQuery } from "@mysten/dapp-kit"; +import { SuiObjectDisplay } from "@/components/SuiObjectDisplay"; +import { InfiniteScrollArea } from "@/components/InfiniteScrollArea"; + +/** + * A component that fetches all the objects owned by the connected wallet address + * and allows the user to lock them, so they can be used in escrow. + */ +export function LockOwnedObjects() { + const account = useCurrentAccount(); + + const { data, fetchNextPage, isFetchingNextPage, hasNextPage, refetch } = + useSuiClientInfiniteQuery( + "getOwnedObjects", + { + owner: account?.address!, + options: { + showDisplay: true, + showType: true, + }, + }, + { + enabled: !!account, + select: (data) => + data.pages + .flatMap((page) => page.data) + .filter( + // we're filtering out objects that don't have Display or image_url + // for demo purposes. The Escrow contract works with all objects. + (x) => !!x.data?.display && !!x.data?.display?.data?.image_url, + ), + }, + ); + + return ( + fetchNextPage()} + hasNextPage={hasNextPage} + loading={isFetchingNextPage} + > + {data?.map((obj) => ( + + + ))} + + ); +} +``` +
+ +Fetch the owned objects directly from Sui blockchain using the `useSuiClientInfiniteQuery()` hook from `dApp Kit`. This hook is a thin wrapper around Sui blockchain RPC calls, reference the documentation to learn more about these [RPC hooks](https://sdk.mystenlabs.com/dapp-kit/rpc-hooks). Basically, supply the RPC endpoint you want to execute, in this case it's the [`getOwnedObjects` endpoint](https://docs.sui.io/sui-api-ref#suix_getownedobjects). Supply the connected wallet account as the `owner`. The returned data is stored inside the cache at query key `getOwnedObjects`. In a future step you invalidate this cache after a mutation succeeds, so the data will be re-fetched automatically. + + +
+ + Next, update `src/routes/LockedDashboard.tsx` to include the `LockOwnedObjects` component: + +```tsx +import { useState } from "react"; +import { Tabs } from "@radix-ui/themes"; +import { LockOwnedObjects } from "@/components/locked/LockOwnedObjects"; + +export function LockedDashboard() { + const tabs = [ + { + name: "Lock Owned objects", + component: () => , + }, + ]; + + const [tab, setTab] = useState(tabs[0].name); + + return ( + + + {tabs.map((tab, index) => { + return ( + + {tab.name} + + ); + })} + + {tabs.map((tab, index) => { + return ( + + {tab.component()} + + ); + })} + + ); +} +``` +
+ +:::checkpoint + +Run your app and ensure you can: + +- View the owned objects of the connected wallet account. + +If you don't see any objects, you might need to create some demo data or connect your wallet. You can mint objects after completing the next steps. + +![Owned objects](./images/trustless-objects.png) + +::: + +### Execute transaction hook {#execute-transaction-hook} + +In the frontend, you might need to execute a transaction block in multiple places, hence it's better to extract the transaction execution logic and reuse it everywhere. Let's create and examine the execute transaction hook. + + +
+ + Create `src/hooks/useTransactionExecution.ts`: + + {@inject: examples/trading/frontend/src/hooks/useTransactionExecution.ts} +
+ +A `Transaction` is the input, sign it with the current connected wallet account, execute the transaction block, return the execution result, and finally display a basic toast message to indicate whether the transaction is successful or not. + +Use the `useSuiClient()` hook from `dApp Kit` to retrieve the Sui client instance configured in `src/main.tsx`. The `useSignTransaction()` function is another hook from `dApp kit` that helps to sign the transaction block using the currently connected wallet. It displays the UI for users to review and sign their transactions with their selected wallet. To execute a transaction block, use the `executeTransaction()` on the Sui client instance of the Sui TypeScript SDK. + +### Generate demo data + +:::info + +The full source code of the demo bear smart contract is available at [Trading Contracts Demo directory](https://github.com/MystenLabs/sui/tree/main/examples/trading/contracts/demo) + +::: + +You need a utility function to create a dummy object representing a real world asset so you can use it to test and demonstrate escrow users flow on the UI directly. + +
+ + Create `src/mutations/demo.ts`: + + {@inject: examples/trading/frontend/src/mutations/demo.ts} +
+ +As previously mentioned, this example uses `@tanstack/react-query` to query, cache, and mutate server state. Server state is data only available on remote servers, and the only way to retrieve or update this data is by interacting with these remote servers. In this case, it could be from an API or directly from Sui blockchain RPC. + +When you execute a transaction call to mutate data on the Sui blockchain, use the `useMutation()` hook. The `useMutation()` hook accepts several inputs, however, you only need two of them for this example. The first parameter, `mutationFn`, accepts the function to execute the main mutating logic, while the second parameter, `onSuccess`, is a callback that runs when the mutating logic succeeds. + +The main mutating logic includes executing a Move call of a package named `demo_bear::new` to create a dummy bear object and transferring it to the connected wallet account, all within the same `Transaction`. This example reuses the `executeTransaction()` hook from the [Execute Transaction Hook](#execute-transaction-hook) step to execute the transaction. + +Another benefit of wrapping the main mutating logic inside `useMutation()` is that you can access and manipulate the cache storing server state. This example fetches the cache from remote servers by using query call in an appropriate callback. In this case, it is the `onSuccess` callback. When the transaction succeeds, invalidate the cache data at the cache key called `getOwnedObjects`, then `@tanstack/react-query` handles the re-fetching mechanism for the invalidated data automatically. Do this by using `invalidateQueries()` on the `@tanstack/react-query` configured client instance retrieved by `useQueryClient()` hook in the [Set up Routing](#routing) step. + +Now the logic to create a dummy bear object exists. You just need to attach it into the button in the header. + +
+ + `Header.tsx` + + {@inject: examples/trading/frontend/src/components/Header.tsx} +
+ +:::checkpoint + +Run your app and ensure you can: + +- Mint a demo bear object and view it in the `Manage Objects` tab. + +![New bear](./images/trustless-new-bear.png) + +::: + +### Locking owned objects + +To lock the object, execute the `lock` Move function identified by `{PACKAGE_ID}::lock::lock`. The implementation is similar to what's in previous mutation functions, use `useMutation()` from `@tanstack/react-query` to wrap the main logic inside it. The lock function requires an object to be locked and its type because our smart contract `lock` function is generic and requires type parameters. After creating a `Locked` object and its `Key` object, transfer them to the connected wallet account within the same transaction block. + +It's beneficial to extract logic of locking owned objects into a separated mutating function to enhance discoverability and encapsulation. + +
+ + Create `src/mutations/locked.ts`: + +```tsx +import { CONSTANTS } from "@/constants"; +import { useTransactionExecution } from "@/hooks/useTransactionExecution"; +import { useCurrentAccount } from "@mysten/dapp-kit"; +import { SuiObjectData } from "@mysten/sui/client"; +import { Transaction } from "@mysten/sui/transactions"; +import { useMutation } from "@tanstack/react-query"; +/** + * Builds and executes the PTB to lock an object. + */ +export function useLockObjectMutation() { + const account = useCurrentAccount(); + const executeTransaction = useTransactionExecution(); + + return useMutation({ + mutationFn: async ({ object }: { object: SuiObjectData }) => { + if (!account?.address) + throw new Error("You need to connect your wallet!"); + const txb = new Transaction(); + + const [locked, key] = txb.moveCall({ + target: `${CONSTANTS.escrowContract.packageId}::lock::lock`, + arguments: [txb.object(object.objectId)], + typeArguments: [object.type!], + }); + + txb.transferObjects([locked, key], txb.pure.address(account.address)); + + return executeTransaction(txb); + }, + }); +} +``` +
+ +Update `src/components/locked/LockOwnedObjects.tsx` to include the `useLockObjectMutation` hook: + +
+ + `LockOwnedObjects.tsx` + + {@inject: examples/trading/frontend/src/components/locked/LockOwnedObjects.tsx} +
+ +:::checkpoint + +Run your app and ensure you can: + +- Lock an owned object. + +The object should disappear from the list of owned objects. You view and unlock locked objects in later steps. + +![Lock bear](./images/trustless-lock-bear.png) + +::: + +### Display owned locked objects + +Let's take a look at the **My Locked Objects** tab by examining `src/components/locked/OwnedLockedList.tsx`. Focus on the logic on how to retrieve this list. + +
+ + `OwnedLockedList.tsx` + + {@inject: examples/trading/frontend/src/components/locked/OwnedLockedList.tsx} +
+ +This instance of `useSuiClientInfiniteQuery()` is similar to the one in the `LockOwnedObjects` component. The difference is that it fetches the locked objects instead of the owned objects. The `Locked` object is a struct type in the smart contract, so you need to supply the struct type to the query call as a `filter`. The struct type is usually identified by the format of `{PACKAGE_ID}::{MODULE_NAME}::{STRUCT_TYPE}`. + +##### `LockedObject` and `Locked` component + +The `` (`src/components/locked/LockedObject.tsx`) component is mainly responsible for mapping an on-chain `SuiObjectData` `Locked` object to its corresponding `ApiLockedObject`, which is finally delegated to the `` component for rendering. The `` fetches the locked item object ID if the prop `itemId` is not supplied by using `dApp Kit` `useSuiClientQuery()` hook to call the `getDynamicFieldObject` RPC endpoint. Recalling that in this smart contract, the locked item is put into a dynamic object field. + +
+ + `LockedObject.tsx` + + {@inject: examples/trading/frontend/src/components/locked/LockedObject.tsx} +
+ +The `` (`src/components/locked/partials/Locked.tsx`) component is mainly responsible for rendering the `ApiLockedObject`. Later on, it will also consist of several on-chain interactions: unlock the locked objects and create an escrow out of the locked object. + +
+ + `Locked.tsx` + +```tsx +import { useCurrentAccount, useSuiClientQuery } from "@mysten/dapp-kit"; +import { SuiObjectDisplay } from "@/components/SuiObjectDisplay"; +import { ExplorerLink } from "../../ExplorerLink"; +import { ApiLockedObject } from "@/types/types"; + +/** + * Prefer to use the `Locked` component only through `LockedObject`. + * + * This can also render data directly from the API, but we prefer + * to also validate ownership from on-chain state (as objects are transferrable) + * and the API cannot track all the ownership changes. + */ +export function Locked({ + locked, + hideControls, +}: { + locked: ApiLockedObject; + hideControls?: boolean; +}) { + const account = useCurrentAccount(); + + const suiObject = useSuiClientQuery( + "getObject", + { + id: locked.itemId, + options: { + showDisplay: true, + showType: true, + showOwner: true, + }, + }, + { + select: (data) => data.data, + }, + ); + + const getLabel = () => { + if (locked.deleted) return "Deleted"; + if (hideControls) { + if (locked.creator === account?.address) return "You offer this"; + return "You'll receive this if accepted"; + } + return undefined; + }; + + const getLabelClasses = () => { + if (locked.deleted) + return "bg-red-50 rounded px-3 py-1 text-sm text-red-500"; + if (hideControls) { + if (!!locked.creator && locked.creator === account?.address) + return "bg-blue-50 rounded px-3 py-1 text-sm text-blue-500"; + return "bg-green-50 rounded px-3 py-1 text-sm text-green-700"; + } + return undefined; + }; + + return ( + +
+ { +

+ +

+ } +
+
+ ); +} +``` +
+ +Update `src/routes/LockedDashboard.tsx` to include the `OwnedLockedList` component: + +
+ + `LockedDashboard.tsx` + + {@inject: examples/trading/frontend/src/routes/LockedDashboard.tsx} +
+ +:::checkpoint + +Run your app and ensure you can: + +- View the locked objects of the connected wallet account. + +![My locked bears](./images/trustless-my-locked.png) + +::: + +### Unlocking owned objects + +To unlock the object, execute the `unlock` Move function identified by `{PACKAGE_ID}::lock::unlock`. Call the `unlock` function supplying the `Locked` object, its corresponding `Key`, the struct type of the original object, and transfer the unlocked object to the current connected wallet account. Also, implement the `onSuccess` callback to invalidate the cache data at query key `locked` after one second to force `react-query` to re-fetch the data at corresponding query key automatically. + +Unlocking owned objects is another crucial and complex on-chain action in this application. Hence, it's beneficial to extract its logic into separated mutating functions to enhance discoverability and encapsulation. + +
+ + `src/mutations/locked.ts` + + {@inject: examples/trading/frontend/src/mutations/locked.ts} +
+ +Update `src/components/locked/partials/Locked.tsx` to include the `useUnlockObjectMutation` hook: + +
+ + `Locked.tsx` + +```tsx +import { useCurrentAccount, useSuiClientQuery } from "@mysten/dapp-kit"; +import { SuiObjectDisplay } from "@/components/SuiObjectDisplay"; +import { Button } from "@radix-ui/themes"; +import { + ArrowDownIcon, + ArrowUpIcon, + LockOpen1Icon, +} from "@radix-ui/react-icons"; +import { ExplorerLink } from "../../ExplorerLink"; +import { useState } from "react"; +import { ApiLockedObject } from "@/types/types"; +import { useUnlockMutation } from "@/mutations/locked"; + +/** + * Prefer to use the `Locked` component only through `LockedObject`. + * + * This can also render data directly from the API, but we prefer + * to also validate ownership from on-chain state (as objects are transferrable) + * and the API cannot track all the ownership changes. + */ +export function Locked({ + locked, + hideControls, +}: { + locked: ApiLockedObject; + hideControls?: boolean; +}) { + const [isToggled, setIsToggled] = useState(false); + const account = useCurrentAccount(); + const { mutate: unlockMutation, isPending } = useUnlockMutation(); + + const suiObject = useSuiClientQuery( + "getObject", + { + id: locked.itemId, + options: { + showDisplay: true, + showType: true, + showOwner: true, + }, + }, + { + select: (data) => data.data, + }, + ); + + const isOwner = () => { + return !!locked.creator && account?.address === locked.creator; + }; + + const getLabel = () => { + if (locked.deleted) return "Deleted"; + if (hideControls) { + if (locked.creator === account?.address) return "You offer this"; + return "You'll receive this if accepted"; + } + return undefined; + }; + + const getLabelClasses = () => { + if (locked.deleted) + return "bg-red-50 rounded px-3 py-1 text-sm text-red-500"; + if (hideControls) { + if (!!locked.creator && locked.creator === account?.address) + return "bg-blue-50 rounded px-3 py-1 text-sm text-blue-500"; + return "bg-green-50 rounded px-3 py-1 text-sm text-green-700"; + } + return undefined; + }; + + return ( + +
+ { +

+ +

+ } + {!hideControls && isOwner() && ( + + )} +
+
+ ); +} +``` +
+ +:::checkpoint + +Run your app and ensure you can: + +- Unlock a locked object. + +![Unlock my locked bears](./images/trustless-unlock-bear.png) + +::: + +### Display locked objects to escrow + +Update `src/routes/EscrowDashboard.tsx` to include the `LockedList` component: + +
+ + `EscrowDashboard.tsx` + +```tsx +import { useState } from "react"; +import { Tabs, Tooltip } from "@radix-ui/themes"; +import { LockedList } from "../components/locked/ApiLockedList"; +import { InfoCircledIcon } from "@radix-ui/react-icons"; + +export function EscrowDashboard() { + const tabs = [ + { + name: "Browse Locked Objects", + component: () => ( + + ), + tooltip: "Browse locked objects you can trade for.", + }, + ]; + + const [tab, setTab] = useState(tabs[0].name); + + return ( + + + {tabs.map((tab, index) => { + return ( + + {tab.name} + + + + + ); + })} + + {tabs.map((tab, index) => { + return ( + + {tab.component()} + + ); + })} + + ); +} +``` +
+ +Add `src/components/locked/ApiLockedList.tsx`: + +
+ + `ApiLockedList.tsx` + + {@inject: examples/trading/frontend/src/components/locked/ApiLockedList.tsx} +
+ +This hook fetches all the non-deleted system `Locked` objects from the API in a paginated fashion. Then, it proceeds into fetching the on-chain state, to ensure the latest state of the object is displayed. + +This component uses tanstack's `useInfiniteQuery` instead of `useSuiClientInfiniteQuery` since the data is being fetched from the example's API rather than Sui. + +
+ + Add `src/hooks/useGetLockedObject.ts` + + {@inject: examples/trading/frontend/src/hooks/useGetLockedObject.ts} +
+ +:::checkpoint + +Run your app and ensure you can: + +- View the locked objects in the `Browse Locked Objects` tab in the `Escrows` page. + +![Browse locked bears](./images/trustless-escrow-locked.png) + +::: + +### Create escrows + +To create escrows, include a mutating function through the `useCreateEscrowMutation` hook in `src/mutations/escrow.ts`. It accepts the escrowed item to be traded and the `ApiLockedObject` from another party as parameters. Then, call the `{PACKAGE_ID}::shared::create` Move function and provide the escrowed item, the key id of the locked object to exchange, and the recipient of the escrow (locked object's owner). + +
+ + `escrow.ts` + +```tsx +import { CONSTANTS } from "@/constants"; +import { useTransactionExecution } from "@/hooks/useTransactionExecution"; +import { ApiLockedObject } from "@/types/types"; +import { useCurrentAccount } from "@mysten/dapp-kit"; +import { SuiObjectData } from "@mysten/sui/client"; +import { Transaction } from "@mysten/sui/transactions"; +import { useMutation } from "@tanstack/react-query"; + +/** + * Builds and executes the PTB to create an escrow. + */ +export function useCreateEscrowMutation() { + const currentAccount = useCurrentAccount(); + const executeTransaction = useTransactionExecution(); + + return useMutation({ + mutationFn: async ({ + object, + locked, + }: { + object: SuiObjectData; + locked: ApiLockedObject; + }) => { + if (!currentAccount?.address) + throw new Error("You need to connect your wallet!"); + + const txb = new Transaction(); + txb.moveCall({ + target: `${CONSTANTS.escrowContract.packageId}::shared::create`, + arguments: [ + txb.object(object.objectId!), + txb.pure.id(locked.keyId), + txb.pure.address(locked.creator!), + ], + typeArguments: [object.type!], + }); + + return executeTransaction(txb); + }, + }); +} +``` +
+ +
+ + Update `src/components/locked/partials/Locked.tsx` to include the `useCreateEscrowMutation` hook + + {@inject: examples/trading/frontend/src/components/locked/partials/Locked.tsx} +
+ +
+ + Add `src/components/escrows/CreateEscrow.tsx` + + {@inject: examples/trading/frontend/src/components/escrows/CreateEscrow.tsx} +
+ +:::checkpoint + +Run your app and ensure you can: + +- Create an escrow. + +The object should disappear from the list of locked objects in the `Browse Locked Objects` tab in the `Escrows` page. You view and accept or cancel escrows in later steps. + +![Start escrow](./images/trustless-start-escrow.png) + +::: + +### Cancel escrows + +To cancel the escrow, create a mutation through the `useCancelEscrowMutation` hook in `src/mutations/escrow.ts`. The cancel function accepts the escrow `ApiEscrowObject` and its on-chain data. The `{PACKAGE_ID}::shared::return_to_sender` Move call is generic, thus it requires the type parameters of the escrowed object. Next, execute `{PACKAGE_ID}::shared::return_to_sender` and transfer the returned escrowed object to the creator of the escrow. + +
+ + `escrow.ts` + +```tsx +import { CONSTANTS, QueryKey } from "@/constants"; +import { useTransactionExecution } from "@/hooks/useTransactionExecution"; +import { ApiEscrowObject, ApiLockedObject } from "@/types/types"; +import { useCurrentAccount } from "@mysten/dapp-kit"; +import { SuiObjectData } from "@mysten/sui/client"; +import { Transaction } from "@mysten/sui/transactions"; +import { useMutation, useQueryClient } from "@tanstack/react-query"; + +/** + * Builds and executes the PTB to create an escrow. + */ +export function useCreateEscrowMutation() { + const currentAccount = useCurrentAccount(); + const executeTransaction = useTransactionExecution(); + + return useMutation({ + mutationFn: async ({ + object, + locked, + }: { + object: SuiObjectData; + locked: ApiLockedObject; + }) => { + if (!currentAccount?.address) + throw new Error("You need to connect your wallet!"); + + const txb = new Transaction(); + txb.moveCall({ + target: `${CONSTANTS.escrowContract.packageId}::shared::create`, + arguments: [ + txb.object(object.objectId!), + txb.pure.id(locked.keyId), + txb.pure.address(locked.creator!), + ], + typeArguments: [object.type!], + }); + + return executeTransaction(txb); + }, + }); +} + +/** + * Builds and executes the PTB to cancel an escrow. + */ +export function useCancelEscrowMutation() { + const currentAccount = useCurrentAccount(); + const executeTransaction = useTransactionExecution(); + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: async ({ + escrow, + suiObject, + }: { + escrow: ApiEscrowObject; + suiObject: SuiObjectData; + }) => { + if (!currentAccount?.address) + throw new Error("You need to connect your wallet!"); + const txb = new Transaction(); + + const item = txb.moveCall({ + target: `${CONSTANTS.escrowContract.packageId}::shared::return_to_sender`, + arguments: [txb.object(escrow.objectId)], + typeArguments: [suiObject?.type!], + }); + + txb.transferObjects([item], txb.pure.address(currentAccount?.address!)); + + return executeTransaction(txb); + }, + + onSuccess: () => { + setTimeout(() => { + queryClient.invalidateQueries({ queryKey: [QueryKey.Escrow] }); + }, 1_000); + }, + }); +} +``` +
+ +
+ + Add `src/components/escrows/Escrow.tsx` + +```tsx +import { useCurrentAccount, useSuiClientQuery } from "@mysten/dapp-kit"; +import { SuiObjectDisplay } from "@/components/SuiObjectDisplay"; +import { Button } from "@radix-ui/themes"; +import { + ArrowDownIcon, + ArrowUpIcon, + Cross1Icon, +} from "@radix-ui/react-icons"; +import { CONSTANTS, QueryKey } from "@/constants"; +import { ExplorerLink } from "../ExplorerLink"; +import { useQuery } from "@tanstack/react-query"; +import { useState } from "react"; +import { ApiEscrowObject } from "@/types/types"; +import { + useCancelEscrowMutation, +} from "@/mutations/escrow"; +import { useGetLockedObject } from "@/hooks/useGetLockedObject"; +import { LockedObject } from "../locked/LockedObject"; + +/** + * A component that displays an escrow and allows the user to accept or cancel it. + * Accepts an `escrow` object as returned from the API. + */ +export function Escrow({ escrow }: { escrow: ApiEscrowObject }) { + const account = useCurrentAccount(); + const [isToggled, setIsToggled] = useState(true); + const { mutate: cancelEscrowMutation, isPending: pendingCancellation } = + useCancelEscrowMutation(); + + const suiObject = useSuiClientQuery("getObject", { + id: escrow?.itemId, + options: { + showDisplay: true, + showType: true, + }, + }); + + const lockedData = useQuery({ + queryKey: [QueryKey.Locked, escrow.keyId], + queryFn: async () => { + const res = await fetch( + `${CONSTANTS.apiEndpoint}locked?keyId=${escrow.keyId}`, + ); + return res.json(); + }, + select: (data) => data.data[0], + enabled: !escrow.cancelled, + }); + + const { data: suiLockedObject } = useGetLockedObject({ + lockedId: lockedData.data?.objectId, + }); + + const getLabel = () => { + if (escrow.cancelled) return "Cancelled"; + if (escrow.swapped) return "Swapped"; + if (escrow.sender === account?.address) return "You offer this"; + if (escrow.recipient === account?.address) return "You'll receive this"; + return undefined; + }; + const getLabelClasses = () => { + if (escrow.cancelled) return "text-red-500"; + if (escrow.swapped) return "text-green-500"; + if (escrow.sender === account?.address) + return "bg-blue-50 rounded px-3 py-1 text-sm text-blue-500"; + if (escrow.recipient === account?.address) + return "bg-green-50 rounded px-3 py-1 text-sm text-green-700"; + return undefined; + }; + + return ( + +
+ { +

+ +

+ } + + {!escrow.cancelled && + !escrow.swapped && + escrow.sender === account?.address && ( + + )} + {isToggled && lockedData.data && ( +
+ {suiLockedObject?.data && ( + + )} + + {!lockedData.data.deleted && + escrow.recipient === account?.address && ( +
+

+ When accepting the exchange, the escrowed item is + transferred to you and your locked item is transferred + to the sender. +

+
+ )} + {lockedData.data.deleted && + !escrow.swapped && + escrow.recipient === account?.address && ( +
+

+ + The locked object has been deleted so you can't accept this + anymore. +

+
+ )} +
+ )} +
+
+ ); +} +``` +
+ +
+ + Add `src/components/escrows/EscrowList.tsx` + + {@inject: examples/trading/frontend/src/components/escrows/EscrowList.tsx} +
+ +
+ + Update `src/routes/EscrowDashboard.tsx` to include the `EscrowList` component + +```tsx +import { useState } from "react"; +import { Tabs, Tooltip } from "@radix-ui/themes"; +import { LockedList } from "../components/locked/ApiLockedList"; +import { EscrowList } from "../components/escrows/EscrowList"; +import { InfoCircledIcon } from "@radix-ui/react-icons"; +import { useCurrentAccount } from "@mysten/dapp-kit"; + +export function EscrowDashboard() { + const account = useCurrentAccount(); + const tabs = [ + { + name: "Browse Locked Objects", + component: () => ( + + ), + tooltip: "Browse locked objects you can trade for.", + }, + { + name: "My Pending Requests", + component: () => ( + + ), + tooltip: "Escrows you have initiated for third party locked objects.", + }, + ]; + + const [tab, setTab] = useState(tabs[0].name); + + return ( + + + {tabs.map((tab, index) => { + return ( + + {tab.name} + + + + + ); + })} + + {tabs.map((tab, index) => { + return ( + + {tab.component()} + + ); + })} + + ); +} +``` +
+ +:::checkpoint + +Run your app and ensure you can: + +- View the escrows in the `My Pending Requests` tab in the `Escrows` page. +- Cancel an escrow that you requested. + +![Cancel escrow](./images/trustless-cancel-escrow.png) + +::: + +### Accept escrows + +To accept the escrow, create a mutation through the `useAcceptEscrowMutation` hook in `src/mutations/escrow.ts`. The implementation should be fairly familiar to you now. The accept function accepts the escrow `ApiEscrowObject` and the locked object `ApiLockedObject`. The `{PACKAGE_ID}::shared::swap` Move call is generic, thus it requires the type parameters of the escrowed and locked objects. Query the objects details by using `multiGetObjects` on Sui client instance. Lastly, execute the `{PACKAGE_ID}::shared::swap` Move call and transfer the returned escrowed item to the connected wallet account. When the mutation succeeds, invalidate the cache to allow automatic re-fetch of the data. + +
+ + `escrow.ts` + +```tsx +import { CONSTANTS, QueryKey } from "@/constants"; +import { useTransactionExecution } from "@/hooks/useTransactionExecution"; +import { ApiEscrowObject, ApiLockedObject } from "@/types/types"; +import { useCurrentAccount, useSuiClient } from "@mysten/dapp-kit"; +import { SuiObjectData } from "@mysten/sui/client"; +import { Transaction } from "@mysten/sui/transactions"; +import { useMutation, useQueryClient } from "@tanstack/react-query"; + +/** + * Builds and executes the PTB to create an escrow. + */ +export function useCreateEscrowMutation() { + const currentAccount = useCurrentAccount(); + const executeTransaction = useTransactionExecution(); + + return useMutation({ + mutationFn: async ({ + object, + locked, + }: { + object: SuiObjectData; + locked: ApiLockedObject; + }) => { + if (!currentAccount?.address) + throw new Error("You need to connect your wallet!"); + + const txb = new Transaction(); + txb.moveCall({ + target: `${CONSTANTS.escrowContract.packageId}::shared::create`, + arguments: [ + txb.object(object.objectId!), + txb.pure.id(locked.keyId), + txb.pure.address(locked.creator!), + ], + typeArguments: [object.type!], + }); + + return executeTransaction(txb); + }, + }); +} + +/** + * Builds and executes the PTB to cancel an escrow. + */ +export function useCancelEscrowMutation() { + const currentAccount = useCurrentAccount(); + const executeTransaction = useTransactionExecution(); + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: async ({ + escrow, + suiObject, + }: { + escrow: ApiEscrowObject; + suiObject: SuiObjectData; + }) => { + if (!currentAccount?.address) + throw new Error("You need to connect your wallet!"); + const txb = new Transaction(); + + const item = txb.moveCall({ + target: `${CONSTANTS.escrowContract.packageId}::shared::return_to_sender`, + arguments: [txb.object(escrow.objectId)], + typeArguments: [suiObject?.type!], + }); + + txb.transferObjects([item], txb.pure.address(currentAccount?.address!)); + + return executeTransaction(txb); + }, + + onSuccess: () => { + setTimeout(() => { + queryClient.invalidateQueries({ queryKey: [QueryKey.Escrow] }); + }, 1_000); + }, + }); +} + +/** + * Builds and executes the PTB to accept an escrow. + */ +export function useAcceptEscrowMutation() { + const currentAccount = useCurrentAccount(); + const client = useSuiClient(); + const executeTransaction = useTransactionExecution(); + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: async ({ + escrow, + locked, + }: { + escrow: ApiEscrowObject; + locked: ApiLockedObject; + }) => { + if (!currentAccount?.address) + throw new Error("You need to connect your wallet!"); + const txb = new Transaction(); + + const escrowObject = await client.multiGetObjects({ + ids: [escrow.itemId, locked.itemId], + options: { + showType: true, + }, + }); + + const escrowType = escrowObject.find( + (x) => x.data?.objectId === escrow.itemId, + )?.data?.type; + + const lockedType = escrowObject.find( + (x) => x.data?.objectId === locked.itemId, + )?.data?.type; + + if (!escrowType || !lockedType) { + throw new Error("Failed to fetch types."); + } + + const item = txb.moveCall({ + target: `${CONSTANTS.escrowContract.packageId}::shared::swap`, + arguments: [ + txb.object(escrow.objectId), + txb.object(escrow.keyId), + txb.object(locked.objectId), + ], + typeArguments: [escrowType, lockedType], + }); + + txb.transferObjects([item], txb.pure.address(currentAccount.address)); + + return executeTransaction(txb); + }, + + onSuccess: () => { + setTimeout(() => { + queryClient.invalidateQueries({ queryKey: [QueryKey.Escrow] }); + }, 1_000); + }, + }); +} +``` +
+ +
+ + Update `src/components/escrows/Escrow.tsx` to include the `useAcceptEscrowMutation` hook + + {@inject: examples/trading/frontend/src/components/escrows/Escrow.tsx} +
+ +
+ + Update `src/routes/EscrowDashboard.tsx` to include the `EscrowList` component + + {@inject: examples/trading/frontend/src/routes/EscrowDashboard.tsx} +
+ +:::checkpoint + +Run your app and ensure you can: + +- Accept an escrow that someone else requested. + +![Accept escrow](./images/trustless-accept-escrow.png) + +::: + +### Finished frontend + +At this point, you have a fully functional frontend that allows users to discover trades and interact with listed escrows. The UI is designed to be user-friendly and intuitive, allowing users to easily navigate and interact with the application. Have fun exploring the app and testing out the different features! diff --git a/docs/content/guides/developer/app-examples/trustless-swap/backend.mdx b/docs/content/guides/developer/app-examples/trustless-swap/backend.mdx deleted file mode 100644 index a8ddfc59d22af..0000000000000 --- a/docs/content/guides/developer/app-examples/trustless-swap/backend.mdx +++ /dev/null @@ -1,163 +0,0 @@ ---- -title: Trustless Swap Backend -sidebar_label: Backend ---- - -:::note Multi-Page Guide - -This is the first in a [three-part guide](../trustless-swap.mdx) on how to build a trustless atomic swap on Sui. - -::: - -This particular protocol consists of three phases: - -1. One party `lock`s their object, obtaining a `Locked` object and its `Key`. This party can `unlock` their object to preserve liveness if the other party stalls before completing the second stage. -2. The other party registers a publicly accessible, shared `Escrow` object. This effectively locks their object at a particular version as well, waiting for the first party to complete the swap. The second party is able to request their object is returned to them, to preserve liveness as well. -3. The first party sends their locked object and its key to the shared `Escrow` object. This completes the swap, as long as all conditions are met: The sender of the swap transaction is the recipient of the `Escrow`, the key of the desired object (`exchange_key`) in the escrow matches the key supplied in the swap, and the key supplied in the swap unlocks the `Locked`. - -Let's create a Sui project using the terminal command `sui move new escrow`. Create a file in the sources directory named `shared.move`, and let's go through the code together. - -## shared.move - -{@include: ../../../../snippets/app-examples-swap-source.mdx} - -Let's go through the code line by line: - -### Structs - -#### `Escrow` - -This struct represents an object held in escrow. It contains the following fields: - -- `id`: Unique identifier for the escrow object. -- `sender`: Address of the owner of the `escrowed` object. -- `recipient`: Intended recipient of the `escrowed` object. -- `exchange_key`: ID of the key that opens the lock on the object sender wants from the recipient. -- `escrowed`: The actual object held in escrow. - -```move -struct Escrow has key, store { - id: UID, - sender: address, - recipient: address, - exchange_key: ID, - escrowed: T, -} -``` - -The ID of the key is used as the `exchange_key`, rather than the ID of the object, to ensure that the object is not modified after a trade has been initiated. - -### Error codes - -Two constants are defined to represent potential errors during the execution of the swap: - -- `EMismatchedSenderRecipient`: The `sender` and `recipient` of the two escrowed objects do not match. -- `EMismatchedExchangeObject`: The `exchange_for` fields of the two escrowed objects do not match. - -```move -const EMismatchedSenderRecipient: u64 = 0; -const EMismatchedExchangeObject: u64 = 1; -``` - -### Public functions - -#### `create` - -This function is used to create a new escrow object. It takes four arguments: the object to be escrowed, the ID of the key that opens the lock on the object the sender wants from the recipient, the intended recipient, and the transaction context. - -```move -public fun create( - escrowed: T, - exchange_key: ID, - recipient: address, - ctx: &mut TxContext -) { - let mut escrow = Escrow { - id: object::new(ctx), - sender: ctx.sender(), - recipient, - exchange_key, - }; - - dof::add(&mut escrow.id, EscrowedObjectKey {}, escrowed); - - transfer::public_share_object(escrow); -} -``` - -#### `swap` - -This function is used to perform the swap operation. It takes four arguments: the escrow object, the key, the locked object, and the transaction context. - -```move -public fun swap( - mut escrow: Escrow, - key: Key, - locked: Locked, - ctx: &TxContext, -): T { - let escrowed = dof::remove(&mut escrow.id, EscrowedObjectKey {}); - - let Escrow { - id, - sender, - recipient, - exchange_key, - } = escrow; - - assert!(recipient == ctx.sender(), EMismatchedSenderRecipient); - assert!(exchange_key == object::id(&key), EMismatchedExchangeObject); - - // Do the actual swap - transfer::public_transfer(locked.unlock(key), sender); - id.delete(); - - escrowed -} -``` - -The `id.delete()` function call is used to delete the shared `Escrow` object. Previously, Move supported only the deletion of owned objects, but [shared-object deletion has since been enabled](https://github.com/MystenLabs/sui/pull/16008). - -#### `return_to_sender` - -This function is used to cancel the escrow and return the escrowed item to the sender. It takes two arguments: the escrow object and the transaction context. - -```move -public fun return_to_sender( - mut escrow: Escrow, - ctx: &TxContext -): T { - let escrowed = dof::remove(&mut escrow.id, EscrowedObjectKey {}); - - let Escrow { - id, - sender, - recipient: _, - exchange_key: _, - } = escrow; - - assert!(sender == ctx.sender(), EMismatchedSenderRecipient); - id.delete(); - escrowed -} -``` - -Once again, the shared `Escrow` object is deleted after the escrowed item is returned to the sender. - -### Tests - -The code includes several tests to ensure the correct functioning of the atomic swap process. These tests cover successful swaps, mismatches in sender or recipient, mismatches in the exchange object, tampering with the object, and returning the object to the sender. - -In conclusion, this code provides a robust and secure way to perform atomic swaps of objects in a decentralized system, without the need for a trusted third party. It uses shared objects and a series of checks to ensure that the swap only occurs if all conditions are met. - -## Deployment - -{@include: ../../../../snippets/initialize-sui-client-cli.mdx} - -{@include: ../../../../snippets/publish-to-devnet-with-coins.mdx} - -## Next steps - -You have written and deployed the Move package. To turn this into a complete dApp with frontend, you need to create a frontend. For the frontend to be updated, create an indexer that listens to the blockchain as escrows are made and swaps are fulfilled. - -For the next step, you [create the indexing service](./indexer-api.mdx). diff --git a/docs/content/guides/developer/app-examples/trustless-swap/frontend.mdx b/docs/content/guides/developer/app-examples/trustless-swap/frontend.mdx deleted file mode 100644 index f15de97bdd1d4..0000000000000 --- a/docs/content/guides/developer/app-examples/trustless-swap/frontend.mdx +++ /dev/null @@ -1,817 +0,0 @@ ---- -title: Trustless Swap Frontend -sidebar_label: Frontend -toc_max_heading_level: 2 ---- - -:::note Multi-Page Guide - -This is the third in a [three-part guide](../trustless-swap.mdx) on how to build a trustless atomic swap on Sui. - -::: - -In this final part of the app example, you build a frontend (UI) that allows end-users to discover trades and interact with listed escrows. - -## Prerequisites - -{@include: ../../../../snippets/app-examples-swap-source.mdx} - -Before getting started, make sure you: - -- Understand [the mechanism behind the Escrow smart contract backend](../trustless-swap.mdx). -- Check out [indexing service guide](./indexer-api.mdx) to learn how we index on-chain data and API endpoints exposed to serve data query requests. -- Install [`pnpm` through this guide](https://pnpm.io/installation) as we will use it as our package manager. -- Check out [Sui Typescript SDK](https://sdk.mystenlabs.com/typescript) for basic usage on how to interact with Sui with Typescript. -- Check out [Sui dApp Kit](https://sdk.mystenlabs.com/dapp-kit) to learn basic building blocks for developing a dApp in the Sui ecosystem with React.js. -- Check out [React Router](https://reactrouter.com/en/main) as we use it to navigate between different routes in our UI website. -- `dApp Kit` provides a set of hooks for making query and mutation calls to Sui blockchain. These hooks are thin wrappers around query and mutation hooks from `@tanstack/react-query`. Please check out [@tanstack/react-query](https://tanstack.com/query/latest/docs/framework/react/overview) to learn the basic usage for managing, caching, mutating server state. -- This project is bootstrapped through `pnpm create @mysten/dapp`. Please check out [@mysten/create-dapp](https://sdk.mystenlabs.com/dapp-kit/create-dapp) for how to scaffold a React.js Sui dApp project quickly. - -## Overview - -The UI design consists of three parts: - -- A header containing the button allowing users to connect their wallet and navigate to other pages. -- A place for users to manage their owned objects to be ready for escrow trading called `Manage Objects`. -- A place for users to discover, create, and execute trades called `Escrows`. - -:::warning - -The following code snippets are not the full source code. The snippets are meant to focus on relevant logic important to the functionality of the example and features of Sui. - -::: - -## Set up providers {#set-up-providers} - -Set up and configure several providers at the root of your React.js tree to ensure different libraries including `dApp Kit`, `@tanstack/react-query`, `react-router-dom` work as expected. - -```ts title='src/main.tsx' -import { createNetworkConfig, SuiClientProvider, WalletProvider } from '@mysten/dapp-kit'; -import { getFullnodeUrl } from '@mysten/sui/client'; -import { Theme } from '@radix-ui/themes'; -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import { RouterProvider } from 'react-router-dom'; - -import { router } from '@/routes/index.tsx'; - -const queryClient = new QueryClient(); - -const { networkConfig } = createNetworkConfig({ - localnet: { url: getFullnodeUrl('localnet') }, - devnet: { url: getFullnodeUrl('devnet') }, - testnet: { url: getFullnodeUrl('testnet') }, - mainnet: { url: getFullnodeUrl('mainnet') }, -}); - -ReactDOM.createRoot(document.getElementById('root')!).render( - - - - - - - - - - - , -); -``` - -## Connect wallet - -The dApp Kit comes with a pre-built React.js component called `ConnectButton` displaying a button to connect and disconnect a wallet. The connecting and disconnecting wallet logic is handled seamlessly so you don't need to worry about repeating yourself doing the same logic all over again. - -Place the `ConnectButton` in the header: - -```ts title='src/components/Header.tsx' -import { ConnectButton } from '@mysten/dapp-kit'; -import { Box, Button, Container, Flex, Heading } from '@radix-ui/themes'; - -export function Header() { - return ( - - - - - - ); -} -``` - -## Type definitions - -All the type definitions are in `src/types/types.ts`. - -`ApiLockedObject` and `ApiEscrowObject` represent the `Locked` and `Escrow` indexed data model the indexing and API service return. - -`EscrowListingQuery` and `LockedListingQuery` are the query parameters model to provide to the API service to fetch from the endpoints `/escrow` and `/locked` accordingly. - -```ts title='src/types/types.ts' -export type ApiLockedObject = { - id?: string; - objectId: string; - keyId: string; - creator?: string; - itemId: string; - deleted: boolean; -}; - -export type ApiEscrowObject = { - id: string; - objectId: string; - sender: string; - recipient: string; - keyId: string; - itemId: string; - swapped: boolean; - cancelled: boolean; -}; - -export type EscrowListingQuery = { - escrowId?: string; - sender?: string; - recipient?: string; - cancelled?: string; - swapped?: string; - limit?: string; -}; - -export type LockedListingQuery = { - deleted?: string; - keyId?: string; - limit?: string; -}; -``` - -## Execute transaction hook - -In the frontend, you might need to execute a transaction block in multiple places, hence it's better to extract the transaction execution logic and reuse it everywhere. Let's examine the execute transaction hook. - -```ts title='src/hooks/useTransactionExecution.ts' -import { useSignTransaction, useSuiClient } from '@mysten/dapp-kit'; -import { SuiTransactionBlockResponse } from '@mysten/sui/client'; -import { Transaction } from '@mysten/sui/transactions'; -import toast from 'react-hot-toast'; - -export function useTransactionExecution() { - const client = useSuiClient(); - const { mutateAsync: signTransaction } = useSignTransaction(); - - const executeTransaction = async ( - txb: Transaction, - ): Promise => { - try { - const signature = await signTransaction({ - transaction: txb, - }); - - const res = await client.executeTransactionBlock({ - transactionBlock: signature.bytes, - signature: signature.signature, - options: { - showEffects: true, - showObjectChanges: true, - }, - }); - - toast.success('Successfully executed transaction!'); - return res; - } catch (e: any) { - toast.error(`Failed to execute transaction: ${e.message as string}`); - } - }; - - return executeTransaction; -} -``` - -The hook logic is straightforward. A `Transaction` is the input, sign it with the current connected wallet account, execute the transaction block, return the execution result, and finally display a basic toast message to indicate whether the transaction is successful or not. - -Use the `useSuiClient()` hook from `dApp Kit` to retrieve the Sui client instance configured in the [**Set up providers**](#set-up-providers) step. The `useSignTransaction()` function is another hook from `dApp kit` that helps to sign the transaction block using the currently connected wallet. It displays the UI for users to review and sign their transactions with their selected wallet. To execute a transaction block, the `executeTransaction()` on the Sui client instance of the Sui TypeScript SDK. Use `react-hot-toast` as another dependency to toast transaction status to users. - -## Generate demo data - -:::info - -The full source code of the demo bear smart contract is available at [Trading Contracts Demo directory](https://github.com/MystenLabs/sui/tree/main/examples/trading/contracts/demo) - -::: - -You need a utility function to create a dummy object representing a real world asset so you can use it to test and demonstrate escrow users flow on the UI directly. - -```ts title='src/mutations/demo.ts' -import { useCurrentAccount } from '@mysten/dapp-kit'; -import { Transaction } from '@mysten/sui/transactions'; -import { useMutation, useQueryClient } from '@tanstack/react-query'; - -import { CONSTANTS } from '@/constants'; -import { useTransactionExecution } from '@/hooks/useTransactionExecution'; - -// SPDX-License-Identifier: Apache-2.0 -export function useGenerateDemoData() { - const account = useCurrentAccount(); - const executeTransaction = useTransactionExecution(); - const queryClient = useQueryClient(); - - return useMutation({ - mutationFn: async () => { - if (!account?.address) throw new Error('You need to connect your wallet!'); - const txb = new Transaction(); - - const bear = txb.moveCall({ - target: `${CONSTANTS.demoContract.packageId}::demo_bear::new`, - arguments: [txb.pure.string(`A happy bear`)], - }); - - txb.transferObjects([bear], txb.pure.address(account.address)); - - return executeTransaction(txb); - }, - onSuccess: () => { - queryClient.invalidateQueries({ - queryKey: ['getOwnedObjects'], - }); - }, - }); -} -``` - -As previously mentioned, the example uses `@tanstack/react-query` to query, cache, and mutate server state. Server state is data only available on remote servers, and the only way to retrieve or update this data is by interacting with these remote servers. In this case, it could be from an API or directly from Sui blockchain RPC. - -When you execute a transaction call to mutate data on the Sui blockchain, use the `useMutation()` hook. The `useMutation()` hook accepts several inputs, however, you only need two of them for this example. The first parameter, `mutationFn`, accepts the function to execute the main mutating logic, while the second parameter, `onSuccess`, is a callback that runs when the mutating logic succeeds. - -The main mutating logic is fairly straightforward, executing a Move call of a package named `demo_bear::new` to create a dummy bear object and transfer it to the connected wallet account, all within the same `Transaction`. The example reuses the `executeTransaction()` hook from the **Execute Transaction Hook** step to execute the transaction. - -Another benefit of wrapping the main mutating logic inside `useMutation()` is that you can access and manipulate the cache storing server state. The example fetches the cache from remote servers by using query call in an appropriate callback. In this case, it is the `onSuccess` callback. When the transaction succeeds, invalidate the cache data at the cache key called `getOwnedObjects`, then `@tanstack/react-query` handles the re-fetching mechanism for the invalidated data automatically. Do this by using `invalidateQueries()` on the `@tanstack/react-query` configured client instance retrieved by `useQueryClient()` hook in the **Setup Providers** step. - -Now the logic to create a dummy bear object exists. You just need to attach it into the button in the header. - -```ts title='src/components/Header.tsx' -import { useGenerateDemoData } from '@/mutations/demo'; - -export function Header() { - const { mutate: demoBearMutation, isPending } = useGenerateDemoData(); - return ( - - - - - - ); -} -``` - -## Lock/unlock owned-object mutation - -Locking and unlocking of owned objects are two crucial on-chain actions in this application and are very likely to be used all over. Hence, it's beneficial to extract their logic into separated mutating functions to enhance reusability and encapsulation. - -### Lock owned objects - -To lock the object, execute the `lock` Move function identified by `{PACKAGE_ID}::lock::lock`. The implementation is similar to what's in previous mutation functions, use `useMutation()` from `@tanstack/react-query` to wrap the main logic inside it. The lock function requires an object to be locked and its type because our smart contract `lock` function is generic and requires type parameters. After creating a `Locked` object and its `Key` object, transfer them to the connected wallet account within the same transaction block. - -```ts title='src/mutations/locked.ts' -export function useLockObjectMutation() { - const account = useCurrentAccount(); - const executeTransaction = useTransactionExecution(); - - return useMutation({ - mutationFn: async ({ object }: { object: SuiObjectData }) => { - if (!account?.address) throw new Error('You need to connect your wallet!'); - const txb = new Transaction(); - - const [locked, key] = txb.moveCall({ - target: `${CONSTANTS.escrowContract.packageId}::lock::lock`, - arguments: [txb.object(object.objectId)], - typeArguments: [object.type!], - }); - - txb.transferObjects([locked, key], txb.pure.address(account.address)); - - return executeTransaction(txb); - }, - }); -} -``` - -### Unlock owned objects - -To unlock the object, execute the `unlock` Move function identified by `{PACKAGE_ID}::lock::unlock`. The implementation is straightforward, call the `unlock` function supplying the `Locked` object, its corresponding `Key`, the struct type of the original object, and transfer the unlocked object to the current connected wallet account. Also, implement the `onSuccess` callback to invalidate the cache data at query key `locked` after one second to force `react-query` to re-fetch the data at corresponding query key automatically. - -```ts title='src/mutations/locked.ts' -export function useUnlockMutation() { - const account = useCurrentAccount(); - const executeTransaction = useTransactionExecution(); - const client = useSuiClient(); - const queryClient = useQueryClient(); - - return useMutation({ - mutationFn: async ({ - lockedId, - keyId, - suiObject, - }: { - lockedId: string; - keyId: string; - suiObject: SuiObjectData; - }) => { - if (!account?.address) throw new Error('You need to connect your wallet!'); - const key = await client.getObject({ - id: keyId, - options: { - showOwner: true, - }, - }); - - if ( - !key.data?.owner || - typeof key.data.owner === 'string' || - !('AddressOwner' in key.data.owner) || - key.data.owner.AddressOwner !== account.address - ) { - toast.error('You are not the owner of the key'); - return; - } - - const txb = new Transaction(); - - const item = txb.moveCall({ - target: `${CONSTANTS.escrowContract.packageId}::lock::unlock`, - typeArguments: [suiObject.type!], - arguments: [txb.object(lockedId), txb.object(keyId)], - }); - - txb.transferObjects([item], txb.pure.address(account.address)); - - return executeTransaction(txb); - }, - onSuccess: () => { - setTimeout(() => { - // invalidating the queries after a small latency - // because the indexer works in intervals of 1s. - // if we invalidate too early, we might not get the latest state. - queryClient.invalidateQueries({ - queryKey: [QueryKey.Locked], - }); - }, 1_000); - }, - }); -} -``` - -## Create/accept/cancel escrow mutations - -To create, accept, or cancel escrows, it's better to implement mutations for each of these actions to allow reusability and encapsulation. - -### Create escrows - -To create escrows, include a mutating function through the `useCreateEscrowMutation` hook in `src/mutations/escrow.ts`. The mutation implementation is pretty straightforward. It accepts the escrowed item to be traded and the `ApiLockedObject` from another party as parameters. Then, call the `{PACKAGE_ID}::shared::create` Move function and provide the escrowed item, the key id of the locked object to exchange, and the recipient of the escrow (locked object's owner). - -```ts title='src/mutations/escrow.ts' -export function useCreateEscrowMutation() { - const currentAccount = useCurrentAccount(); - const executeTransaction = useTransactionExecution(); - - return useMutation({ - mutationFn: async ({ object, locked }: { object: SuiObjectData; locked: ApiLockedObject }) => { - if (!currentAccount?.address) throw new Error('You need to connect your wallet!'); - - const txb = new Transaction(); - txb.moveCall({ - target: `${CONSTANTS.escrowContract.packageId}::shared::create`, - arguments: [ - txb.object(object.objectId!), - txb.pure.id(locked.keyId), - txb.pure.address(locked.creator!), - ], - typeArguments: [object.type!], - }); - - return executeTransaction(txb); - }, - }); -} -``` - -### Accept escrows - -To accept the escrow, create a mutation through the `useAcceptEscrowMutation` hook in `src/mutations/escrow.ts`. The implementation should be fairly familiar to you now. The accept function accepts the escrow `ApiEscrowObject` and the locked object `ApiLockedObject`. The `{PACKAGE_ID}::shared::swap` Move call is generic, thus it requires the type parameters of the escrowed and locked objects. Query the objects details by using `multiGetObjects` on Sui client instance. Lastly, execute the `{PACKAGE_ID}::shared::swap` Move call and transfer the returned escrowed item to the connected wallet account. When the mutation succeeds, invalidate the cache to allow automatic re-fetch of the data. - -```ts title='src/mutations/escrow.ts' -import { ApiEscrowObject, ApiLockedObject } from '@/types/types'; - -export function useAcceptEscrowMutation() { - const currentAccount = useCurrentAccount(); - const client = useSuiClient(); - const executeTransaction = useTransactionExecution(); - const queryClient = useQueryClient(); - - return useMutation({ - mutationFn: async ({ - escrow, - locked, - }: { - escrow: ApiEscrowObject; - locked: ApiLockedObject; - }) => { - if (!currentAccount?.address) throw new Error('You need to connect your wallet!'); - const txb = new Transaction(); - - const escrowObject = await client.multiGetObjects({ - ids: [escrow.itemId, locked.itemId], - options: { - showType: true, - }, - }); - - const escrowType = escrowObject.find((x) => x.data?.objectId === escrow.itemId)?.data?.type; - - const lockedType = escrowObject.find((x) => x.data?.objectId === locked.itemId)?.data?.type; - - if (!escrowType || !lockedType) { - throw new Error('Failed to fetch types.'); - } - - const item = txb.moveCall({ - target: `${CONSTANTS.escrowContract.packageId}::shared::swap`, - arguments: [ - txb.object(escrow.objectId), - txb.object(escrow.keyId), - txb.object(locked.objectId), - ], - typeArguments: [escrowType, lockedType], - }); - - txb.transferObjects([item], txb.pure.address(currentAccount.address)); - - return executeTransaction(txb); - }, - - onSuccess: () => { - setTimeout(() => { - queryClient.invalidateQueries({ queryKey: [QueryKey.Escrow] }); - }, 1_000); - }, - }); -} -``` - -### Cancel escrows - -To cancel the escrow, create a mutation through the `useCancelEscrowMutation` hook in `src/mutations/escrow.ts`. The cancel function accepts the escrow `ApiEscrowObject` and its on-chain data. The `{PACKAGE_ID}::shared::return_to_sender` Move call is generic, thus it requires the type parameters of the escrowed object. Next, execute `{PACKAGE_ID}::shared::return_to_sender` and transfer the returned escrowed object to the creator of the escrow. - -```ts ts title='src/mutations/escrow.ts' -export function useCancelEscrowMutation() { - const currentAccount = useCurrentAccount(); - const executeTransaction = useTransactionExecution(); - const queryClient = useQueryClient(); - - return useMutation({ - mutationFn: async ({ - escrow, - suiObject, - }: { - escrow: ApiEscrowObject; - suiObject: SuiObjectData; - }) => { - if (!currentAccount?.address) throw new Error('You need to connect your wallet!'); - const txb = new Transaction(); - - const item = txb.moveCall({ - target: `${CONSTANTS.escrowContract.packageId}::shared::return_to_sender`, - arguments: [txb.object(escrow.objectId)], - typeArguments: [suiObject?.type!], - }); - - txb.transferObjects([item], txb.pure.address(currentAccount?.address!)); - - return executeTransaction(txb); - }, - - onSuccess: () => { - setTimeout(() => { - queryClient.invalidateQueries({ queryKey: [QueryKey.Escrow] }); - }, 1_000); - }, - }); -} -``` - -## Locked dashboard - -The UI has a tab for users to manage their owned objects to be ready for escrow trading. The code of this tab lives in the file `src/routes/LockedDashBoard.tsx`. In this tab, there are two sub-tabs: - -- **My Locked Objects** tab to list out all of owned `Locked` objects. -- **Lock Own Objects** tab to lock owned objects. - -### My Locked Objects tab - -Let's take a look at the **My Locked Objects** tab by examining `src/components/locked/OwnedLockedList.tsx`. Focus on the logic on how to retrieve this list. - -```ts title='src/components/locked/OwnedLockedList.tsx' -import { useCurrentAccount, useSuiClientInfiniteQuery } from '@mysten/dapp-kit'; - -import { InfiniteScrollArea } from '@/components/InfiniteScrollArea'; -import { CONSTANTS } from '@/constants'; - -import { LockedObject } from './LockedObject'; - -/** - * Similar to the `ApiLockedList` but fetches the owned locked objects - * but fetches the objects from the on-chain state, instead of relying on the indexer API. - */ -export function OwnedLockedList() { - const account = useCurrentAccount(); - const { data, isLoading, fetchNextPage, hasNextPage, isFetchingNextPage } = - useSuiClientInfiniteQuery( - 'getOwnedObjects', - { - filter: { - StructType: CONSTANTS.escrowContract.lockedType, - }, - owner: account?.address!, - options: { - showContent: true, - showOwner: true, - }, - }, - { - enabled: !!account?.address, - select: (data) => data.pages.flatMap((page) => page.data), - }, - ); - return ( - <> - fetchNextPage()} - hasNextPage={hasNextPage} - loading={isFetchingNextPage || isLoading} - > - {data?.map((item) => )} - - - ); -} -``` - -Fetch the owned `Locked` objects directly from Sui blockchain using the `useSuiClientInfiniteQuery()` hook from `dApp Kit`. This hook is a thin wrapper around Sui blockchain RPC calls, reference the documentation to learn more about these [RPC hooks](https://sdk.mystenlabs.com/dapp-kit/rpc-hooks). Basically, supply the RPC endpoint you want to execute, in this case it's the [`getOwnedObjects` endpoint](https://docs.sui.io/sui-api-ref#suix_getownedobjects). Supply the connected wallet account and the `Locked` object struct type to the call. The struct type is usually identified by the format of `{PACKAGE_ID}::{{MODULE_NAME}}::{{STRUCT_TYPE}}`. The returned data is stored inside the cache at query key `getOwnedObjects`. Recall the previous section where you invalidate the data at this key after the mutation succeeds, the `useSuiClientInfiniteQuery()` hook automatically re-fetches the data, thus you don't have to worry about the out-dated data living in your frontend application. - -#### `LockedObject` and `Locked` component - -The `` (`src/components/locked/LockedObject.tsx`) component is mainly responsible for mapping an on-chain `SuiObjectData` `Locked` object to its corresponding `ApiLockedObject`, which is finally delegated to the `` component for rendering. The `` fetches the locked item object ID if the prop `itemId` is not supplied by using `dApp Kit` `useSuiClientQuery()` hook to call the `getDynamicFieldObject` RPC endpoint. Recalling that in this smart contract, the locked item is put into a dynamic object field. - -The `` (`src/components/locked/partials/Locked.tsx`) component is mainly responsible for rendering the `ApiLockedObject`. It also consists of several on-chain interactions: unlock the locked objects and create an escrow out of the locked object. - -```ts title='src/components/locked/LockedObject.tsx' -/** - * Acts as a wrapper between the `Locked` object fetched from API - * and the on-chain object state. - * - * Accepts an `object` of type `::locked::Locked`, fetches the itemID (though the DOF) - * and then renders the `Locked` component. - * - * ItemId is optional because we trust the API to return the correct itemId for each Locked. - */ -export function LockedObject({ - object, - itemId, - hideControls, -}: { - object: SuiObjectData; - itemId?: string; - hideControls?: boolean; -}) { - const owner = () => { - if (!object.owner || typeof object.owner === 'string' || !('AddressOwner' in object.owner)) - return undefined; - return object.owner.AddressOwner; - }; - - const getKeyId = (item: SuiObjectData) => { - if (!(item.content?.dataType === 'moveObject') || !('key' in item.content.fields)) return ''; - return item.content.fields.key as string; - }; - - // Get the itemID for the locked object (We've saved it as a DOF on the SC). - const suiObjectId = useSuiClientQuery( - 'getDynamicFieldObject', - { - parentId: object.objectId, - name: { - type: CONSTANTS.escrowContract.lockedObjectDFKey, - value: { - dummy_field: false, - }, - }, - }, - { - select: (data) => data.data, - enabled: !itemId, - }, - ); - - return ( - - ); -} -``` - -### Lock owned object - -You have all the logic you need to implement this UI. Use the same `useSuiClientInfiniteQuery()` hook to query all the owned objects of the connected wallet. Filter out objects that do not exist in the Object Display `display.data.image_url` as you can assume the valid NFTs conform to the Object Display and have an image in the metadata. Lastly, use the lock mutation from `useLockObjectMutation()` hook whenever the user clicks the lock button. - -```ts title='src/components/locked/LockOwnedObjects.tsx' -export function LockOwnedObjects() { - const account = useCurrentAccount(); - - const { mutate: lockObjectMutation, isPending } = useLockObjectMutation(); - - const { data, fetchNextPage, isFetchingNextPage, hasNextPage, refetch } = - useSuiClientInfiniteQuery( - 'getOwnedObjects', - { - owner: account?.address!, - options: { - showDisplay: true, - showType: true, - }, - }, - { - enabled: !!account, - select: (data) => - data.pages - .flatMap((page) => page.data) - .filter((x) => !!x.data?.display && !!x.data?.display?.data?.image_url), - }, - ); - - return ( - fetchNextPage()} - hasNextPage={hasNextPage} - loading={isFetchingNextPage} - > - {data?.map((obj) => ( - -
-

Lock the item so it can be used for escrows.

- -
-
- ))} -
- ); -} -``` - -## Escrow dashboard - -The UI has a place for users to discover, create, and execute trades. The code of this tab lives in the file `src/routes/EscrowDashboard.tsx`. In this tab, there are three sub-tabs: - -- **Requested Escrows** tab to list out all of the escrow requested for locked objects. -- **Browse Locked Objects** tab to browse locked objects to trade for. -- **My Pending Requests** tab to browse escrows you have initiated for third-party locked objects. - -### Requested escrows - -Let's take a look at the **Requested Escrows** tab by examining `src/components/escrows/EscrowList.tsx`. This time, the data is retrieved by using `useInfiniteQuery` directly from `react-query`. Fetch the data by calling the API service that you already implemented in the [Escrow Indexing and API Service Guide](./indexer-api.mdx). Call the `/escrows` endpoint to fetch all the escrows requested to you. The rationale behind using an API service to fetch the data is because the indexed data includes additional information that allows query efficiency and flexibility. You can fetch specific escrows satisfying different configured query clauses rather than limited query features of Sui blockchain RPC endpoints. - -```ts title='src/components/escrows/EscrowList.tsx' -import { constructUrlSearchParams, getNextPageParam } from '@/utils/helpers'; - -const { data, fetchNextPage, hasNextPage, isLoading, isFetchingNextPage } = useInfiniteQuery({ - initialPageParam: null, - queryKey: [QueryKey.Escrow, params, escrowId], - queryFn: async ({ pageParam }) => { - const data = await fetch( - CONSTANTS.apiEndpoint + - 'escrows' + - constructUrlSearchParams({ - ...params, - ...(pageParam ? { cursor: pageParam as string } : {}), - ...(escrowId ? { objectId: escrowId } : {}), - }), - ); - return data.json(); - }, - select: (data) => data.pages.flatMap((page) => page.data), - getNextPageParam, -}); -``` - -The `Escrow` component renders the details of an escrow by providing `ApiEscrowObject` as a rendering property. There is some data you need to fetch to gather necessary escrow information for display in the UI: - -- Query the escrowed item object directly from Sui blockchain by using `useSuiClientQuery('getObject')` as this is the only way to have its Object Display metadata. -- Fetch the `ApiLockedObject` corresponding to the escrow's key ID from the API service as this is the most efficient way to fetch the locked object in a complex query. -- Fetch the on-chain `Locked` object corresponding to the returned `ApiLockedObject` to pass it onto ``. - -```ts title='src/components/escrows/Escrow.tsx' -export function Escrow({ escrow }: { escrow: ApiEscrowObject }) { - const account = useCurrentAccount(); - const [isToggled, setIsToggled] = useState(true); - const { mutate: acceptEscrowMutation, isPending } = useAcceptEscrowMutation(); - const { mutate: cancelEscrowMutation, isPending: pendingCancellation } = - useCancelEscrowMutation(); - - const suiObject = useSuiClientQuery('getObject', { - id: escrow?.itemId, - options: { - showDisplay: true, - showType: true, - }, - }); - - const lockedData = useQuery({ - queryKey: [QueryKey.Locked, escrow.keyId], - queryFn: async () => { - const res = await fetch(`${CONSTANTS.apiEndpoint}locked?keyId=${escrow.keyId}`); - return res.json(); - }, - select: (data) => data.data[0], - enabled: !escrow.cancelled, - }); - - const { data: suiLockedObject } = useGetLockedObject({ - lockedId: lockedData.data?.objectId, - }); - - ... -} -``` - -As the last step, reuse the `accept` and `cancel` escrow mutations in corresponding buttons. - -### Browse locked objects - -The `src/components/locked/ApiLockedList.tsx` component renders all the on-chain locked objects based on the `LockedListingQuery` property. Call the API service to fetch the `ApiLockedObject` data using the provided query parameters. One caveat around the API service is that the `creator` field of the `ApiLockedObject` could be stale because the `Locked` object has the `store` ability. This means that the object can be transferred freely, hence, the ownership might not be correctly tracked by the API service. That's why you still fetch from the Sui blockchain as an additional step to define the object with latest on-chain information to ensure its data correctness in regards to ownership. - -```ts title='src/components/locked/ApiLockedList.tsx' -const { data, fetchNextPage, hasNextPage, isLoading, isFetchingNextPage } = useInfiniteQuery({ - initialPageParam: null, - queryKey: [QueryKey.Locked, params, lockedId], - queryFn: async ({ pageParam }) => { - const data = await ( - await fetch( - CONSTANTS.apiEndpoint + - 'locked' + - constructUrlSearchParams({ - deleted: 'false', - ...(pageParam ? { cursor: pageParam as string } : {}), - ...(params || {}), - }), - ) - ).json(); - - const objects = await suiClient.multiGetObjects({ - ids: data.data.map((x: ApiLockedObject) => x.objectId), - options: { - showOwner: true, - showContent: true, - }, - }); - - return { - suiObjects: objects.map((x) => x.data), - api: data, - }; - }, - select: (data) => data.pages, - getNextPageParam, - enabled: !lockedId, -}); -``` - -### My Pending Requests tab - -The **My Pending Requests** tab uses the same `` component as **Requested Escrows** tab as they're both trying to display the escrows. The only difference is that the former fetches all the escrows with current wallet as recipient, while the latter fetches all the escrows with current wallet as sender. diff --git a/docs/content/guides/developer/app-examples/trustless-swap/indexer-api.mdx b/docs/content/guides/developer/app-examples/trustless-swap/indexer-api.mdx deleted file mode 100644 index 80a276895c40e..0000000000000 --- a/docs/content/guides/developer/app-examples/trustless-swap/indexer-api.mdx +++ /dev/null @@ -1,632 +0,0 @@ ---- -title: Escrow Indexing and API Service -sidebar_label: Indexing and API Service ---- - -:::note Multi-Page Guide - -This is the second in a [three-part guide](../trustless-swap.mdx) on how to build a trustless atomic swap on Sui. - -::: - -In most cases where you want to enhance a dApp and ensure it is production ready, you need to have an indexing service (indexer) listening to the blockchain for on-chain events, shaping the data to fit your application needs, and storing the transformed data into the local off-chain database so you can query them in the most efficient way. Joining hands with an indexer, you expose an API allowing the frontend to query the indexed data and update the screen as escrows are made and swaps are fulfilled. - -Architecturally, the service does the heavy lifting of indexing the data, while the other service exposes the data through an API convention for external consumption. - -## Prerequisites - -{@include: ../../../../snippets/app-examples-swap-source.mdx} - -Before getting started, make sure you: - -- Understand [the mechanism behind the Trading backend](../trustless-swap.mdx). -- Install [`pnpm` through this guide](https://pnpm.io/installation) as this example uses it as the package manager. -- Check out the [indexer's README](https://github.com/MystenLabs/sui/tree/main/examples/trading/api) to setup the development environment. -- Check out [Prisma](https://www.prisma.io/) to get an overall sense of the technology that facilitates all the database interactions. -- Check out [Express](https://expressjs.com/) to learn how to set up a web server application in Node.js. This server bootstraps your API service. -- Check out [Sui TypeScript SDK](https://sdk.mystenlabs.com/typescript) for basic usage on how to interact with Sui with TypeScript. - -## Indexing service - -The indexing service fetches `Escrow` objects by `sender` and `recipient`. - -### Data model - -In most cases, when you're working with a database directly from a backend service, you might want to use some sort of database libraries and toolings to abstract away database creation and management complexity. In this case, the example uses [Prisma](https://www.prisma.io/) to manage all the database interactions, such as defining data models and database migrations. - -First of all, design what data to index: - -```ts title='prisma/schema.prisma' -/// Our `Locked` objects list -model Locked { - // Keeping an ID to use as a pagination cursor - // There's an issue with BigInt for sqlite, so use a plain ID. - id Int @id @default(autoincrement()) - objectId String @unique - keyId String? - creator String? - itemId String? - deleted Boolean @default(false) - - @@index([creator]) - @@index([deleted]) -} - -/// Swap objects list -model Escrow { - // Keeping an ID to use as a pagination cursor - // There's an issue with BigInt for sqlite, so use a plain ID. - id Int @id @default(autoincrement()) - objectId String @unique - sender String? - recipient String? - keyId String? - itemId String? - swapped Boolean @default(false) - cancelled Boolean @default(false) - - @@index([recipient]) - @@index([sender]) -} -``` - -These data models represent the `Locked` and `Escrow` object. Compared to their on-chain version, which contains much less attributes due to initial smart contract design, they have additional fields providing extra information that helps to facilitate any queries at a later stage. - -```ts title='prisma/schema.prisma' -/// Saves the latest cursor for a given key. -model Cursor { - id String @id - eventSeq String - txDigest String -} -``` - -Most indexing services need to implement some sort of checkpoint mechanism to ensure it picks up the progress where it left off even after it returns from a crash. `Cursor` is the checkpoint that you store in your persistent database to ensure the data remains and is unaffected by incidents. - -Next, let's explore the logic keeping the service listening to blockchain signals and reacting accordingly. - -### `event-indexer.ts` - -Let's first examine `event-indexer.ts`: - -#### Imports - -```ts title='event-indexer.ts' -import { EventId, SuiClient, SuiEvent, SuiEventFilter } from '@mysten/sui/client'; - -import { CONFIG } from '../config'; -import { prisma } from '../db'; -import { getClient } from '../sui-utils'; -import { handleEscrowObjects } from './escrow-handler'; -import { handleLockObjects } from './locked-handler'; -``` - -These lines import the necessary modules and dependencies for the script. The `EventId`, `SuiClient`, `SuiEvent`, and `SuiEventFilter` types are imported from the `@mysten/sui/client` package. The `CONFIG` constant is imported from the local `config` module, `prisma` from the local `db` module, `getClient` from the local `sui-utils` module, and the `handleEscrowObjects` and `handleLockObjects` functions from the local `escrow-handler` and `locked-handler` modules respectively. - -#### Type definitions - -```ts title='event-indexer.ts' -type SuiEventsCursor = EventId | null | undefined; - -type EventExecutionResult = { - cursor: SuiEventsCursor; - hasNextPage: boolean; -}; - -type EventTracker = { - // The module that defines the type, with format `package::module` - type: string; - filter: SuiEventFilter; - callback: (events: SuiEvent[], type: string) => any; -}; -``` - -Three custom types are defined here: `SuiEventsCursor`, `EventExecutionResult`, and `EventTracker`. `SuiEventsCursor` is a type alias for `EventId | null | undefined`, representing the possible states of a cursor pointing to events on the Sui network. `EventExecutionResult` represents the result of executing an event job, including the updated cursor and a flag indicating whether there are more pages of events to process. `EventTracker` represents an event tracker, which includes the type of the event, a filter for the event, and a callback function to handle the event. - -#### Constants - -```ts title='event-indexer.ts' -const EVENTS_TO_TRACK: EventTracker[] = [ - { - type: `${CONFIG.SWAP_CONTRACT.packageId}::lock`, - filter: { - MoveEventModule: { - module: 'lock', - package: CONFIG.SWAP_CONTRACT.packageId, - }, - }, - callback: handleLockObjects, - }, - { - type: `${CONFIG.SWAP_CONTRACT.packageId}::shared`, - filter: { - MoveEventModule: { - module: 'shared', - package: CONFIG.SWAP_CONTRACT.packageId, - }, - }, - callback: handleEscrowObjects, - }, -]; -``` - -The `EVENTS_TO_TRACK` constant is an array of `EventTracker` objects. Each `EventTracker` specifies a type of event to track, a filter for the event, and a callback function to handle the event. In this case, the script tracks two types of events: lock events and shared events. The filter for each event specifies the module and package ID for the event. The callback function for each event is either `handleLockObjects` or `handleEscrowObjects`, depending on the type of event. - -#### Functions - -```ts title='event-indexer.ts' -const executeEventJob = async ( - client: SuiClient, - tracker: EventTracker, - cursor: SuiEventsCursor, -): Promise => { - try { - // Get the events from the chain. - // This implementation goes from start to finish. - // This also allows filling in a database from scratch! - const { data, hasNextPage, nextCursor } = await client.queryEvents({ - query: tracker.filter, - cursor, - order: 'ascending', - }); - - // Handle the data transformations defined for each event. - await tracker.callback(data, tracker.type); - - // Only update the cursor if extra data is fetched (which means there was a change). - if (nextCursor && data.length > 0) { - await saveLatestCursor(tracker, nextCursor); - - return { - cursor: nextCursor, - hasNextPage, - }; - } - } catch (e) { - console.error(e); - } - // By default, return the same cursor as passed in. - return { - cursor, - hasNextPage: false, - }; -}; -``` - -This function executes an event job. It takes a `SuiClient`, an `EventTracker`, and a `SuiEventsCursor` as arguments, and returns a promise that resolves to an `EventExecutionResult`. The function tries to get the events from the chain according to the filter defined in the `EventTracker`. If successful, it handles the data transformations defined for each event and updates the cursor if there were changes. If an error occurs during execution, it logs the error and returns the original cursor without updating it. - -```ts title='event-indexer.ts' -const runEventJob = async (client: SuiClient, tracker: EventTracker, cursor: SuiEventsCursor) => { - const result = await executeEventJob(client, tracker, cursor); - - // Trigger a timeout. Depending on the result, we either wait 0ms or the polling interval. - setTimeout( - () => { - runEventJob(client, tracker, result.cursor); - }, - result.hasNextPage ? 0 : CONFIG.POLLING_INTERVAL_MS, - ); -}; -``` - -This function runs an event job. It takes a `SuiClient`, an `EventTracker`, and a `SuiEventsCursor` as arguments. It calls `executeEventJob` and schedules another call to `runEventJob` based on the result of the execution. If there are more pages of events to process, it waits for the polling interval defined in `CONFIG.POLLING_INTERVAL_MS` before making the next call. Otherwise, it makes the call immediately. - -```ts title='event-indexer.ts' -const getLatestCursor = async (tracker: EventTracker) => { - const cursor = await prisma.cursor.findUnique({ - where: { - id: tracker.type, - }, - }); - - return cursor || undefined; -}; -``` - -This function gets the latest cursor for an event tracker. It takes an `EventTracker` as an argument and returns a promise that resolves to the cursor. If the cursor is undefined, it retrieves the cursor from the database. - -```ts title='event-indexer.ts' -const saveLatestCursor = async (tracker: EventTracker, cursor: EventId) => { - const data = { - eventSeq: cursor.eventSeq, - txDigest: cursor.txDigest, - }; - - return prisma.cursor.upsert({ - where: { - id: tracker.type, - }, - update: data, - create: { id: tracker.type, ...data }, - }); -}; -``` - -This function saves the latest cursor for an event tracker to the database. It takes an `EventTracker` and a `SuiEventsCursor` as arguments and returns a promise that resolves to the saved cursor. If the cursor already exists in the database, it updates the existing entry. Otherwise, it creates a new entry. - -```ts title='event-indexer.ts' -export const setupListeners = async () => { - for (const event of EVENTS_TO_TRACK) { - runEventJob(getClient(CONFIG.NETWORK), event, await getLatestCursor(event)); - } -}; -``` - -This function sets up all the listeners for the events to track. It iterates over the `EVENTS_TO_TRACK` array and calls `runEventJob` for each event tracker, passing the `SuiClient`, the event tracker, and the latest cursor for the event tracker as arguments. - -Now let’s take a look at `escrow-handler.ts`: - -### `escrow-handler.ts` - -#### Imports - -```ts title='escrow-handler.ts' -import { SuiEvent } from '@mysten/sui/client'; -import { Prisma } from '@prisma/client'; - -import { prisma } from '../db'; -``` - -These lines import the necessary modules and dependencies for the script. The `SuiEvent` type is imported from the `@mysten/sui/client` package. The `Prisma` namespace is imported from the `@prisma/client package`. The `prisma` instance is imported from the local `db` module. - -#### Type definitions - -```ts title='escrow-handler.ts' -type EscrowEvent = EscrowCreated | EscrowCancelled | EscrowSwapped; - -type EscrowCreated = { - sender: string; - recipient: string; - escrow_id: string; - key_id: string; - item_id: string; -}; - -type EscrowSwapped = { - escrow_id: string; -}; - -type EscrowCancelled = { - escrow_id: string; -}; -``` - -Four custom types are defined here: `EscrowEvent`, `EscrowCreated`, `EscrowSwapped`, and `EscrowCancelled`. `EscrowEvent` is a union type that can be any of `EscrowCreated`, `EscrowCancelled`, or `EscrowSwapped`. `EscrowCreated` represents the data associated with an escrow creation event. `EscrowSwapped` represents the data associated with an escrow swap event. `EscrowCancelled` represents the data associated with an escrow cancellation event. - -#### Functions - -```ts title='escrow-handler.ts' -export const handleEscrowObjects = async (events: SuiEvent[], type: string) => { - const updates: Record = {}; - - for (const event of events) { - if (!event.type.startsWith(type)) throw new Error('Invalid event module origin'); - const data = event.parsedJson as EscrowEvent; - - if (!Object.hasOwn(updates, data.escrow_id)) { - updates[data.escrow_id] = { - objectId: data.escrow_id, - }; - } - - // Escrow cancellation case - if (event.type.endsWith('::EscrowCancelled')) { - const data = event.parsedJson as EscrowCancelled; - updates[data.escrow_id].cancelled = true; - continue; - } - - // Escrow swap case - if (event.type.endsWith('::EscrowSwapped')) { - const data = event.parsedJson as EscrowSwapped; - updates[data.escrow_id].swapped = true; - continue; - } - - const creationData = event.parsedJson as EscrowCreated; - - // Handle creation event - updates[data.escrow_id].sender = creationData.sender; - updates[data.escrow_id].recipient = creationData.recipient; - updates[data.escrow_id].keyId = creationData.key_id; - updates[data.escrow_id].itemId = creationData.item_id; - } - - // As part of the demo and to avoid having external dependencies, we use SQLite as our database. - // Prisma + SQLite does not support bulk insertion & conflict handling, so we have to insert these 1 by 1 - // (resulting in multiple round-trips to the database). - // Always use a single `bulkInsert` query with proper `onConflict` handling in production databases (e.g Postgres) - const promises = Object.values(updates).map((update) => - prisma.escrow.upsert({ - where: { - objectId: update.objectId, - }, - create: update, - update, - }), - ); - await Promise.all(promises); -}; -``` - -This function handles all events emitted by the `escrow` module. It takes an array of `SuiEvent` objects and a string representing the type of the events as arguments. The function processes each event and updates the corresponding escrow object in the database accordingly. If an event indicates that an escrow was canceled or swapped, the function marks the corresponding escrow object as canceled or swapped. If an event indicates that an escrow was created, the function creates a new escrow object with the details from the event. - -### `locked-handler.ts` - -#### Imports - -```ts title='locked-handler.ts' -import { SuiEvent } from '@mysten/sui/client'; -import { Prisma } from '@prisma/client'; - -import { prisma } from '../db'; -``` - -These lines import the necessary modules and dependencies for the script. The `SuiEvent` type is imported from the `@mysten/sui/client` package. The `Prisma` namespace is imported from the `@prisma/client package`. The `prisma` instance is imported from the local `db` module. - -#### Type definitions - -```ts title='locked-handler.ts' -type LockEvent = LockCreated | LockDestroyed; - -type LockCreated = { - creator: string; - lock_id: string; - key_id: string; - item_id: string; -}; - -type LockDestroyed = { - lock_id: string; -}; -``` - -Three custom types are defined here: `LockEvent`, `LockCreated`, and `LockDestroyed`. `LockEvent` is a union type that can be either `LockCreated` or `LockDestroyed`. `LockCreated` represents the data associated with a lock creation event. `LockDestroyed` represents the data associated with a lock destruction event. - -#### Functions - -```ts title='locked-handler.ts' -export const handleLockObjects = async (events: SuiEvent[], type: string) => { - const updates: Record = {}; - - for (const event of events) { - if (!event.type.startsWith(type)) throw new Error('Invalid event module origin'); - const data = event.parsedJson as LockEvent; - const isDeletionEvent = !('key_id' in data); - - if (!Object.hasOwn(updates, data.lock_id)) { - updates[data.lock_id] = { - objectId: data.lock_id, - }; - } - - // Handle deletion - if (isDeletionEvent) { - updates[data.lock_id].deleted = true; - continue; - } - - // Handle creation event - updates[data.lock_id].keyId = data.key_id; - updates[data.lock_id].creator = data.creator; - updates[data.lock_id].itemId = data.item_id; - } - - // As part of the demo and to avoid having external dependencies, we use SQLite as our database. - // Prisma + SQLite does not support bulk insertion & conflict handling, so we have to insert these 1 by 1 - // (resulting in multiple round-trips to the database). - // Always use a single `bulkInsert` query with proper `onConflict` handling in production databases (e.g Postgres) - const promises = Object.values(updates).map((update) => - prisma.locked.upsert({ - where: { - objectId: update.objectId, - }, - create: { - ...update, - }, - update, - }), - ); - await Promise.all(promises); -}; -``` - -This function handles all events emitted by the `lock` module. It takes an array of `SuiEvent` objects and a string representing the type of the events as arguments. The function processes each event and updates the corresponding locked object in the database accordingly. If an event indicates that a lock was destroyed, the function marks the corresponding locked object as deleted. If an event indicates that a lock was created, the function creates a new locked object with the details from the event. - -## API service - -As we mentioned earlier, we should expose the indexed data for external consumption through an API service. Particularly, the example uses [Express](https://expressjs.com/) to build a Node.js HTTP API. - -### API design - -#### Query parameters - -You want your API to accept the query string in the URL as the parameters for database `WHERE` query. Hence, you want a utility that can extract and parse the URL query string into valid query parameters for Prisma. With the `parseWhereStatement()` function, the callers filter the set of keys from the URL query string and transforms those corresponding key-value pairs into the correct format for Prisma. - -```ts title='utils/api-queries.ts' -export enum WhereParamTypes { - STRING, - NUMBER, - BOOLEAN, -} - -export type WhereParam = { - key: string; - type: WhereParamTypes; -}; - -/** Parses a where statement based on the query params. */ -export const parseWhereStatement = (query: Record, acceptedParams: WhereParam[]) => { - const params: Record = {}; - for (const key of Object.keys(query)) { - const whereParam = acceptedParams.find((x) => x.key === key); - if (!whereParam) continue; - - const value = query[key]; - if (whereParam.type === WhereParamTypes.STRING) { - params[key] = value; - } - if (whereParam.type === WhereParamTypes.NUMBER) { - const number = Number(value); - if (isNaN(number)) throw new Error(`Invalid number for ${key}`); - - params[key] = number; - } - - // Handle boolean expected values. - if (whereParam.type === WhereParamTypes.BOOLEAN) { - let boolValue; - if (value === 'true') boolValue = true; - else if (value === 'false') boolValue = false; - else throw new Error(`Invalid boolean for ${key}`); - - params[key] = boolValue; - } - } - return params; -}; -``` - -#### Query pagination - -Pagination is another crucial part to ensure your API returns sufficient and/or ordered chunk of information instead of all the data that might be the vector for a DDOS attack. Similar to **WHERE parameters**, define a set of keys in the URL query string to be accepted as valid pagination parameters. The `parsePaginationForQuery()` utility function helps to achieve this by filtering the pre-determined keys `sort`, `limit`, `cursor` and parsing corresponding key-value pairs into `ApiPagination` that Prisma can consume. - -In this example, the `id` field of the model in the database as the cursor that allows clients to continue subsequent queries with the next page. - -```ts title='utils/api-queries.ts' -export type ApiPagination = { - take?: number; - orderBy: { - id: 'asc' | 'desc'; - }; - cursor?: { - id: number; - }; - skip?: number; -}; - -/** - * A helper to prepare pagination based on `req.query`. - * Only primary key cursor + ordering for this example. - */ -export const parsePaginationForQuery = (body: Record) => { - const pagination: ApiPagination = { - orderBy: { - id: Object.hasOwn(body, 'sort') && ['asc', 'desc'].includes(body.sort) ? body.sort : 'desc', - }, - }; - - // Prepare pagination limit (how many items to return) - if (Object.hasOwn(body, 'limit')) { - const requestLimit = Number(body.limit); - - if (isNaN(requestLimit)) throw new Error('Invalid limit value'); - - pagination.take = requestLimit > CONFIG.DEFAULT_LIMIT ? CONFIG.DEFAULT_LIMIT : requestLimit; - } else { - pagination.take = CONFIG.DEFAULT_LIMIT; - } - - // Prepare cursor pagination (which page to return) - if (Object.hasOwn(body, 'cursor')) { - const cursor = Number(body.cursor); - if (isNaN(cursor)) throw new Error('Invalid cursor'); - pagination.skip = 1; - pagination.cursor = { - id: cursor, - }; - } - - return pagination; -}; -``` - -### API endpoints - -All the endpoints are defined in `server.ts`, particularly, there are two endpoints: - -- `/locked` to query `Locked` objects. -- `/escrows` to query `Escrow` objects. - -The implementation for both endpoints is pretty straightforward. You define a list of valid query keys, such as `deleted`, `creator`, `keyId`, and `objectId` for `Locked` data and `cancelled`, `swapped`, `recipient`, and `sender` for `Escrow` data. Pass the URL query string into the pre-defined utilities to output the correct parameters that Prisma can use. - -```ts title='server.ts' -import { prisma } from './db'; -import { - formatPaginatedResponse, - parsePaginationForQuery, - parseWhereStatement, - WhereParam, - WhereParamTypes, -} from './utils/api-queries'; - -app.get('/locked', async (req, res) => { - const acceptedQueries: WhereParam[] = [ - { - key: 'deleted', - type: WhereParamTypes.BOOLEAN, - }, - { - key: 'creator', - type: WhereParamTypes.STRING, - }, - { - key: 'keyId', - type: WhereParamTypes.STRING, - }, - { - key: 'objectId', - type: WhereParamTypes.STRING, - }, - ]; - - try { - const locked = await prisma.locked.findMany({ - where: parseWhereStatement(req.query, acceptedQueries)!, - ...parsePaginationForQuery(req.query), - }); - - return res.send(formatPaginatedResponse(locked)); - } catch (e) { - console.error(e); - return res.status(400).send(e); - } -}); - -app.get('/escrows', async (req, res) => { - const acceptedQueries: WhereParam[] = [ - { - key: 'cancelled', - type: WhereParamTypes.BOOLEAN, - }, - { - key: 'swapped', - type: WhereParamTypes.BOOLEAN, - }, - { - key: 'recipient', - type: WhereParamTypes.STRING, - }, - { - key: 'sender', - type: WhereParamTypes.STRING, - }, - ]; - - try { - const escrows = await prisma.escrow.findMany({ - where: parseWhereStatement(req.query, acceptedQueries)!, - ...parsePaginationForQuery(req.query), - }); - - return res.send(formatPaginatedResponse(escrows)); - } catch (e) { - console.error(e); - return res.status(400).send(e); - } -}); -``` - -## Next steps - -With the code successfully deployed on Testnet, you can now [create a frontend](./frontend.mdx) to display the trading data and to allow users to interact with the Move modules. diff --git a/docs/content/guides/developer/coin/in-game-token.mdx b/docs/content/guides/developer/coin/in-game-token.mdx index 800fd0f8cbe34..d7242f7330fa5 100644 --- a/docs/content/guides/developer/coin/in-game-token.mdx +++ b/docs/content/guides/developer/coin/in-game-token.mdx @@ -32,7 +32,7 @@ Use the following toggle to control the display of the complete module.
-Toggle complete module code +`examples::gem` module in `gems.move` {@inject: examples/move/token/sources/gems.move#module=examples::gem noComments} @@ -45,7 +45,7 @@ Toggle display of the complete source for this example, including comments, or u
-Toggle complete source code +`gems.move` {@inject: examples/move/token/sources/gems.move} diff --git a/docs/content/guides/developer/coin/loyalty.mdx b/docs/content/guides/developer/coin/loyalty.mdx index dbd553a3d2b46..6bf48ef1342c6 100644 --- a/docs/content/guides/developer/coin/loyalty.mdx +++ b/docs/content/guides/developer/coin/loyalty.mdx @@ -34,7 +34,7 @@ Toggle display of the complete source for this example, including comments, or u
-Toggle complete source code +`loyalty.move` {@inject: examples/move/token/sources/loyalty.move} diff --git a/docs/content/guides/developer/first-app/build-test.mdx b/docs/content/guides/developer/first-app/build-test.mdx index e90cdeb109780..c14b79057a8d5 100644 --- a/docs/content/guides/developer/first-app/build-test.mdx +++ b/docs/content/guides/developer/first-app/build-test.mdx @@ -205,7 +205,7 @@ You can refer to the source code for the package (with all the tests and functio
-Toggle complete source code +`example.move` {@inject: examples/move/first_package/sources/example.move} diff --git a/docs/content/guides/developer/nft.mdx b/docs/content/guides/developer/nft.mdx index adebeee1cbe81..414909353d0e6 100644 --- a/docs/content/guides/developer/nft.mdx +++ b/docs/content/guides/developer/nft.mdx @@ -27,7 +27,7 @@ The module includes functions to return NFT metadata, too. Referencing the hypot
-Toggle complete source code +`testnet_nft.move` {@inject: examples/move/nft/sources/testnet_nft.move} diff --git a/docs/content/guides/developer/nft/asset-tokenization.mdx b/docs/content/guides/developer/nft/asset-tokenization.mdx index 9621edb3039ff..4c16de2ef3da3 100644 --- a/docs/content/guides/developer/nft/asset-tokenization.mdx +++ b/docs/content/guides/developer/nft/asset-tokenization.mdx @@ -808,7 +808,7 @@ xxd -c 0 -p build/template/bytecode_modules/template.mv | head -n 1
- Toggle response + Console response The response you should receive looks similar to the following: diff --git a/docs/content/guides/developer/sui-101/shared-owned.mdx b/docs/content/guides/developer/sui-101/shared-owned.mdx index 80459470f35f0..779fd6e96ec53 100644 --- a/docs/content/guides/developer/sui-101/shared-owned.mdx +++ b/docs/content/guides/developer/sui-101/shared-owned.mdx @@ -40,7 +40,7 @@ The important property that this interface provides is that locked values cannot
-Toggle code sample +`owned.move` {@inject: examples/trading/contracts/escrow/sources/owned.move}
@@ -127,7 +127,7 @@ The `swap` function checks that senders and recipients match and that each party
-Toggle code sample +`shared.move` {@inject: examples/trading/contracts/escrow/sources/shared.move}
diff --git a/docs/content/references/contribute/mdx-components.mdx b/docs/content/references/contribute/mdx-components.mdx index 25a867999d5f1..e8ab46267a832 100644 --- a/docs/content/references/contribute/mdx-components.mdx +++ b/docs/content/references/contribute/mdx-components.mdx @@ -3,10 +3,59 @@ title: MDX Components draft: true --- -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; +Sui Docs uses the MDX format for its network documentation, which allows [JSX in markdown content](https://mdxjs.com/). Sui uses features provided by Docusaurus, plugins from its community, and custom plugins in an effort to improve reader experience. None of these features are required in your markdown contributions to the Sui documentation, but the Sui community might include them if it improves experience. -Sui Docs uses the MDX format for its network documentation, which allows [JSX in markdown content](https://mdxjs.com/). Sui uses features provided by Docusaurus, plugins from its community, and custom plugins in an effort to improve reader experience. None of these features are required in your markdown contributions to the Sui documentation, but the Sui community might include them if it improves experience. +## Custom frontmatter + +The frontmatter at the top of MDX pages provides context for the current topic. The only frontmatter entry required at the time of riting is `title`. In addition to the standard frontmatter entries available, the following custom items are useful for certain topic types. + +### beta + +Including the `beta` entry applies a box to the top of the topic that informa the reader of the beta status of the feature or service described. Possible values include `true` for a standard box, or a list of environments the feature or service is available in (`devnet`, `testnet`, `mainnet`) to include that information in the note. + +**Example:** + +``` +--- +title: Page title +description: A page of info describing a beta feature. +beta: devnet, testnet +--- +``` + +### effort + +The `effort` option is used for end-to-end guides. Including this entry places a box at the top of the guide to let the reader know what kind of effort is required to complete the guide. Available values are `small`, `medium`, `large`. + +**Example:** +``` +--- +title: A Guides +description: A guide on how to do this thing in Sui. +effort: medium +--- +``` + +## Custom admonition boxes + +Beyond the default admonition boxes that Docusaurus offers (info, note, warning, danger), the following are also available. + +### Checkpoint + +The `:::checkpoint` admonition box is used in end-to-end guides to provide the status of the project that the current guide is walking through. The idea is that if their own work fails the checkpoint, then they know where things went wrong rather than getting to the end of the guide with a broken example. + +**Example:** + +``` +:::checkpoint + +Run your app and make sure you can: + +- Create an NFT. +- Initiate a trade. + +::: +``` ## Tabs @@ -153,10 +202,15 @@ This approach is a work in progress and there are certain formatting situations ::: -You can include specific sections of Move code using the following constructs appended to the end of the code directory. You can uses a comma delimited list for functions and structs to include each in the same codeblock: +You can include specific sections of Move code using the following constructs appended to the end of the code directory. You can uses a comma delimited list for functions, structs, and variables to include each in the same codeblock: - Module: #module=MODULE::NAME - Function: #fun=FUNCTION_NAME,ANOTHER_FUNCTION - Struct: #struct=STRUCT_NAME,ANOTHER_STRUCT +- Variables: #var=variableName, anotherVariable +- Move import: #use=LIBRARY::NAME +- React component: #component=ComponentName +- Type declaration: #type=TypeName +- Enum declaration: #enum=EnumName For example, `{@inject: examples/move/example.source#fun=buy_sword}` @@ -280,8 +334,10 @@ return book; You can include a space-limited list of options after the @inject call. The following options are supported: - `noComments`: Remove comments from Move code. - `noTests`: Remove tests from captured section of code. +- `noTitle`: Don't place a hyperlinked title at the top of the code block. +- `singleSpace`: If the code source has spurious whitespace, use this option to display code without extra spaces between lines. Useful when the code uses extra blank lines for readability. -For example, `{@inject: examples/move/example.source#module=example::example noComments noTests}` +For example, `{@inject: examples/move/example.source#module=example::example noComments noTests noTitle singleSpace}` ## Mermaid graphs diff --git a/docs/content/sidebars/guides.js b/docs/content/sidebars/guides.js index 2225e8b67f98e..3c640c372a9ba 100644 --- a/docs/content/sidebars/guides.js +++ b/docs/content/sidebars/guides.js @@ -153,19 +153,7 @@ const guides = [ }, items: [ 'guides/developer/app-examples/e2e-counter', - { - type: 'category', - label: 'Trustless Swap', - link: { - type: 'doc', - id: 'guides/developer/app-examples/trustless-swap', - }, - items: [ - 'guides/developer/app-examples/trustless-swap/backend', - 'guides/developer/app-examples/trustless-swap/indexer-api', - 'guides/developer/app-examples/trustless-swap/frontend', - ], - }, + 'guides/developer/app-examples/trustless-swap', 'guides/developer/app-examples/coin-flip', 'guides/developer/app-examples/reviews-rating', 'guides/developer/app-examples/blackjack', diff --git a/docs/content/standards/deepbookv3-sdk.mdx b/docs/content/standards/deepbookv3-sdk.mdx index 93fcb5b1f1a3b..65090fbffa2e5 100644 --- a/docs/content/standards/deepbookv3-sdk.mdx +++ b/docs/content/standards/deepbookv3-sdk.mdx @@ -14,7 +14,7 @@ The DeepBookV3 SDK includes a constants file (`/utils/constants.ts`) that mainta
-Toggle constants.ts code +`constants.ts` {@inject: sdk/deepbook/src/utils/constants.ts}
diff --git a/docs/site/docusaurus.config.js b/docs/site/docusaurus.config.js index 5d34bcbe6ef36..f9b79cb1ac8f9 100644 --- a/docs/site/docusaurus.config.js +++ b/docs/site/docusaurus.config.js @@ -6,7 +6,8 @@ import path from "path"; import math from "remark-math"; import katex from "rehype-katex"; -const betatag = require("./src/plugins/betatag"); +const effortRemarkPlugin = require("./src/plugins/effort"); +const betaRemarkPlugin = require("./src/plugins/betatag"); require("dotenv").config(); @@ -51,10 +52,11 @@ const config = { }, plugins: [ // .... + // path.resolve(__dirname, `./src/plugins/examples`), [ "posthog-docusaurus", { - apiKey: process.env.POSTHOG_API_KEY || 'dev', // required + apiKey: process.env.POSTHOG_API_KEY || "dev", // required appUrl: "https://us.i.posthog.com", // optional, defaults to "https://us.i.posthog.com" enableInDevelopment: false, // optional }, @@ -63,8 +65,7 @@ const config = { [ "@graphql-markdown/docusaurus", { - schema: - "../../crates/sui-graphql-rpc/schema.graphql", + schema: "../../crates/sui-graphql-rpc/schema.graphql", rootPath: "../content", // docs will be generated under rootPath/baseURL baseURL: "references/sui-api/sui-graphql/reference", loaders: { @@ -116,13 +117,18 @@ const config = { "current", "1.0.0", ],*/ + admonitions: { + keywords: ["checkpoint"], + extendDefaults: true, + }, remarkPlugins: [ math, [ require("@docusaurus/remark-plugin-npm2yarn"), { sync: true, converters: ["yarn", "pnpm"] }, ], - betatag, + effortRemarkPlugin, + betaRemarkPlugin, ], rehypePlugins: [katex], }, @@ -240,7 +246,7 @@ const config = { prism: { theme: themes.github, darkTheme: themes.nightOwl, - additionalLanguages: ["rust", "typescript", "toml"], + additionalLanguages: ["rust", "typescript", "toml", "json"], }, }), }; diff --git a/docs/site/src/components/EffortBox/index.tsx b/docs/site/src/components/EffortBox/index.tsx new file mode 100644 index 0000000000000..a1de99f888bb0 --- /dev/null +++ b/docs/site/src/components/EffortBox/index.tsx @@ -0,0 +1,45 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +// This component is used as part of the effort plugin. +// It appears at the top of any guide with an `effort` +// rating (small, medium, large) in its frontmatter. + +import React from "react"; +import Admonition from "@theme/Admonition"; + +export default function EffortBox(props) { + if (!props.effort) { + return; + } + + function timeAndEffort(effort: string): [string, string] { + if (effort[0] === "s") { + return ["30-45 minutes", "basic"]; + } else if (effort[0] === "m") { + return ["1-1.5 hours", "involved"]; + } else { + return ["2 hours or more", "advanced"]; + } + } + + const [time, effort] = timeAndEffort(props.effort); + return ( + +

+ This guide is rated as {effort}. +

+

+ You can expect {effort} guides to take{" "} + {time} of dedicated time. The length + of time necessary to fully understand some of the concepts raised in + this guide might increase this estimate. +

+
+ ); +} diff --git a/docs/site/src/css/custom.css b/docs/site/src/css/custom.css index c0495d0e3399b..c75f8aa59dab7 100644 --- a/docs/site/src/css/custom.css +++ b/docs/site/src/css/custom.css @@ -7,6 +7,23 @@ @tailwind components; @tailwind utilities; + @layer utilities { + .bg-checkerboard { + background-image: linear-gradient(45deg, var(--sui-black) 25%, transparent 25%, transparent 75%, var(--sui-black) 75%, var(--sui-black)), + linear-gradient(45deg, var(--sui-black) 25%, transparent 25%, transparent 75%, var(--sui-black) 75%, var(--sui-black)); + background-size: 20px 20px; + background-position: 0 0, 10px 10px; + border-right: 1px solid var(--sui-blue); + } + .bg-checkerboard-dark { + background-image: linear-gradient(45deg, rgb(var(--sui-blue-dark)) 25%, transparent 25%, transparent 75%, rgb(var(--sui-blue-dark)) 75%, rgb(var(--sui-blue-dark))), + linear-gradient(45deg, rgb(var(--sui-blue-dark)) 25%, transparent 25%, transparent 75%, rgb(var(--sui-blue-dark)) 75%, rgb(var(--sui-blue-dark))); + background-size: 20px 20px; + background-position: 0 0, 10px 10px; + border-right: 1px solid rgb(var(--sui-blue-dark)); + } +} + /* You can override the default Infima variables here. */ :root { --ifm-color-primary: #4ca2ff; @@ -354,7 +371,21 @@ h4 { color: var(--sui-white); text-decoration: none; } +/* +details { + @apply !bg-sui-gray-45 !border-sui-gray-65 relative before:content-["Click\20to\20toggle"] before:absolute before:-top-3 before:-left-1 before:text-xs before:bg-white before:px-2 before:py-0.5 before:rounded before:border before:border-sui-gray-65 before:border-solid before:opacity-0 hover:before:opacity-100 before:duration-300 before:transition-opacity; +} +[data-theme='dark'] details { + @apply !bg-sui-gray-90 !border-sui-gray-65; +} +*/ +summary::before { + @apply !border-l-sui-gray-65; +} +details > div > div { + @apply !border-t-sui-gray-65; +} @media (max-width: 1050px) { .navbar .button-cta { display: none; diff --git a/docs/site/src/plugins/effort/index.js b/docs/site/src/plugins/effort/index.js new file mode 100644 index 0000000000000..39d951f5193c0 --- /dev/null +++ b/docs/site/src/plugins/effort/index.js @@ -0,0 +1,29 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +// Plugin processes example sizes in the frontmatter to +// place a admonition box explaining the rating. + +function effortRemarkPlugin() { + return (tree, file) => { + if (file.data.frontMatter && file.data.frontMatter.effort) { + const effortValue = file.data.frontMatter.effort; + // Create a new node that represents the custom component + const customComponentNode = { + type: "mdxJsxFlowElement", + name: "EffortBox", + attributes: [ + { + type: "mdxJsxAttribute", + name: "effort", + value: effortValue, + }, + ], + children: [], + }; + tree.children.unshift(customComponentNode); + } + }; +} + +module.exports = effortRemarkPlugin; diff --git a/docs/site/src/plugins/inject-code/injectLoader.js b/docs/site/src/plugins/inject-code/injectLoader.js index 8aee6e91a2fc2..ffa49efdbfe77 100644 --- a/docs/site/src/plugins/inject-code/injectLoader.js +++ b/docs/site/src/plugins/inject-code/injectLoader.js @@ -54,10 +54,16 @@ const addCodeInject = function (source) { case "rs": language = "rust"; break; + case "prisma": + language = "ts"; + break; default: language = fileExt; } + const isMove = language === "move"; + const isTs = language === "ts" || language === "js"; + if (fs.existsSync(fullPath)) { let injectFileContent = fs.readFileSync(fullPath, "utf8"); const marker = @@ -69,6 +75,11 @@ const addCodeInject = function (source) { const funKey = "#fun="; const structKey = "#struct="; const moduleKey = "#module="; + const varKey = "#variable="; + const useKey = "#use="; + const componentKey = "#component="; + const enumKey = "#enum="; + const typeKey = "#type="; const getName = (mark, key) => { return mark.indexOf(key, mark) >= 0 ? mark.substring(mark.indexOf(key) + key.length).trim() @@ -77,12 +88,23 @@ const addCodeInject = function (source) { const funName = getName(marker, funKey); const structName = getName(marker, structKey); const moduleName = getName(marker, moduleKey); + const variableName = getName(marker, varKey); + const useName = getName(marker, useKey); + const componentName = getName(marker, componentKey); + const enumName = getName(marker, enumKey); + const typeName = getName(marker, typeKey); if (funName) { const funs = funName.split(","); let funContent = []; + for (let fn of funs) { fn = fn.trim(); - const funStr = `^(\\s*)*?(public )?fun \\b${fn}\\b.*?}\\n(\\s*?})?(?=\\n)?`; + let funStr = ""; + if (isMove) { + funStr = `^(\\s*)*?(pub(lic)? )?fu?n \\b${fn}\\b.*?}\\n(\\s*?})?(?=\\n)?`; + } else if (isTs) { + funStr = `^(\\s*)(async )?(export (default )?)?function \\b${fn}\\b.*?\\n\\1}\\n`; + } const funRE = new RegExp(funStr, "msi"); const funMatch = funRE.exec(injectFileContent); if (funMatch) { @@ -92,6 +114,7 @@ const addCodeInject = function (source) { ); // Check if last function in module, removing last } if true. if ( + isMove && funMatch[0].match(/}\s*}\s*$/s) && !utils.checkBracesBalance(funMatch[0]) ) { @@ -134,6 +157,176 @@ const addCodeInject = function (source) { } } injectFileContent = structContent.join("\n").trim(); + } else if (variableName) { + const vs = variableName.split(","); + let temp = ""; + let isGroup = false; + let groupedVars = []; + vs.forEach((v) => { + if (v.startsWith("(")) { + temp = v; + isGroup = true; + } else if (isGroup) { + temp += ", " + v; + if (temp.endsWith(")")) { + groupedVars.push(temp); + temp = ""; + isGroup = false; + } + } else { + groupedVars.push(v); + } + }); + let varContent = []; + if (language === "ts") { + const varTsFunction = `^( *)?.*?(let|const) \\b${variableName}\\b.*=>`; + const varTsRE = new RegExp(varTsFunction, "m"); + const varTsMatch = varTsRE.exec(injectFileContent); + if (varTsMatch) { + const start = injectFileContent.slice(varTsMatch.index); + //console.log(varTsMatch[1]); + const endText = `^${varTsMatch[1] ? varTsMatch[1] : ""}\\)?\\};`; + const endRE = new RegExp(endText, "m"); + const endMatch = endRE.exec(start); + let preVarTs = utils.capturePrepend( + varTsMatch, + injectFileContent, + ); + varContent.push( + utils.removeLeadingSpaces( + start.slice(0, endMatch.index + endMatch[0].length), + preVarTs, + ), + ); + } + } else { + for (let v of groupedVars) { + v = v.trim(); + const varStrShort = `^(\\s*)?(#\\[test_only\\])?(let|const) \\(?.*?\\b${v}\\b.*?\\)?\\s?=.*;`; + //const varStrLong = `^(\\s*)?(#\\[test_only\\])?(let|const) ${v}.*\\{.*\\};\\n`; + const varStrLong = `^(\\s*)?(#\\[test_only\\])?(let|const) \\(?.*?\\b${v}\\b.*?\\)?\\s?= \\{[^}]*\\};\\n`; + const varREShort = new RegExp(varStrShort, "m"); + const varRELong = new RegExp(varStrLong, "m"); + const varShortMatch = varREShort.exec(injectFileContent); + const varLongMatch = varRELong.exec(injectFileContent); + if (varShortMatch || varLongMatch) { + let varMatch = varShortMatch + ? varShortMatch + : varLongMatch; + let preVar = utils.capturePrepend( + varMatch, + injectFileContent, + ); + varContent.push( + utils.removeLeadingSpaces(varMatch[0], preVar), + ); + } else { + injectFileContent = + "Variable not found. If code is formatted correctly, consider using code comments instead."; + } + } + } + + injectFileContent = varContent.join("\n").trim(); + } else if (useName) { + const us = useName.split(","); + let useContent = []; + for (let u of us) { + u = u.trim(); + const uArray = u.split("::"); + const useStr = `^( *)(#\\[test_only\\] )?use ${uArray[0]}::\\{?.*?${uArray[1] ? uArray[1] : ""}.*?\\};`; + const useRE = new RegExp(useStr, "ms"); + const useMatch = useRE.exec(injectFileContent); + if (useMatch) { + let preUse = utils.capturePrepend( + useMatch, + injectFileContent, + ); + useContent.push( + utils.removeLeadingSpaces(useMatch[0], preUse), + ); + } else { + injectFileContent = + "Use statement not found. If code is formatted correctly, consider using code comments instead."; + } + } + + injectFileContent = useContent.join("\n").trim(); + } else if (componentName) { + const components = componentName.split(","); + let componentContent = []; + for (let comp of components) { + let names = []; + let name = comp; + let element = ""; + let ordinal = ""; + if (comp.indexOf(":") > 0) { + names = comp.split(":"); + name = names[0]; + element = names[1]; + ordinal = names[2] ? names[2] : ""; + } + const compStr = `^( *)(export (default )?)?function \\b${name}\\b.*?\\n\\1}\\n`; + const compRE = new RegExp(compStr, "ms"); + const compMatch = compRE.exec(injectFileContent); + if (compMatch) { + if (element) { + const elStr = `^( *)\\<${element}\\b.*?>.*?\\<\\/${element}>`; + const elRE = new RegExp(elStr, "msg"); + let elementsToKeep = [1]; + if (ordinal) { + if ( + ordinal.indexOf("-") > 0 && + ordinal.indexOf("&") > 0 + ) { + console.log( + "Only dashes or commas allowed for selecting component elements, not both.", + ); + } else { + if (ordinal.indexOf("-") > 0) { + const [start, end] = ordinal.split("-").map(Number); + elementsToKeep = Array.from( + { length: end - start + 1 }, + (_, i) => start + i, + ); + } + if (ordinal.indexOf("&") > 0) { + elementsToKeep = ordinal.split("&").map(Number); + } + } + } + elementsToKeep.sort((a, b) => a - b); + for ( + let x = 0; + x < elementsToKeep[elementsToKeep.length - 1]; + x++ + ) { + const elMatch = elRE.exec(compMatch); + if (elementsToKeep.includes(x + 1)) { + componentContent.push( + utils.removeLeadingSpaces(elMatch[0]), + ); + } else { + if ( + x > 0 && + componentContent[x - 1].trim() !== "..." + ) { + componentContent.push("\n..."); + } + } + } + } else { + let preComp = utils.capturePrepend( + compMatch, + injectFileContent, + ); + componentContent.push( + utils.removeLeadingSpaces(compMatch[0], preComp), + ); + } + } + } + injectFileContent = componentContent.join("\n").trim(); } else if (moduleName) { const modStr = `^(\\s*)*module \\b${moduleName}\\b.*?}\\n(?=\\n)?`; const modRE = new RegExp(modStr, "msi"); @@ -164,6 +357,45 @@ const addCodeInject = function (source) { injectFileContent = "Module not found. If code is formatted correctly, consider using code comments instead."; } + } else if (enumName) { + const enums = enumName.split(","); + let enumContent = []; + for (let e of enums) { + const enumStr = `^( *)(export)? enum \\b${e}\\b\\s*\\{[^}]*\\}`; + const enumRE = new RegExp(enumStr, "m"); + const enumMatch = enumRE.exec(injectFileContent); + if (enumMatch) { + enumContent.push(utils.removeLeadingSpaces(enumMatch[0])); + } + } + injectFileContent = enumContent.join("\n").trim(); + } else if (typeName) { + const types = typeName.split(","); + let typeContent = []; + for (let t of types) { + const typeStartStr = `^( *)(export )?type \\b${t}\\b`; + const typeRE = new RegExp(typeStartStr, "m"); + const typeMatch = typeRE.exec(injectFileContent); + if (typeMatch) { + let typeSubContent = injectFileContent.slice( + typeMatch.index, + ); + const spaces = typeMatch[1] ? typeMatch[1] : ""; + const endStr = `^${spaces}\\};`; + const endRE = new RegExp(endStr, "m"); + const endMatch = endRE.exec(typeSubContent); + if (endMatch) { + typeSubContent = typeSubContent.slice( + 0, + endMatch.index + endMatch[0].length, + ); + } else { + typeSubContent = "Error capturing type declaration."; + } + typeContent.push(utils.removeLeadingSpaces(typeSubContent)); + } + } + injectFileContent = typeContent.join("\n").trim(); } else { const regexStr = `\\/\\/\\s?docs::${marker.trim()}\\b([\\s\\S]*)\\/\\/\\s*docs::\\/\\s?${marker.trim()}\\b`; const closingsStr = `\\/\\/\\s?docs::\\/${marker.trim()}\\b([)};]*)`; @@ -214,9 +446,10 @@ const addCodeInject = function (source) { "\\$&", ); let replacer = ""; + if (matches[match].indexOf("-pause:") > 0) { replacer = matches[match].substring( - matches[match].indexOf("-pause") + 8, + matches[match].indexOf("-pause") + 7, ); } @@ -259,6 +492,7 @@ const addCodeInject = function (source) { language, injectFile, injectFileContent, + options, ); res = res.replace(replacer, injectFileContent); res = addMarkdownIncludes(res); @@ -273,7 +507,12 @@ const addCodeInject = function (source) { injectFile, processed, ); - res = res.replace(replacer, processedFileContent); + // Temporarily replace double spaces with tabs. Replaced back downstream. + // Prevents unexpected whitespace removal from util functions. + res = res.replace( + replacer, + processedFileContent.replace(/ {2}/g, `\t`), + ); } } else { res = res.replace( diff --git a/docs/site/src/plugins/inject-code/utils.js b/docs/site/src/plugins/inject-code/utils.js index 1911adce2cbfd..87370f9ba078d 100644 --- a/docs/site/src/plugins/inject-code/utils.js +++ b/docs/site/src/plugins/inject-code/utils.js @@ -21,12 +21,15 @@ exports.removeLeadingSpaces = (codeText, prepend = "") => { // Options are added to the @inject command by appending // a space delimited list +const isOption = (opts, option) => { + return option + ? opts.some((element) => element.toLowerCase().includes(option)) + : false; +}; + // Remove comments. TODO: Add other langs const removeComments = (text, options) => { - const cont = options.some((element) => - element.toLowerCase().includes("nocomment"), - ); - if (cont) { + if (isOption(options, "nocomment")) { return text.replace(/^ *\/\/.*\n/gm, ""); } else { return text; @@ -34,10 +37,7 @@ const removeComments = (text, options) => { }; const removeTests = (text, options) => { - const cont = options.some((element) => - element.toLowerCase().includes("notest"), - ); - if (cont) { + if (isOption(options, "notest")) { const processed = text .replace( /\s*#\[test.*?\n.*?(}(?!;)\n?|$)/gs, @@ -50,6 +50,16 @@ const removeTests = (text, options) => { } }; +// Remove double spaces from output when changing the code is not preferred. +const singleSpace = (text, options) => { + if (isOption(options, "singlespace")) { + const processed = text.replace(/^\s*[\r\n]/gm, ""); + return processed; + } else { + return text; + } +}; + // Remove blank lines from beginning and end of code source // but leave whitespace indentation alone. Also, replace multiple // blank lines that occur in succession. @@ -89,6 +99,7 @@ exports.processOptions = (text, options) => { ); processed = removeComments(processed, options); processed = removeTests(processed, options); + processed = singleSpace(processed, options); processed = trimContent(processed); return processed; @@ -108,8 +119,9 @@ exports.capturePrepend = (match, text) => { let pre = []; for (let x = lines.length - 1; x > 0; x--) { if ( - lines[x].match(/^\s*\/\//) || - lines[x].match(/^\s*#/) || + lines[x].match(/^ *\//) || + lines[x].match(/^ *\*/) || + lines[x].match(/^ *#/) || lines[x].trim() === "" ) { // Capture sometimes incorrectly includes a blank line @@ -134,6 +146,9 @@ exports.checkBracesBalance = (str) => { }; // Output codeblocks -exports.formatOutput = (language, title, content) => { - return `\`\`\`${language} title="${title}"\n${content}\n\`\`\``; +exports.formatOutput = (language, title, content, options) => { + if (options && isOption(options, "notitle")) { + return `\`\`\`${language}\n${content.replace(/\t/g, " ")}\n\`\`\``; + } + return `\`\`\`${language} title="${title}"\n${content.replace(/\t/g, " ")}\n\`\`\``; }; diff --git a/docs/site/src/theme/Admonition/Types.js b/docs/site/src/theme/Admonition/Types.js new file mode 100644 index 0000000000000..758734c32c02a --- /dev/null +++ b/docs/site/src/theme/Admonition/Types.js @@ -0,0 +1,30 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +import React from "react"; +import DefaultAdmonitionTypes from "@theme-original/Admonition/Types"; + +function CheckpointAdmonition(props) { + return ( +
+
+
+
+ CHECKPOINT +
+
{props.title}
+
{props.children}
+
+
+ ); +} + +const AdmonitionTypes = { + ...DefaultAdmonitionTypes, + + // Add all your custom admonition types here... + // You can also override the default ones if you want + checkpoint: CheckpointAdmonition, +}; + +export default AdmonitionTypes; diff --git a/docs/site/src/theme/CodeBlock/Content/String.js b/docs/site/src/theme/CodeBlock/Content/String.js new file mode 100644 index 0000000000000..d7e2c53f80974 --- /dev/null +++ b/docs/site/src/theme/CodeBlock/Content/String.js @@ -0,0 +1,124 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +import React from "react"; +import clsx from "clsx"; +import { useThemeConfig, usePrismTheme } from "@docusaurus/theme-common"; +import { + parseCodeBlockTitle, + parseLanguage, + parseLines, + containsLineNumbers, + useCodeWordWrap, +} from "@docusaurus/theme-common/internal"; +import { Highlight } from "prism-react-renderer"; +import Line from "@theme/CodeBlock/Line"; +import CopyButton from "@theme/CodeBlock/CopyButton"; +import WordWrapButton from "@theme/CodeBlock/WordWrapButton"; +import Container from "@theme/CodeBlock/Container"; +import styles from "./styles.module.css"; + +// Prism languages are always lowercase +// We want to fail-safe and allow both "php" and "PHP" +// See https://github.com/facebook/docusaurus/issues/9012 +function normalizeLanguage(language) { + return language?.toLowerCase(); +} +export default function CodeBlockString({ + children, + className: blockClassName = "", + metastring, + title: titleProp, + showLineNumbers: showLineNumbersProp, + language: languageProp, +}) { + const { + prism: { defaultLanguage, magicComments }, + } = useThemeConfig(); + const language = normalizeLanguage( + languageProp ?? parseLanguage(blockClassName) ?? defaultLanguage, + ); + const prismTheme = usePrismTheme(); + const wordWrap = useCodeWordWrap(); + // We still parse the metastring in case we want to support more syntax in the + // future. Note that MDX doesn't strip quotes when parsing metastring: + // "title=\"xyz\"" => title: "\"xyz\"" + const title = parseCodeBlockTitle(metastring) || titleProp; + const { lineClassNames, code } = parseLines(children, { + metastring, + language, + magicComments, + }); + const showLineNumbers = + showLineNumbersProp ?? containsLineNumbers(metastring); + + // Sui added code. + // Change component to render title as anchor. + const sourceLink = + title && !title.match(/^http/) + ? `https://github.com/MystenLabs/sui/tree/main/${title}` + : title; + const tailwind = "relative "; + + return ( + + {title && ( +
+ )} +
+ + {({ className, style, tokens, getLineProps, getTokenProps }) => ( +
+              
+                {tokens.map((line, i) => (
+                  
+                ))}
+              
+            
+ )} +
+
+ {(wordWrap.isEnabled || wordWrap.isCodeScrollable) && ( + wordWrap.toggle()} + isEnabled={wordWrap.isEnabled} + /> + )} + +
+
+ + ); +} diff --git a/docs/site/src/theme/CodeBlock/Content/styles.module.css b/docs/site/src/theme/CodeBlock/Content/styles.module.css new file mode 100644 index 0000000000000..c2103cd7ea4c7 --- /dev/null +++ b/docs/site/src/theme/CodeBlock/Content/styles.module.css @@ -0,0 +1,80 @@ +.codeBlockContent { + position: relative; + /* rtl:ignore */ + direction: ltr; + border-radius: inherit; +} + +.codeBlockTitle { + border-bottom: 1px solid var(--ifm-color-emphasis-300); + font-size: var(--ifm-code-font-size); + font-weight: 500; + padding: 0.75rem var(--ifm-pre-padding); + border-top-left-radius: inherit; + border-top-right-radius: inherit; +} + +.codeBlock { + --ifm-pre-background: var(--prism-background-color); + margin: 0; + padding: 0; +} + +.codeBlockTitle + .codeBlockContent .codeBlock { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.codeBlockStandalone { + padding: 0; +} + +.codeBlockLines { + font: inherit; + /* rtl:ignore */ + float: left; + min-width: 100%; + padding: var(--ifm-pre-padding); +} + +.codeBlockLinesWithNumbering { + display: table; + padding: var(--ifm-pre-padding) 0; +} + +@media print { + .codeBlockLines { + white-space: pre-wrap; + } +} + +.buttonGroup { + display: flex; + column-gap: 0.2rem; + position: absolute; + /* rtl:ignore */ + right: calc(var(--ifm-pre-padding) / 2); + top: calc(var(--ifm-pre-padding) / 2); +} + +.buttonGroup button { + display: flex; + align-items: center; + background: var(--prism-background-color); + color: var(--prism-color); + border: 1px solid var(--ifm-color-emphasis-300); + border-radius: var(--ifm-global-radius); + padding: 0.4rem; + line-height: 0; + transition: opacity var(--ifm-transition-fast) ease-in-out; + opacity: 0; +} + +.buttonGroup button:focus-visible, +.buttonGroup button:hover { + opacity: 1 !important; +} + +:global(.theme-code-block:hover) .buttonGroup button { + opacity: 0.4; +} diff --git a/docs/site/src/theme/MDXComponents/Details.js b/docs/site/src/theme/MDXComponents/Details.js new file mode 100644 index 0000000000000..eee9c9efe73ba --- /dev/null +++ b/docs/site/src/theme/MDXComponents/Details.js @@ -0,0 +1,59 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +import React, { useState, useEffect, useRef } from "react"; +import Details from "@theme/Details"; +export default function MDXDetails(props) { + const [hover, setHover] = useState(false); + const [isOpen, setIsOpen] = useState(false); + const handleMouseEnter = () => { + setHover(true); + }; + const handleMouseLeave = () => { + setHover(false); + }; + const handleClick = () => { + setIsOpen(!isOpen); + }; + const items = React.Children.toArray(props.children); + const mergeHandlers = (originalHandler, newHandler) => (event) => { + if (originalHandler) { + originalHandler(event); + } + if (newHandler) { + newHandler(event); + } + }; + // Split summary item from the rest to pass it as a separate prop to the + // Details theme component + const summary = items.find( + (item) => React.isValidElement(item) && item.type === "summary", + ); + const children = <>{items.filter((item) => item !== summary)}; + + const enhancedSummary = summary + ? React.cloneElement(summary, { + onMouseEnter: handleMouseEnter, + onMouseLeave: handleMouseLeave, + onClick: mergeHandlers(summary.props.onClick, handleClick), + className: `${summary.props.className || ""}`, // Add custom class to summary + }) + : null; + + return ( +
+ + Click to {isOpen ? "close" : "open"} + +
+ {children} +
+
+ ); +} diff --git a/docs/site/src/theme/MDXContent/index.js b/docs/site/src/theme/MDXContent/index.js index 98103098097f2..0b98d5c9480c9 100644 --- a/docs/site/src/theme/MDXContent/index.js +++ b/docs/site/src/theme/MDXContent/index.js @@ -6,6 +6,7 @@ import MDXComponents from "@theme/MDXComponents"; import Tabs from "@theme/Tabs"; import TabItem from "@theme/TabItem"; import { Card, Cards } from "@site/src/components/Cards"; +import EffortBox from "@site/src/components/EffortBox"; import BetaTag from "@site/src/components/BetaTag"; export default function MDXContent({ children }) { const suiComponents = { @@ -14,6 +15,7 @@ export default function MDXContent({ children }) { Cards, Tabs, TabItem, + EffortBox, BetaTag, }; return {children}; diff --git a/examples/trading/api/helpers/create-demo-data.ts b/examples/trading/api/helpers/create-demo-data.ts index d189e76c315d4..3d15ffc0d5087 100644 --- a/examples/trading/api/helpers/create-demo-data.ts +++ b/examples/trading/api/helpers/create-demo-data.ts @@ -1,7 +1,7 @@ // Copyright (c) Mysten Labs, Inc. // SPDX-License-Identifier: Apache-2.0 -import { TransactionBlock } from '@mysten/sui/transactions'; +import { Transaction } from '@mysten/sui/transactions'; import { CONFIG } from '../config'; import { ACTIVE_NETWORK, getActiveAddress, signAndExecute } from '../sui-utils'; @@ -9,7 +9,7 @@ import { ACTIVE_NETWORK, getActiveAddress, signAndExecute } from '../sui-utils'; // a simple example of objects by creating N amount of bears. const createDemoLockedObjects = async (totalBears: number) => { if (totalBears < 5) throw new Error('Please create at least 5 bears to run this script.'); - const txb = new TransactionBlock(); + const txb = new Transaction(); const toTransfer = []; const DEMO_BEAR_TYPE = `${CONFIG.DEMO_CONTRACT.packageId}::demo_bear::DemoBear`; diff --git a/examples/trading/api/helpers/create-demo-escrows.ts b/examples/trading/api/helpers/create-demo-escrows.ts index b013c3c02fe51..98e11d9c59229 100644 --- a/examples/trading/api/helpers/create-demo-escrows.ts +++ b/examples/trading/api/helpers/create-demo-escrows.ts @@ -1,7 +1,7 @@ // Copyright (c) Mysten Labs, Inc. // SPDX-License-Identifier: Apache-2.0 -import { TransactionBlock } from '@mysten/sui/transactions'; +import { Transaction } from '@mysten/sui/transactions'; import { CONFIG } from '../config'; import { getActiveAddress, getClient, signAndExecute } from '../sui-utils'; @@ -77,7 +77,7 @@ const createEscrows = async (total: number) => { }); } - const txb = new TransactionBlock(); + const txb = new Transaction(); for (const tuple of tuples) { if (!tuple.bear) break; diff --git a/examples/trading/contracts/escrow/sources/lock.move b/examples/trading/contracts/escrow/sources/lock.move index fa1b56c91d185..ad8e1c1cdefb6 100644 --- a/examples/trading/contracts/escrow/sources/lock.move +++ b/examples/trading/contracts/escrow/sources/lock.move @@ -112,7 +112,7 @@ module escrow::lock { let (lock, key) = lock(coin, ts.ctx()); let coin = lock.unlock(key); - coin::burn_for_testing(coin); + coin.burn_for_testing(); ts.end(); } diff --git a/examples/trading/contracts/escrow/sources/shared.move b/examples/trading/contracts/escrow/sources/shared.move index b927be7d11a27..a22e828f60394 100644 --- a/examples/trading/contracts/escrow/sources/shared.move +++ b/examples/trading/contracts/escrow/sources/shared.move @@ -65,6 +65,7 @@ module escrow::shared { // === Public Functions === + //docs::#noemit public fun create( escrowed: T, exchange_key: ID, @@ -78,6 +79,7 @@ module escrow::shared { exchange_key, }; + //docs::#noemit-pause event::emit(EscrowCreated { escrow_id: object::id(&escrow), key_id: exchange_key, @@ -85,11 +87,13 @@ module escrow::shared { recipient, item_id: object::id(&escrowed), }); + //docs::#noemit-resume dof::add(&mut escrow.id, EscrowedObjectKey {}, escrowed); transfer::public_share_object(escrow); } + //docs::/#noemit /// The `recipient` of the escrow can exchange `obj` with the escrowed item public fun swap( @@ -184,9 +188,12 @@ module escrow::shared { coin::mint_for_testing(42, ts.ctx()) } + //docs::#test #[test] fun test_successful_swap() { let mut ts = ts::begin(@0x0); + + //docs::#test-pause:// Rest of the test ... // Bob locks the object they want to trade. let (i2, ik2) = { @@ -212,6 +219,7 @@ module escrow::shared { // Bob responds by offering their object, and gets Alice's object in // return. + // docs::#bob { ts.next_tx(BOB); let escrow: Escrow> = ts.take_shared(); @@ -221,7 +229,9 @@ module escrow::shared { transfer::public_transfer(c, BOB); }; + // docs::/#bob + // docs::#finish // Commit effects from the swap ts.next_tx(@0x0); @@ -236,9 +246,12 @@ module escrow::shared { let c: Coin = ts.take_from_address_by_id(BOB, i1); ts::return_to_address(BOB, c); }; + // docs::/#finish + //docs::#test-resume ts::end(ts); } + //docs::/#test #[test] #[expected_failure(abort_code = EMismatchedSenderRecipient)] diff --git a/examples/trading/frontend/src/components/escrows/Escrow.tsx b/examples/trading/frontend/src/components/escrows/Escrow.tsx index 79b10cf47e30d..ea9d1da71d029 100644 --- a/examples/trading/frontend/src/components/escrows/Escrow.tsx +++ b/examples/trading/frontend/src/components/escrows/Escrow.tsx @@ -1,6 +1,5 @@ // Copyright (c) Mysten Labs, Inc. // SPDX-License-Identifier: Apache-2.0 - import { useCurrentAccount, useSuiClientQuery } from "@mysten/dapp-kit"; import { SuiObjectDisplay } from "@/components/SuiObjectDisplay"; import { Button } from "@radix-ui/themes"; @@ -80,7 +79,7 @@ export function Escrow({ escrow }: { escrow: ApiEscrowObject }) { label={getLabel()} labelClasses={getLabelClasses()} > -
+
{

diff --git a/examples/trading/frontend/src/components/escrows/EscrowList.tsx b/examples/trading/frontend/src/components/escrows/EscrowList.tsx index 1c8996f4fb632..084a4d78786ee 100644 --- a/examples/trading/frontend/src/components/escrows/EscrowList.tsx +++ b/examples/trading/frontend/src/components/escrows/EscrowList.tsx @@ -47,13 +47,11 @@ export function EscrowList({ return (

{enableSearch && ( - - setEscrowId(e.target.value)} - /> - + setEscrowId(e.target.value)} + /> )} fetchNextPage()} diff --git a/examples/trading/frontend/src/components/locked/ApiLockedList.tsx b/examples/trading/frontend/src/components/locked/ApiLockedList.tsx index cc81d15f6ee58..84cb60c11b4fc 100644 --- a/examples/trading/frontend/src/components/locked/ApiLockedList.tsx +++ b/examples/trading/frontend/src/components/locked/ApiLockedList.tsx @@ -40,6 +40,9 @@ export function LockedList({ initialPageParam: null, queryKey: [QueryKey.Locked, params, lockedId], queryFn: async ({ pageParam }) => { + /* + * Fetch the locked objects from the API. + */ const data = await ( await fetch( CONSTANTS.apiEndpoint + @@ -52,6 +55,10 @@ export function LockedList({ ) ).json(); + /* + * Use the objectIds from the API to fetch the on-chain state. This is done to ensure that + * the ownership of each object is up-to-date. + */ const objects = await suiClient.multiGetObjects({ ids: data.data.map((x: ApiLockedObject) => x.objectId), options: { @@ -70,6 +77,9 @@ export function LockedList({ enabled: !lockedId, }); + /** + * Returns all `Locked` objects or the one that matches the search query if it exists. + */ const suiObjects = () => { if (lockedId) { if ( @@ -94,13 +104,12 @@ export function LockedList({ return ( <> {enableSearch && ( - - setLockedId(e.target.value)} - /> - + setLockedId(e.target.value)} + > )} fetchNextPage()} diff --git a/examples/trading/frontend/src/components/locked/LockOwnedObjects.tsx b/examples/trading/frontend/src/components/locked/LockOwnedObjects.tsx index 044856947412d..860fed9063fe3 100644 --- a/examples/trading/frontend/src/components/locked/LockOwnedObjects.tsx +++ b/examples/trading/frontend/src/components/locked/LockOwnedObjects.tsx @@ -1,6 +1,5 @@ // Copyright (c) Mysten Labs, Inc. // SPDX-License-Identifier: Apache-2.0 - import { useCurrentAccount, useSuiClientInfiniteQuery } from "@mysten/dapp-kit"; import { SuiObjectDisplay } from "@/components/SuiObjectDisplay"; import { Button } from "@radix-ui/themes"; @@ -48,7 +47,7 @@ export function LockOwnedObjects() { > {data?.map((obj) => ( -
+

Lock the item so it can be used for escrows.

diff --git a/examples/trading/frontend/src/components/locked/partials/Locked.tsx b/examples/trading/frontend/src/components/locked/partials/Locked.tsx index c2c1d8d197b9d..7d2de9fd91110 100644 --- a/examples/trading/frontend/src/components/locked/partials/Locked.tsx +++ b/examples/trading/frontend/src/components/locked/partials/Locked.tsx @@ -78,7 +78,7 @@ export function Locked({ label={getLabel()} labelClasses={getLabelClasses()} > -
+
{

diff --git a/examples/trading/frontend/src/hooks/useTransactionExecution.ts b/examples/trading/frontend/src/hooks/useTransactionExecution.ts index a080a4ce7e626..dde36a8939b32 100644 --- a/examples/trading/frontend/src/hooks/useTransactionExecution.ts +++ b/examples/trading/frontend/src/hooks/useTransactionExecution.ts @@ -20,7 +20,7 @@ export function useTransactionExecution() { ): Promise => { try { const signature = await signTransactionBlock({ - transactionBlock: txb, + transaction: txb, }); const res = await client.executeTransactionBlock({ diff --git a/examples/trading/frontend/src/mutations/escrow.ts b/examples/trading/frontend/src/mutations/escrow.ts index dc56c21712855..8e3cc3bbb2861 100644 --- a/examples/trading/frontend/src/mutations/escrow.ts +++ b/examples/trading/frontend/src/mutations/escrow.ts @@ -1,6 +1,5 @@ // Copyright (c) Mysten Labs, Inc. // SPDX-License-Identifier: Apache-2.0 - import { CONSTANTS, QueryKey } from "@/constants"; import { useTransactionExecution } from "@/hooks/useTransactionExecution"; import { ApiEscrowObject, ApiLockedObject } from "@/types/types"; @@ -10,65 +9,36 @@ import { Transaction } from "@mysten/sui/transactions"; import { useMutation, useQueryClient } from "@tanstack/react-query"; /** - * Builds and executes the PTB to accept an escrow. + * Builds and executes the PTB to create an escrow. */ -export function useAcceptEscrowMutation() { +export function useCreateEscrowMutation() { const currentAccount = useCurrentAccount(); - const client = useSuiClient(); const executeTransaction = useTransactionExecution(); - const queryClient = useQueryClient(); return useMutation({ mutationFn: async ({ - escrow, + object, locked, }: { - escrow: ApiEscrowObject; + object: SuiObjectData; locked: ApiLockedObject; }) => { if (!currentAccount?.address) throw new Error("You need to connect your wallet!"); - const txb = new Transaction(); - - const escrowObject = await client.multiGetObjects({ - ids: [escrow.itemId, locked.itemId], - options: { - showType: true, - }, - }); - - const escrowType = escrowObject.find( - (x) => x.data?.objectId === escrow.itemId, - )?.data?.type; - - const lockedType = escrowObject.find( - (x) => x.data?.objectId === locked.itemId, - )?.data?.type; - if (!escrowType || !lockedType) { - throw new Error("Failed to fetch types."); - } - - const item = txb.moveCall({ - target: `${CONSTANTS.escrowContract.packageId}::shared::swap`, + const txb = new Transaction(); + txb.moveCall({ + target: `${CONSTANTS.escrowContract.packageId}::shared::create`, arguments: [ - txb.object(escrow.objectId), - txb.object(escrow.keyId), - txb.object(locked.objectId), + txb.object(object.objectId!), + txb.pure.id(locked.keyId), + txb.pure.address(locked.creator!), ], - typeArguments: [escrowType, lockedType], + typeArguments: [object.type!], }); - txb.transferObjects([item], txb.pure.address(currentAccount.address)); - return executeTransaction(txb); }, - - onSuccess: () => { - setTimeout(() => { - queryClient.invalidateQueries({ queryKey: [QueryKey.Escrow] }); - }, 1_000); - }, }); } @@ -112,35 +82,64 @@ export function useCancelEscrowMutation() { } /** - * Builds and executes the PTB to create an escrow. + * Builds and executes the PTB to accept an escrow. */ -export function useCreateEscrowMutation() { +export function useAcceptEscrowMutation() { const currentAccount = useCurrentAccount(); + const client = useSuiClient(); const executeTransaction = useTransactionExecution(); + const queryClient = useQueryClient(); return useMutation({ mutationFn: async ({ - object, + escrow, locked, }: { - object: SuiObjectData; + escrow: ApiEscrowObject; locked: ApiLockedObject; }) => { if (!currentAccount?.address) throw new Error("You need to connect your wallet!"); - const txb = new Transaction(); - txb.moveCall({ - target: `${CONSTANTS.escrowContract.packageId}::shared::create`, + + const escrowObject = await client.multiGetObjects({ + ids: [escrow.itemId, locked.itemId], + options: { + showType: true, + }, + }); + + const escrowType = escrowObject.find( + (x) => x.data?.objectId === escrow.itemId, + )?.data?.type; + + const lockedType = escrowObject.find( + (x) => x.data?.objectId === locked.itemId, + )?.data?.type; + + if (!escrowType || !lockedType) { + throw new Error("Failed to fetch types."); + } + + const item = txb.moveCall({ + target: `${CONSTANTS.escrowContract.packageId}::shared::swap`, arguments: [ - txb.object(object.objectId!), - txb.pure.id(locked.keyId), - txb.pure.address(locked.creator!), + txb.object(escrow.objectId), + txb.object(escrow.keyId), + txb.object(locked.objectId), ], - typeArguments: [object.type!], + typeArguments: [escrowType, lockedType], }); + txb.transferObjects([item], txb.pure.address(currentAccount.address)); + return executeTransaction(txb); }, + + onSuccess: () => { + setTimeout(() => { + queryClient.invalidateQueries({ queryKey: [QueryKey.Escrow] }); + }, 1_000); + }, }); } diff --git a/examples/trading/frontend/src/mutations/locked.ts b/examples/trading/frontend/src/mutations/locked.ts index d0ea805ee476d..55c8cc264b1b6 100644 --- a/examples/trading/frontend/src/mutations/locked.ts +++ b/examples/trading/frontend/src/mutations/locked.ts @@ -9,6 +9,7 @@ import { Transaction } from "@mysten/sui/transactions"; import { useMutation, useQueryClient } from "@tanstack/react-query"; import toast from "react-hot-toast"; +//docs::#mutationlock /** * Builds and executes the PTB to lock an object. */ @@ -34,7 +35,9 @@ export function useLockObjectMutation() { }, }); } +//docs::/#mutationlock +//docs::#mutationunlock /** * Builds and executes the PTB to unlock an object. */ @@ -97,3 +100,4 @@ export function useUnlockMutation() { }, }); } +//docs::/#mutationunlock diff --git a/examples/trading/frontend/src/networkConfig.ts b/examples/trading/frontend/src/networkConfig.ts new file mode 100644 index 0000000000000..f81095781caa2 --- /dev/null +++ b/examples/trading/frontend/src/networkConfig.ts @@ -0,0 +1,19 @@ +// Copyright (c) Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 +import { getFullnodeUrl } from "@mysten/sui/client"; +import { createNetworkConfig } from "@mysten/dapp-kit"; + +const { networkConfig, useNetworkVariable, useNetworkVariables } = + createNetworkConfig({ + devnet: { + url: getFullnodeUrl("devnet"), + }, + testnet: { + url: getFullnodeUrl("testnet"), + }, + mainnet: { + url: getFullnodeUrl("mainnet"), + }, + }); + +export { useNetworkVariable, useNetworkVariables, networkConfig }; diff --git a/examples/trading/frontend/src/routes/EscrowDashboard.tsx b/examples/trading/frontend/src/routes/EscrowDashboard.tsx index 2633fb94a5d6b..2d66f0ba3dd0f 100644 --- a/examples/trading/frontend/src/routes/EscrowDashboard.tsx +++ b/examples/trading/frontend/src/routes/EscrowDashboard.tsx @@ -1,6 +1,5 @@ // Copyright (c) Mysten Labs, Inc. // SPDX-License-Identifier: Apache-2.0 - import { useState } from "react"; import { Tabs, Tooltip } from "@radix-ui/themes"; import { LockedList } from "../components/locked/ApiLockedList"; diff --git a/examples/trading/frontend/src/routes/LockedDashboard.tsx b/examples/trading/frontend/src/routes/LockedDashboard.tsx index 30122ecd43587..ac37310dfe9cd 100644 --- a/examples/trading/frontend/src/routes/LockedDashboard.tsx +++ b/examples/trading/frontend/src/routes/LockedDashboard.tsx @@ -3,7 +3,7 @@ import { useState } from "react"; import { Tabs } from "@radix-ui/themes"; -import { LockOwnedObjects } from "../components/locked/LockOwnedObjects"; +import { LockOwnedObjects } from "@/components/locked/LockOwnedObjects"; import { OwnedLockedList } from "@/components/locked/OwnedLockedList"; export function LockedDashboard() {