From 2533979b2fb9763076343ad45ee3f5e44849c375 Mon Sep 17 00:00:00 2001 From: Alexandra Tran Date: Thu, 14 Sep 2023 23:06:29 -0700 Subject: [PATCH 1/5] Add Unity contract interaction docs --- .../assets/contract-abi-converter-dialog.png | Bin 0 -> 20753 bytes wallet/assets/unity-empty-template.png | Bin 0 -> 11258 bytes wallet/assets/unity-example-template.png | Bin 0 -> 24376 bytes wallet/how-to/add-network.md | 2 +- .../how-to/connect/set-up-sdk/gaming/unity.md | 109 ++++--------- .../index.md} | 4 + .../unity/contract-factory.md | 91 +++++++++++ .../unity/contract-interface.md | 150 ++++++++++++++++++ .../unity/contract-provider.md | 78 +++++++++ .../unity/contract-proxy-class.md | 30 ++++ .../unity/index.md | 124 +++++++++++++++ wallet/index.md | 2 +- wallet/reference/provider-api.md | 2 +- wallet/reference/rpc-api.md | 2 +- wallet/reference/sdk-unity-api.md | 69 ++++++++ 15 files changed, 581 insertions(+), 82 deletions(-) create mode 100644 wallet/assets/contract-abi-converter-dialog.png create mode 100644 wallet/assets/unity-empty-template.png create mode 100644 wallet/assets/unity-example-template.png rename wallet/how-to/{interact-with-smart-contracts.md => interact-with-smart-contracts/index.md} (94%) create mode 100644 wallet/how-to/interact-with-smart-contracts/unity/contract-factory.md create mode 100644 wallet/how-to/interact-with-smart-contracts/unity/contract-interface.md create mode 100644 wallet/how-to/interact-with-smart-contracts/unity/contract-provider.md create mode 100644 wallet/how-to/interact-with-smart-contracts/unity/contract-proxy-class.md create mode 100644 wallet/how-to/interact-with-smart-contracts/unity/index.md create mode 100644 wallet/reference/sdk-unity-api.md diff --git a/wallet/assets/contract-abi-converter-dialog.png b/wallet/assets/contract-abi-converter-dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..5ad5e1b3cd391ed0b13e4e194f9fc7620fe20359 GIT binary patch literal 20753 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 c6X)c{OZ*{`^__>-Q*&W6^*REY7d#WV&;@Y+A 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

WErSHAIGAdAZAn$HoPt#n#Oy%uTk++S zgqo|ld7@4_8If7B?V}}yZ+HsVaJS!(-AewDQ6hAl9O2hSIc6aH;+#Z5J@F1;uJzHjUhERaM7@69z*RU#rMdb2&f@1_O-=&^OshRu z^b9IWdJw>>HIwWX(c;BV34ORAjAF!oLm6=*W7_!ceYh!EGqpXEEY#FiY_igyJ?it9 ze5=y;YtW&vldMgXlF*TOg<$`jnM1v;&nDMg%f+=od8~!}%Wvv?0mn>bB4g}ZZ6BvA zQQWucZoVjg*jw4GE~}wf8inbruJxLOp^pq3+Q5_cVy^AWQJs%m2v}Zkut;wEoOxbd zNLg4~omQpZ&^8+59;Q>8icjCpP z>h+R!S0{r<WI87yAmM5Bx3s(ZPBh?1_G} zs?a|%&xrdft(0-3l7y8Oi%6l3v#Y{LjyDt4)75K4;lh?urEM!27uz&T>2jPh#C>GSiGRqx3W!y*cSxMk!a;0ExIHHl!Wuwuk8ND_7!z98Me;5I#goh50 z{j2W6*|?B`DSv*tEYNYq;ETHB2fsr`Cp!%fp<04{4$3$i`W>H1eQxcM_GrdHYT)JH zqG%9t)+RX=RNpi18=JyQQ6wz&*~ixMHYQUqS%7*_F&t3;Z7G1>-vmnctr!QpWHZkx zJ-A;hjwPW*EblpI?t%-)@3jMkO~bLiQUS?kX6|P%*9`!`kha-IcNq%>qTe%d8m;*i|*I>mLMU! ziDkNbEFw;CV7%YgNP4J5T%kDo(@B(O8m0s`(c z6+&*UjnzkWO!Dg7xgIKhW8ePj(B2M^B6hP)0h^Uese6&&@5j;hZQ;yzTj%_%lvs??ljQ45}9xbyPsIknp0YvhFYy_&`=W@xX zsxMPf$ObhO%3HV0u8NtdJKGc+{$)QMXnS>eVYj>R+q?eiIO1xXl5yqY^uYP*a_eey z6F5m>ivHi2x+emc4XZo(o0Ns7kaqP!Qfgc3m%Ircuk)(*STAmyFuL5O<25G4M(20* zc#kw)TpqVcRZ+qe%AS(^(-lflREQ}Th;XI?`faq@{(j-rX`$Wm_AHt>vHLE51T{{{)wb}B7?z!!R2whMyX}*?=kcD6#*l5s5$QA%AfB# zFXTiClE-TEdTQje+HVfsfjF7yPWT|kwB`hmAQ<0t&`kCW|TiqR|jyU%a~Q} zNx&&EAJR&DB&#Qr-w)|+0>oo~Ly}e?IN>YLe($|EGJ~NpN{>lCDV$MU_%^E!(guQG zpyi4C+@1z&mV(mzE@ge#;8Z{F(<0ohv(kJnPtf&;Nm^Fe8W~htV2p61md@+NKyv0) z{P>&2vr7lv=CG@}O@P=`UtOL}V&G;5({)}Sx>Ysa2&{0cR^Tm+hD^O5T3PJsevcgBdY;DJqd6Xuhen7>aK{Ewv&!8>%mkU zrwVZ;K@O_!aS!xy+q2kc^C$r075VjRK5zZ1kvaB6Kh*ZTZZS@uyy~*^Q8i91&T+oA z(qpT3_+Ys&6MZq^-1FXL+UwUZ%~qhipD5~UTplhoGBfJ9b42r+f-3VfFp?(mXzw*J z%clwn>Yrvl%Q+O`HWhT=w-hpNxaM-Q7+;M?t3ssBJh4JVH(WP<4zt_B0sI+Z@A@EV znX%dQ!@x74%KIvDt}Gtw@L#SwroWDhTP}|>KNXjs0SF_Wa#q$?fw$v12iQ8iyXp$?dOEXMXyBx`w>L#S4yRX?M zlv|(mr*f#Lu5WGJk2jcOCe7$7Uz|olh2V8P|CyVXBca z$@c2_YD9st{H6cUtZAV07is@UdNl|&qfM>*!EUY4%Q$8GvwrK$Tp`zO<7xe@-5|k! zLUQmjGdUSK6In1xR^;C@U)Jp`0;%%-^sEK$BzP~9!D-9S*c`GUnt z*ku)dkZcyPBs-n~z8NQItf9`0{E!;sxc1{$dGL9@*VqRon|WPSye(qF@5`uQuhrs6 zGDjF#q@+s(AtS552ySmHj@IR(`^4AKg}t#@lm5WFTP!yWxsQzC zal>`FzlmdVzv6RgVb-aX#GY1NhY?k*I3tgVdBQk9&hq+aaK8F7bpu8?D74DFvXCZd zn^;&qXf4;!e2WPxJ-IPjn!7f6R+w?B<2#eQvaGl72b$Z?8zyFnq-?tblkI>=ktI6k zf;&(xVHcL$WklW4mJhfyzhV07gju}@QW*|~^l5~7yCd5pE+{v9yDw(Mu>yTRQS!m$ zRE;F{c}sXLjQL^$Q?H-^)52w43CS220#GJQ8GMYyf=#k&&E?m{INH4h*uC{d(lN8# zAmQ-{v)bdHitvBp0k|0B9^-;YU9F{mI zEEmi!h|C1v94@C6^M5FwDsru#%$ZP|@DtsX7#9W8lB~yK#rb2VGykSngejl4y^E!W zssBQn?kAEB$PGhj@2`g4rrQ>qVvn$8Vt#}qy+3oaNuafp;oFQ58Uu;wwF4L~S=UtI zbqPsEmiqh13{HL~Df5~&vHZd{p_;Vnnk^c;K^`jycBqnL@-)E#` z341#?=16T*DwRR6fO+B#E#kX-Z*>9OWc?S+Ii2xj=Kb}pOB?-vi^0_U5Q-SOUUzqt&D8#eRwuCsP$Aq9%cI8gqrP}(ZW zdBqAMR`1>e#);0Z6sh5QmC%;3KpEyta(%`F^sIvSfH8=aN_>?Y>ma<&4>!Y5UN>X1 z==KhKRn+BBN!Aicdxw3i+Y~-OPvs3`Sup)UHFC)=aH?Hnw0S(4SmD>`LaQt@e!kb8X(FX1a#Wkphfy*}(Il3r0olzj4X%)TLgE(RO;UKo|h4r!iN0?LElA!|e*A0?ga-3Lja zk9_Z2?;9^a-gSJ@!7iu6abHa<-4^oZ)eVI*@JmZ~OHvVH$Sc+{5AHWWJ@MZ-brs*$ zyw5qs(UH&9(dO68@Nc)0xt732LHLraiqlhRXD{t)qCQk~rM_MWH+% zXTOf|IdAiM2e?o&F9bvp$%rKu!+)h*6=xgRS@i|?>b3uMNeET{85Xas+!05k7uh{h<w)+d0jR5!=SSNOpN{W z72rCZXZ4w+cFSnvboo>CDm7&kL=XAu8y6b4>dp%A9$uR2NI$FBz6Rb$k{S>mSEa?} zF981MF2WMA!nJaqBIZ(1?}lruFmC+R8q&{w-|xu{H%{y>BIy{=+!yN|3qKDqoM{Zr zSZ5P=Zm7IiIgeiS!|B7@Cfd&aHlroxmx=2WWJsA@#l3b|#BsKiX>rGBXhD#(NvmUb zLgi)Cav#zox6~L>t5f{*mnuYVjWU$MdJ!I!XIm=Ch8PKQ6D84u6M$`%aY_+;jQKkL znHDSYe9T1My)YjJJI~nwx`}XRv6@r+v9jNQ;pb7{akN=ybJ*612s`Q)+j4C*wo{P1 zoqqGs?1pLQ)#12(wT_`%i&DL$FE zmD3cu3HL}{)flm)ZIqZOXz!BsSYQLmSV|EEVG?zMRNwhMR^8W=ZLhzG>r@QWD-79d zMWzrzU(vo?aOobJ;tv4*cp8cEx;$ChZ15$R;>cc4@qGa&NcQ4H+T`vs{3ZUKR6;;P z5=CTEBmh{0S8uu}0*61^22LEmzK1mN&L9t@3~r$3m*ZY{{a_>4yc-1URanRM9>10y zDv1)?qksU#4c&5e;V@mK`s;`kgvK{Azuj)~oh_hvpHI2>0m|87T%Y`-*8C3SRWuYn z&l<&0oIVhKrM!5Omv;|IOwf08uGy$u^Mv#fP9sIxjc-o;angSI6WxTsLlM#vMw#o`gz2d*?1 zLmTJ%CX;6T-Ep;$XY5>tB@%Ak;-ToHn(OF&i2XDxll@>kJ???OC65f;Oz@ON!o7@= z)bm!MWK&tU%zZe)qdV|<`wkX_^$_@r;cwoU$Zg20 zP+i>N`sn-xblfwiryc~v3MwLV5gK~9kEn;SsW%$uxTM|pgpmNgqxI&&*XC0G0nCn# zdC`XK$n_(@=R6kZP+45kd?8uFmcn@_sLP&dERz%}-7j1&ua&pU!>sBGn&C?!{`@Yq z991X$=u=1W$>*l#Z@APd7JB|SO7qE;X`Ul8SvS?icl>!tm{<$L=;2LU(WU=pwe{T) zhMAu2fWK`k%cX2cOm1m!4CW`19NL6ys&Qex%loja*Z4TkixTxpW37N_=;lHcu|F$*BZCEkD&2Fs?8+!a8;}-wj zF|s!FLuJ!BYXvCgjTS}C%_bkyw!SHT5qF0_6Q5Q#(E=G`%c`rN( z!Ut4_>wT^WQEfn0W=Zm5f530|iW-3F9Y8t-Ze{ksNiN@hx(=V7aY*yr4VF53X$Yu( zTM?+Kpk?nDW!=lo$?9qV_;3V-y<0aq`G}bWb|RweHdBS00_GjmzdTQzgn-CUeG~tR zoa)}+E@zi1x7=S{$sz;z{Leohe0;twqR@cw)BZxVdX;=AZRJ{F{nR)QWbF|0Mt4uB1ueoj3n>r>q57;>j1lgkn2q4AQ&~^^S)0?cK&-yG$;2 z$}Z4f-s@T($c><@;zOG`h4DQD9($r17gCOklqpcAwOn2rjv56vhY2E9&)$zp52z70 zZ}qXwm0XnDjLv1s?0Oyi(LuYsB2K(bDSkL&Cb{~M%M3tYX#RhwVKLsQ%DS+2$exZ2 zF$K)%O|;OIWwhYC<>$QKKn6kvC7>vWYf5hh?|9b&n21-H&21#%e@9*6r&_LR)rx|7NgJhcG4iH6C$)!WgtTnuJCpIm2*)qHuo>6JmHC70tpOrjahT-#Rr|;^7 z@6~?8>{P#H0EIAIi5&u=inI1dID&;)9~=nY?FBgIM2nO%#F06)rbB((CWL)GK#VA* zOeek8obM$gIY;Y+1C}i4ogqNOX;z~C&7_~7|BqP%fLU2u0eiW)ODls##ellhYhn#e zOKjQVOC}+JSDB~px~vU#T~!lYwQ=}=_KqX|+FZh1-W&IFf3XDbFEd@;b#%Wn? zDLxR~2JiMJN%_=Wb%o5=Uu@WquXFhyTSa1G8#;QnYL8O4(g$D`CTeo1#~np5?j7Y` zE#u2pAe6^pE266#b1?EkFfL$LTvM(%> z0A>cWhm@b=Aq7oAF-o$g3r zp6`9vKxj%q6-22B=kIMC;SvzF(M`p(VHor24&vJ_VX;5)REe28T+38D1=$>C9;kc! z`s~~#6p1ISHEhq)BqwuWAAU_Zh4%D-7Jw;#;XGYr;>TKWFXiI$B<*U{B@o1tQD-nE zd}=l=>2>Nl9wBwPZ0NQ~BV^V}T0eGU3BO_)<emYzRuqEXe>!|ps|I9$BAU4g zZX5uG9)~TV=^;?iof;khh2h$*4PXLq%LFOS<~taWUcte?pT}-kP%_s$nrahD*n;(4 z!7yrs`zn`qzU8`~W(-CvQwevtHN8~_+)Tp5RBjgJIUpp~16mF*fLY*~C0|B;hpA}4 zr^0dm+}r1To|UOjM{g<_bFrfC^ENr@cH*Lbt^3c22^)Qs=q>^r%9b#4ztgpRcI!m(`lewGzZl}K1%?^aNQb%>HF>jAS}j6 zmYU1cwY#Mu)WHll5XKE336WeL7UlNSlGAy{zJI1KHeC#3fW;=_$eNwk-;{QY1xR!% z$PtmM1DnVm+7_}(EV~-!j`_TUkB)xEm_OlD^$a1F|NZ2pgXlT(xJQzu5h7D#^o^AE zNVS#;0cR5XkiV7fU(S){`NC8?5(-x#LjaKyvk^zYdnhof_qP2)*?P9P`{GDAZJS>1 z{ar*~?3X%3|1BUZ1;2-6D5%+0-m;-5yfYA7?m#;$R@!T4+N$%phP6?ee?jS$VlYFv zGf;rr+Vn^qB{%0oyFx|*F1i}@?j!|pLY9Z?FMmdCD_JC^zdZ~->RdEW+ADT3s-eKg zE1+;3 zy#h0>)CA4Kt_ABo4grpE9b0eLQ87hsA5HsAS1ic`qF%B?#9`(mK9%YvDaw$Qd&t#6 z0!~Vo4`gxU_-3L235mpLH3a${e~NU`!zTwcn97qel;|D)R8T@8^rRsZ_@rr=V)*_E zijiL3do?fj9+Kv1upZ5NW+*>Ca>2Sd+6LG{ZpDjJRK$==reHmJ`WN`e$^;!EMQN2@ zfnU>f2kj}3%E32i5D>W~Aem5gFVRvLH6%?%7WycZ=eq36q_<$8@_E7}xs>c&b~9|b zijUiI!m;h7>H&WJo1Fl`KJyO3{)74<|D~5RvPFPhZnDSw5aBYYp?Dke_Kq#4Jo)W> zV6$o&H=ugHiJdNIP6ErumYVpE97OI}I@v&+)j(c3Iq+OddZWc={i&kRvcwv^mYtQ$ zs;2C(;>^ND*hl}j1r<=ws393sZAy0Mp8=1ZRe>BcZ}VvWGq9d1Tx>B$^Ze~Jw?oI< zn?Q{<)@e-R$Q~6w(Ai<`tA%_-JP?Mj$asM5Y^xgC#dt-Lk)9$ip0E~ODY6AvUkajE z;vL*)xCZr;b4@Fn@uwUq3x$5ai+O(BsoXP`u^XB+n={LKhtTgUb{bBu)&WLsiM>%W z5!c63T9f45WpU@1wH#FJs@t7M+trq76SWp++3|+E&iN%}0~bfrTURa*C#3vu>FL!< znyW;5(29IZb|&Tu!~9s*V^-EzVIHu#TY9JH8as&{|ENPxszkIKDT`;{n|hHX;gV)k zK|l*k7h%ARifyJJ1s3?!DFwO#^^A{wE`0Io=(t!f?Kxk+H7iM2I*rIX0IY-cc&f2d zi-_vwjL;e~i#A3#?wJt3bUXgr{DMO>9ss7e@K!a(!ENiIBHgxBS-~zX!y^K1 zZFZYYd$A#KK*3e>Q)~0U1fBnbavF_&?iX&d-%?9WdN_{q$+LfChg%5(Tb{0Q^ypSz zQ8fFrw`SG&$T2_5zI!{}9qmYTkW$Z^nFe1;bZd}te|6@s7Wl|;xb(c)UvEZ{&ajy5 zP$wBUjIlw)z;!kNEs#oJ9lVpYB(FYh!(A`SJ6-NrC7_mSjxp4J)GO?Eh)-p!)V%{T z$|mEr9=}|m@j?d(1g=0r< z!-n!J12xSafD1ZpHE+WW!?aQpv?H#ufQjPxVEGS)e&=PwHuvdl?M7oUdxekfDc+cN- z{Q%^r-wW8ds{A~)6v75eWp+EI}e#J>Amw(SQWQQ%V+D!h$Lo+WLbJyraoG$E@A~$gl6)gz399D zR>{I)9Zk8whTj(YVA%h&{~6;>DI4z*v&P?3+vNg@B^zpq?+0Q+jU~> z&O*i0F>o7Mj{7$B;`2q6v*)gdq&j^oMeo2(xoO_3-GJ;5>V?XuaY0!%x%AsI>_Ab*e^^pby4)3qgJu=xM#vm*U;EVL2!-}cK@#YFlnWSc~Sd=vw(1Mm(rG?(%8U;{H*x4UiN`$LxfNRHtlE*q{CH$p}f5 zc;Mu(3=6Fx_KsA=RZN_^srC&D-3;?(7_3h2DmUZ6@goAGE1@rd=O`8MHzsm$(CL_z9F>^~qFfgNd zR@YVC3@hu|)DS<4B5n^Vcgsuujr$6x6iYYB7E2he^F&r5`%f&an7_ly4 zKlHg3J>yMvkxZYz6C9!Sp-cWKWNi+-A;B&P1*OuBKYy2MK1{UZHuu?W6U94zOtdZn z=c+zRkIwOwOFkET=L(45Gva|SvgTXYi}$ikIB$5u=|lATN@sMzL}^&TtpSv%$Q80% zBxhN#IK`UEya(o@8mt!x^_?M+ai2f`n@RGJY<@?8UdG`jmqlm`DXM_}#h2U&vZbe@ z-O(-r0+Jn#-6QWc+;wv}*=Z5Ughx?Fj|J$hU7yIpQUZGf$s#?}B^s<=NfIonT+Fx> z7_gyT?h3O{MfCRmm?dZ6Zx(uIBjB(aF?#&fSB++iu4q=+21T?atM@L)wM{yxBRsxT zdfngGg;f|{O%Bc-4e2JxJw6yVIy2EL=rg8nI(){=<arZ{UBIh(34TVdXZRywG}lNil0%mdj+=4`TP>eN-2u zg*rviPrK{r>ar%5^=OpTURX z6u}A0QI;7dkXJ;{1h}iX_rK*u-xYwYk^$wTYLeQ|_n$Grae*D`_TjU)A#xJwWJ~^} z|Cen9|6d$sfZw#W28DY~-voA0z18B0%<~Etz~c?XOsC-{E1+(J_pYdmQYomMTUT&@+WnJIn}yy7-~HABXtxW5 z;ebTY^ZVRV2uvxhhH|@78%rDoih*RZWu+Jcf3OWiB+f}kaH#GmqAV(S@f0~i!OZM6 zTgH8)2h!vGcqg{gSiutc(qhOi=_6*50rMd3ARZGr*>NNM_xe!scf8q@n5(IPY^aid z0EbD$)_=oLUI48Ft)WmAPd>2KiLT@<&_{ImT?$CZCf`&kg~@T>f_olscbGdAO_6PHHq2@N@q6p(p)da{<63`j802xkP3Q+nXUJu(Kwrx9ZjgPUb%Ee*+?Z-^`zIB7v5#cdS0=#S!aG;((F? zx^EPDn)5Sfv82#i;Kqnr70P&Y8h;&>1OY^<5B}~cUJv!X`u_#DWdchnE~#SkVTcLf zkv;PN`T!4=zM+}$Lg@KP_4~EIb``UPSM}b243lBX;aR%*43I;#?#_4lA+HF=_-#f1 z3`ygU1aiDU158-m^1ozMR`WX0yy=MV*W32knQPgM)3+1hG$PgfRxBga!R{~2uY`Np z(A>!V?YCzb&aUS?6lrE|&3>DFPsjJZwF9P0&8Q^xOmt3Y@vu`IY8c-J6S z@9m?{e<*Z$Jb~^_JD`1!Xff2}@%HrP;jgDjpt*K7IG1m1+O)@(#8CqQ#W9O8i8E9t zUn7v-H=wVoeS?+7I2p6Zj+(wa+@$7}$dklRZMCBfy?!K0Hd(~~20fW0<}m&zlX zf4;}3J$DDJCOg35tCRf95;6+(Ku!R4A=6m{qDOq5kd%JLXBy~jvIC;Rn?SFbBY=&Z zft1$K`#bs?CqS=9^_HrmByZhu2GGg40P^IqjiTakmnD z6fuJKKJrf<6bW3XbN%H(Arp|yx+q@)n9yNH(?eq7=bT7lDz1=m$^4I(8^5Ln1G(J1 z2Oq572q3>aRNEN%&r0R>)gQT7ho29yN>LZ4pJ~jxng#Jq~^A4?D=1Y>-Eo; zL7bh{0QoVp=;*k@b15;gtZDbPADa|D$9_P=j}fd8^n(z_So}FMu7l)mDXAYJnGu}Pt|Rwyzq^s(+1u_BtdukY$q!EuEJZmx&4;OeAfY^z|08Sybch12YUco!211$ zjeK7JLqM`9-7UMN?v%P&%yyB(+w({wtQRPhfjR8`+R(`~ijI<{er2#%q{OoUA&X0V zz>1>Ba=t)m`<1s52i#_;$A%k+0SN4q$(*Jfr!pb=H}y2hOChY!;Z8d~A{%_965BYJ zn&)E1j+6reM!koC+n|hl_~IT?{zhYOD}eLIvTE^oGcPw)RLN%fCcF&joe`cU=1G~A z&EOd)%#do%PuK+}U)7Cc4TY+Y(|N$Mz>Nil;7SVFmRQrfj2}Sna$VPdV3dlxByHmg z-+y3~Z0P=_EK{v3fQJ%k5P|#Ndr8yBYB$G;X~*AbzcBUV+vyJNIpaYu^$^{!p;|lw zvW62|K35*R$gVhEfJfc>FCO(IB7wK3LeFN;q!maj&PY`mi*X=6uKE)#wQC9!$33~5) zyU<-lT+w6AI)Jj2;}?ph0b#Z}wYC|8HX?xXp1+DAjy(BTE})6< zbrkk-A75GzRVAW1xdgG^UazrT7p*jTned9Z&s(6cXt`wME}z`byjGyKkf>}HNRcb5 zG@uGduy=t@_2j~&e@kjN8T`hHj6~EwQ-Jw@`ggAq%_1a*F4irioE4eh$AB_&dIPOG z^91dbaB`ha0Bx%RIy%Rgea?3_fgVX}nL+9?KHG%R^; zi2TKvMg8wB3>1`z4 zQcFnjW4I;bL3y6Z9<7F;fN?$Gvt?MpHMW;&!Q%~_o|;K%6Iys7Xtx$vrGDU|)kJ?6 zDtF)e6GymE>U7*?nzlf;R~D2p4}UxixG)zY{M9mjKXWjACZCLMvzc>!(z>Y|DWPWZ zfcdY0Ie9;@Sms9k=#UVo=7V zej(JPP8OnTeP&+iY9wn>$#}$`K4m1iw&y7<`Tc|cp+QRLXxLz7{GUCrR`_lC1E_+j z_I28ZH;vEOnSdsH3;u{k?1RL0Aqy(SI9(jFD{(R9X0+@)wO&wIEA8K>(pd9pU`-m? zYLgoj_Ffg|;-&}i#X+cdDsY+JQpir9|3EBm+|Hw_Whm<{6AwTV;9Ivx|LOvEUP2mq z=&tVl>$z>JXC|r0-^}*FZej-{DbX7l)?`QUuWPC+u_f8Yri;LS=c)+KfpO;FYM1#b zEH=ib8MtVpwUyquPFak$_~a*VAS0crn!`2E!bY2n==p&oB)%J3=e_%zgXj-Wj<75W zV@*T(<`yYCwUCG2#X{B7`Bay!sYzbq&OMV`&YhYsmpW{ozuPoF5LX<9r++o{|8T|w z|9;I{8Ga@~7SqZ+R#3J2aO?SUaTG6gK9q?j%5VrsOn5QI(lurYsZjWv6%{i31$N*r z1gMALTq<;n{-z2MiG5e zgUv}XYwN!(aigHJBJ7i_kiDO_oAvTfM3}adJlbn#C3Qs|d}JbLBlo3N*~iHo23_9~5-Joe!X8fqURYkRR{w!5%`xaK~LgR zw>=|UPq-lmI$}yx;+RjW*TH3D?9cKF)1XiC9iP#hB~@M_9QOI0_YLKpVE7Gbj^GPi zH~0DA19sk4Hz32^m`f$0F|GTSkV9QEIedd?X9q+GM1erJ0^J~W+N)e#-w^BmSeP=9 zigcY&0YjH)?(jK~2|pQ=UM>R>CJRV-Yis0^?NsBC@BA?kkQ}JI>wQrxGhsKRPfnT=8}E-n~C?+^E01oOHmT0+FM5a{!{tzptz&5?Lb^->l?WAt6}qp z@i+j2p|ebOy+4{8FW=sNQasyR@mo$SE^X@JKL{qS1VAtr0XzgFg^Y%+g45Ee`}1xt za4G+~kWYP%qyP3L+H|}DAqc+)zTcCY&LhffV%XqIS(_Vpq5BnK^Ntw0*4syEBIO~} zl2I6!+fE5%Bb6?WAysP$bpD!~|6b7z_^diI0{*;`Y=o!0VtYB{eGQ;V&$_iRggZZ- z?1cqySi4o|pcs}~wu*?l-KZXKGby4u9aD=3niA&0Zmg~R|D%?3k7xRi_qZZa?u5Bt zax2BmW$w4R&&~VR-5Am?dGEi+`ocsGT5OqMpdVhkVtcxGdyrT@ z&JoG$tW71scABOkfh#CA{v!7el{GeYx=F_F;TDhk?~HamqKJ%PWFKAk>>`b(j9>8v z!$y9jTY%;6!E$z;a2rhnoWs>q4lYK>%sFtd1QHJjKH)~`cNM<@DQx&xnwzqBXG`ehr z&&Hrb5&}chVqsmzPbR{a^iDl{-qt>azLA8=nS5&--w3}z@DRwxyK6{ ztkC#KWLbjZ%(!99j3l!}GXO>@tKwZVyO3+b;24Z}v1M;rz4(~RafK+($$j+Og70!K zhv4M)A!A$nk<(hd{-?Fv<9ib8dY5E&kFOF+x<~5?fA-Y#jZ&SOPHLbWns6(L?G+5| zDTzt`bYCQCW`Za~8x~k1J{bkp0iOEvlHj$ekOXuv6V8HKH?0~=EbEl zAcsLwdwJq0RS*GX39W+5j_LD!aDkdTpTw)&M8*%noD1WS--lZ1TO}vMoH3baxNWIjOc~UKqR69 zB3(VYivFzr^;-L08^=psh9ZfS#=zjm6*>$3@7KzfLLZao@eXzh$QLUL&|bZevsX{@ z9GhNHLRqFA&}%A-DZ*bI+U`h~$hy6ch)9b81u6U9olN%@ zTh!cOh@G-d&4_jAhc;_2Rvwcx8ck=&599Hj(+S#5=X-so8~G(_6sq`@3N6B(WtAmM zcFxSS`=ikL!CAUlP3V~sFTzQyIE9W^#%B>@BG8i!c7#)u7(;a4x`6`@qWbubMrx{? zO%WV_eV=Oe-pkO_oPKtv552Z-BsFFlkNh$lsQMs~J;j%xhHS5&w1y01Xf=ws=7smZ zFi3R7sA{}iCsabTMBhPw#Guh%+#uH^f8BrSKn6$0U)bhJBv;zNeOPLmtL6ntU|lta za@|IIVD!Zlw0FtK_t}~h3X;qatH8AQ@M~V$=@31Zjlt(k8NW%XSOfAwvMZ-Kq<4p4+ zzJHn{Khl?6aApw}As-uDWL^Q6iz#V0@a2MaH2XP!rfb4*?%~B_bK?(E;D>}fYmj!= z{zSMo4$O_;TZ4WNomN^D%+-Myob^?}2zW-B(wMl4JUjEw8CdbTM^}^}m>% z)aJ#tmIpAiQSlO)`E9mdZm_4a=aAaY{-Yr>oGi4H2 zXMcLRp_@A;r}dU_s-ov-FMmCuG?&XgWRXv!BN(;Ag0YyhMz@3y;WLQAJt)d3Io#Z& z=+hLYuI<1;>SqgK7`pu64{@HV?CM|MU1^dJ2VKrl*i0hhoti#(yPJ^^cM;sIM~5^3 z4;%6*? zFM3$i+s-pd*)iJkq8zZS3%C&w5BTAjCFh!Sgm>D*O=p;sEz8yw74BOhiO{GitI_uC z$?WkQ52VOTbiaxm&yESBNv{jxcG*v>qm!@>*W#M9I@gYpP$CNewxpNRu$ZEwS$A^c zhesfzfR`VAwRS{)PY>bo)800wQ0FZxGNuy*8Gqhq=a7()vP*b;kx`Xbp+v}6USB^H zC)8F@a!eobdW~z_66n+hwf9GoAw&I}-{vNnAd|d@I>b;Fu=aQAjOn&uKHyv-(>|M6 zCu*KhBMtfa^4C&%=O7W-8177i63?6asOVmYdzNXHn#V)y-)!A`=HIP4DT4$)e;9`>z5*maap#N%$E(=g@vge!4zr zak#XHj(4~QSCyR2Im-FtzAyMc4+p*LX2C@Phs*wNhf6f_MPrjfe?T4jDA@r15rDt!f0V-v z4Lb!58Li%g_4|X_97t6E=S`WxJdl0!3e*$TwLwo(ysCv`KXWckIQYH*;)At}|6Vup zEN4pu5;%&8gMZsvXObW(#A?$Mm9wq4rOdZ)$_MBGA;OThM;Y)a>;r$r`#%9-O%>Lx zbNdXCl;hLO=kvDDyS^3>Le-31fQknUy&_cjYokcnC6={PQYhW+uW^?iW5c_TFlk<2 z4FakUT(*Fth$_C1#&VSTWx7f_x!u>>cWkU_liP%F&1)3>+c@$wePns_{ zkag8FJ|5XgPf*8{hJ!s#WUVZ;+$tx#YKpBqj61!i52HgP2j#CbWVVbhIMmY#_EH;n z)+b%2IcnK;w<~QxL0V|3W!{3$?&jR_aoa6Zl9HHpqsf^G7Q&Q?XyivCSPwOCA4P(g zu(ZNO9M9H>5BgK`Om{~LpW1p24*vl`XUEudL&%#(uWA6nZ9o@9zWow+YsMNNHd(Hk zFU@=8NZ`(`ZZz*TT`HmgUGKYU(Hc!j+9lUmViPFlCRnL34&9SjiY2-obY}H|wc@`{ zR9kntWaL>*PZ)>9TZN;1{SiQa75to;U>J)Cs$;t-kIHoWGQb~;5QDs|j%4Mo0UOLN z6NZl}lK>jYLCa0kvjZ-LiZqUtP+Kw3EgE#$hc^_>8@myEjrQyzx z^~)O=JIU?x5$Htw9nht>>zs3+GXP531fcjAQ?58WF$vtFgiQ)`A{*HmL9G)%U~g*g zgEIJXUaU5hTWTO*T}b_HLKz?L?2-V|Qy=QVBcKfxcF>CDK$V$3(k}G`va`v;uc(Brpl!sknAUj|n2*TSm%)BsapT=n0Mq$O@gLYun=OWG?0jF861Q8#qAmSKBI zI;sq*=w~_%gLAD=1_ zH`8>eBX<=_uVQ%)k58n|G}@}#ScHQc&X9U~cGBr2kclq}zIVz8JZYt>q+B=i|GV`x zNVmIKu={$Z%at7!YxOQ2?kBEgi)58w#n9c7kdI zFNc1O&+^x4ksxFL*(8}Gzon>urdspk?rFiabWn8wc%C2n7bW#VyM!`)d1$Qa?+F+P z6g6m+5dxE6OvfI*U8f-dE$;?q=zBn{vT74ZxhlQ?h)~6DFnvV~S}9!_b|ijX!V18f zW+Z&8>h{6Cb_gZ(YwO{i26TXiKLLzKejV$ZC^#lS>a>`txXFQeEp=CUtupK&CWiK8 zi<)&eA7~}*2ISC~=Ck~u;WN7tIe#dVpJ)?+!5!6lkr(e7314lR2&4=xQ)yJGKrQ1# zz54=@4}2YbAa?%Fq;r^ng3` z_j0?g`Kp8TT@aPanV-o`FD@zJk}4dU1T zQzlUqd``Fv+!UXZ>b@p#VH&7vXYRV@-Cr;_cUTzYT8|R&;NlJ?Uwz-LntnCh2P@1MR8f|@Qc5Y5<8!X z|2|T}y>g(t^8tP?tN`_5{hiMaD57X`6eyYS4|5CZxJpoBomhw3e-q;smByF4jR>-h z#Gr-OqaE~TKqZ==FL#rok8ZQ~HbJ)^KSUR{l*NwjHG5a*=kNTT5MWj{_sUzm8ZNe^ zv{6Ayl$?K=I2IdinWNOPcUmK@n&K8}uM!)yTBY7o?ar&M@HmFTLzdxvGf!Ob-R^A7 z#qm1{n$rVToMUm1gbq{4BzFyYowBzr>iw4~<~fTjkuh z%0H|`8jA!s5Pl{*EE zaC(NmxB7-}Xq)EJvjwa9T&cJtwwWTtJXvX;n)1gDJ!)4b852Q3X;#hZW}#46lCoad z`yjo_bnIy9>$u{XdKZpH>~s!Sz&Fywz_9nA=Cx%n-@E#P1|K(jRjpW{C0H|b5*urC z6(`hs9Xxv*C6V_rgxEVB){w~x3p_WoutbRvpQryR9Q(o7w+%g2R}VK`>pdLw2FJhY z93FlzdF(Aj;&kBu4c~Lr)$k{0S1# z+hOO=9Tb2Zbwj#8KcFxEsCrw=8u$`(tyINRzXX&#aL;UB&KoIX*+p0LrSC*{h@W{z zmHi7ZJ;zoE_yN3hL|C;Sj6BKT+Kg!abIFL$g2V72yAXVu&qGD9e-%jg!DwP=DW85~ znE#vc2N%9UF@q=B!yjn*2xxq{WDn0G!dc%Fj%Ua^x-5wa%S|q5A8m4N&j}15sotaq zCsgP#qknEz=QoZ%LaGlcgvcg%E&Oa-@~4j{X{S`HN}vTHXChP;4$i3s;@#G$Amz61 z6KHehRuID=f2zpTE}v3QPup^zMA+V3$Xr1yBCw~HNp$%>63UYc@J;U3e7Cj-x43GY zc62h)9__&*@Uu(IUGKmOU+};kz~BZ&Q+(F=ygXRST<6?4o+kWUOcJwK7i7&yc3=GH zDR=<(fT<$zWW>`1M4RV(-z~gr z;fflXEPF^9Br31D1v76b;R`6WucV^-CqJ0Hd)FbtA*&NXMQ=`pwQQs8u|&OSTlan2P`-4%Je7Fna zK#tF=#l%IUy3Fh$o2Qh#a63;5Vqyk^<`+2Z^5Y_WfL2p+o#9pCT4r{@hlf7KA*piE z-qA1Mgz3$DL~RKT)OOMh4N0S^oy<5siTLOP$8L!*zG|hPj*0)d=xl9+sk0|_zqs;V zkY1s$Z9`TMVWiD0%*@HMh5bpYA3w~kmsTLIyCmHuev#4$ zc?*RW%aH0;=o?3vBvZ!&Ciqa`K~pp1zd0>#(Kf-U|FOS#IaJKo?F|dU9Nq&s2$AnA zUXUU{9s>;x0x1wm1I@hxmrqZBQgu=b$yg@AXJ7^UykjFeouK&6GRYx=Rs8S6FljX! ziUT(n8L${rK8KKTan2=jvL_TuEE{6kek`)+a_vgk?}H{!i@X`*N$E$DztyX?TMzaA zQLlK(y8G(Yk^EDvDW?2g266WTs4)jqQ`iyRhLTbZE#f0oLaQVR;@1RG|@StiAzvvjXH zW%jAti>%LRJSP)a%X+>F2*Z3?^e4jetEt`E?CtpQUW`ZHMjAn3jHroP4Xv^)yS?F5 zh!aqE{N$>xhDg9LVZ&00=O@(NU^XT6Ef}d+Ju6+>(>dee&g+szCA-zE*b^wvA1|5) za4SyWo;&iG6Rd-i8D6MqJgf(cMUbZXflmK zs_zLcfA3EoZc{RXf+<*tzardTzyf|ej$109u}9VFEje%KKGh^Z z8|KfdvE};-Xs70hTL@kFBsOmK!#aljXviwd8I13mt@IFo5iUBwg~%K^x!-01>S^b_$T717bAOIoEAcCGw*4A#`VyL zP5&xVJkF4p)&Oh5NC-8fyU6?)8oc63gIGn5HHZ&`goDCh(De=u`ro|Cz;aoLH+7E2FkE1$%{|;qI6zGjSaI#2}TsV&(Ap+J( z`(RLQ_MaD@o~XYH`}psR;Jr|3ML9>b0c~}E3g2F_-$nI?A;|$sTlPO-#sYRSxrDp! zfffAyh2Vu?U<3T`@0Pci=sCHC@pE!tde^%zNm;rkczPM>&*d)vvK@2T7m6-3^bPr`yVlNof7~6 literal 0 HcmV?d00001 diff --git a/wallet/how-to/add-network.md b/wallet/how-to/add-network.md index 312c4742ac6..582a27aa0eb 100644 --- a/wallet/how-to/add-network.md +++ b/wallet/how-to/add-network.md @@ -5,7 +5,7 @@ sidebar_position: 6 # Add a network -In some cases, such as when [interacting with smart contracts](interact-with-smart-contracts.md), +In some cases, such as when [interacting with smart contracts](interact-with-smart-contracts/index.md), your dapp must connect a user to a new network in MetaMask. Instead of the user [adding a new network manually](https://support.metamask.io/hc/en-us/articles/360043227612-How-to-add-a-custom-network-RPC#h_01G63GGJ83DGDRCS2ZWXM37CV5), which requires them to configure RPC URLs and chain IDs, your dapp can use the diff --git a/wallet/how-to/connect/set-up-sdk/gaming/unity.md b/wallet/how-to/connect/set-up-sdk/gaming/unity.md index 17cb5e3c774..44f1ecdd3b3 100644 --- a/wallet/how-to/connect/set-up-sdk/gaming/unity.md +++ b/wallet/how-to/connect/set-up-sdk/gaming/unity.md @@ -53,6 +53,26 @@ with it and its examples in the scene. You also need to install [TextMeshPro](https://docs.unity3d.com/Manual/com.unity.textmeshpro.html). If you don't have TextMeshPro installed, the Unity editor automatically prompts you to install it. +

+ +Unity SDK package structure +

+ +| File or directory | Contents | +| ------------------------ | ---------------------------------------------- | +| `Documentation` | Documentation and link to online documentation | +| `Editor` | Editor-only code such as Setup GUI windows, data persistence for SDK settings | +| `Plugins` | Plugins needed by the package (the ECIES Platform runtime libraries and core SDK Codebase) | +| `Runtime` | Main scripts for the SDK that are environment-agnostic, including the C# scripts that provide the base implementation of the SDK | +| `Samples` | Test application scene that can be used as a referral for your project, including modal popups and dynamic UI scaling | +| `LICENSE.md` | Package license | +| `Third Party Notices.md` | Third party notices | + + +

+ +
+ ### 3. Initialize MetaMask The main class you interface with is called `MetaMaskWallet`. @@ -128,7 +148,7 @@ void OnWalletAuthorized(object sender, EventArgs e) { } ``` -You can call any Ethereum request on the wallet using `wallet.Request(myRequest)`. +You can call any [JSON-RPC API method](/wallet/reference/eth_subscribe) using `wallet.Request(myRequest)`. The following is a sample transaction request: ```csharp @@ -148,6 +168,11 @@ var request = new MetaMaskEthereumRequest await wallet.Request(request); ``` +:::note +See the [Unity SDK API reference](../../../../reference/sdk-unity-api.md) for an overview of the +API methods from the most important classes. +::: + ### 6. Configure MetaMask You can customize the default configuration or create your own configuration. @@ -163,83 +188,6 @@ Create a new configuration by right-clicking on the project window and navigatin **MetaMask > Config**. Name the new configuration and use it when initializing the `MetaMaskUnity` instance. -## API - -The following is an overview of the APIs from the most important classes. - -### MetaMaskUnity - -This is a singleton class that you can use to access the `MetaMaskWallet` instance, which is -specific to Unity. - -#### `Instance` - -This is the singleton instance of the `MetaMaskUnity` class that is lazy-loaded when you access it -for the first time. - -#### `Initialize` - -This method initializes the `MetaMaskWallet` instance and makes it accessible via the `Wallet` property. -You can also pass extra options and parameters to it to customize the wallet instance: - -```csharp -// Initialize using default settings -MetaMaskUnity.Instance.Initialize(); - -// Initialize using custom transport and socket provider -var transport = new MyCustomTransport(); -var socketProvider = new MyCustomSocketProvider(); -MetaMaskUnity.Instance.Initialize(transport, socketProvider); - -// Initialize using custom config, transport and socket provider -var config = myMetaMaskConfig; -var transport = new MyCustomTransport(); -var socketProvider = new MyCustomSocketProvider(); -MetaMaskUnity.Instance.Initialize(config, transport, socketProvider); -``` - -#### `SaveSession` - -This method saves the current session to the persistent storage. -This is useful when you want to save the session and restore it later. -This is automatically called when the application quits, but you can also manually call it. - -#### `LoadSession` - -This method loads the session from the persistent storage. -This is useful when you want to restore the session after the application quits. -This is automatically called when the application starts, but you can also manually call it. - -### MetaMaskWallet - -#### `Connect` - -This method connects to the MetaMask app. -It renders a generated QR code in the user interface for your users to scan with MetaMask Mobile. -After the user scans this QR code, a connect screen appears in MetaMask Mobile where the user can -approve the connection with your game application. - -#### `Disconnect` - -This method disconnects the user that is connected from the MetaMask app session. - -#### `Request` - -This method sends a request to MetaMask. -You can use it to call any [provider API method](../../../../reference/provider-api.md). - -## Package structure - -| File or directory | Contents | -| ------------------------ | ---------------------------------------------- | -| `Documentation` | Documentation and link to online documentation | -| `Editor` | Editor-only code such as Setup GUI windows, data persistence for SDK settings | -| `Plugins` | Plugins needed by the package (the ECIES Platform runtime libraries and core SDK Codebase) | -| `Runtime` | Main scripts for the SDK that are environment-agnostic, including the C# scripts that provide the base implementation of the SDK | -| `Samples` | Test application scene that can be used as a referral for your project, including modal popups and dynamic UI scaling | -| `LICENSE.md` | Package license | -| `Third Party Notices.md` | Third party notices | - ## FAQS
@@ -287,3 +235,8 @@ take longer to build at compile time. The SDK is filled with precompiled libraries to save on runtime compilation.
+ +## Next steps + +Once you have the MetaMask Unity SDK set up, you can +[interact with smart contracts](../../../interact-with-smart-contracts/unity/index.md) from your Unity game. diff --git a/wallet/how-to/interact-with-smart-contracts.md b/wallet/how-to/interact-with-smart-contracts/index.md similarity index 94% rename from wallet/how-to/interact-with-smart-contracts.md rename to wallet/how-to/interact-with-smart-contracts/index.md index 53cdba5f06b..e096ed54c0f 100644 --- a/wallet/how-to/interact-with-smart-contracts.md +++ b/wallet/how-to/interact-with-smart-contracts/index.md @@ -5,6 +5,10 @@ sidebar_position: 5 # Interact with smart contracts +This is a high-level overview of how to interact with smart contracts. +You can also see how to +[interact with smart contracts from your Unity game](unity/index.md). + To interact with a smart contract, your dapp needs the following information: - [Contract network](#contract-network) diff --git a/wallet/how-to/interact-with-smart-contracts/unity/contract-factory.md b/wallet/how-to/interact-with-smart-contracts/unity/contract-factory.md new file mode 100644 index 00000000000..c3805959759 --- /dev/null +++ b/wallet/how-to/interact-with-smart-contracts/unity/contract-factory.md @@ -0,0 +1,91 @@ +--- +sidebar_position: 2 +--- + +# Contract factory + +When [interacting with smart contracts in Unity](index.md), the contract factory is responsible for +creating the [contract proxy class](contract-proxy-class.md) with the given +[contract interface](contract-interface.md) type `T`. + +## Contract factory types + +### Impromptu contract factory + +The impromptu contract factory uses the `Impromptu` library to return a new instance of `Contract` +that behaves likes the given interface type `T`. +Since the contract is a dynamic object, all method invocations to the returned object of type `T` +are automatically routed to the `Contract` class. + +:::note +The impromptu contract factory is only supported on Mono or in a runtime that has the CLR. +The IL2CPP runtime does not support this factory. +Use the backed type contract factory if you need a more concrete type. +::: + +### Backed type contract factory + +The backed type contract factory uses a concrete `class` type that inherits the `Contract` class and +the given interface type `T`. +To use this factory, the given interface must declare the class attribute `BackedType` +that specifies which concrete `class` type must be used when creating a new `Contract` instance. +The declared `class` must inherit from the given interface type `T`. + +```csharp +[BackedType(typeof(ERC20Backing))] +public interface ERC20 : IContract +{ + [EvmMethodInfo(Name = "decimals", View = true)] + [return: EvmParameterInfo(Type = "uint8")] + Task Decimals(); + + // TODO Define other interface methods +} +``` + +Inside the backed `class`, you must override all interface methods and either invoke custom logic or +use the `Contract` class to automatically perform the correct logic based on the method data. +You can use `var method = System.Reflection.MethodBase.GetCurrentMethod();` to get the current +method being invoked, and then you can use `base.InvokeMethod(MethodInfo method, object[] args)` to +invoke the correct logic for the given `method` and `args`. + +```csharp +public class ERC20Backing : Contract, ERC20 +{ + public string Address + { + get => base.Address; + } + + [EvmMethodInfo(Name = "decimals", View = true)] + [return: EvmParameterInfo(Type = "uint8")] + public Task Decimals() + { + var method = System.Reflection.MethodBase.GetCurrentMethod(); + return (Task) InvokeMethod(method, new object[] { }); + } + + // TODO Define other interface methods +} +``` + +The [contract code generator](index.md#generate-contract-code) automatically generates a backing +`class` for each contract interface generated. + +This contract factory is useful for when you need more concrete definitions of the contract +interface type `T`. +This can be useful in runtimes where `dynamic` or `DynamicObject` are not available (IL2CPP). + +## Set the contract factory + +To set the current contract factory, you can use `Contract.ContractFactory`: + +```csharp +Contract.ContractFactory = new BackedTypeContractFactory(); +``` + +Usually, you will never need to do this, unless you are creating a custom contract factory. +You should use the default contract factories for each runtime: + +- Mono runtime - [Impromptu contract factory](#impromptu-contract-factory) +- IL2CPP runtime - [Backed typed contract factory](#backed-type-contract-factory) diff --git a/wallet/how-to/interact-with-smart-contracts/unity/contract-interface.md b/wallet/how-to/interact-with-smart-contracts/unity/contract-interface.md new file mode 100644 index 00000000000..8a9a0b24035 --- /dev/null +++ b/wallet/how-to/interact-with-smart-contracts/unity/contract-interface.md @@ -0,0 +1,150 @@ +--- +sidebar_position: 1 +--- + +# Contract interface + +When [interacting with smart contracts in Unity](index.md), the `IContract` interface defines an +interface of a given contract. +This interface includes all the functions of the contract, and optionally includes a constructor +function and `Bytecode` field. + +You can use the [contract code generator](index.md#generate-contract-code) to generate a contract +interface given a contract ABI or Truffle artifact JSON file. + +To manually create a new contract interface, you must define a new interface that inherits from `IContract`. +You may optionally declare the [`BackedType` attribute](contract-factory.md#backed-type-contract-factory). + +```csharp +#if UNITY_EDITOR || !ENABLE_MONO +[BackedType(typeof(ERC20Backing))] +#endif +public interface ERC20 : IContract +{ + // TODO Declare functions +} +``` + +## Declare contract functions + +To declare a `view` or `pure` function of the contract, first set the return type, the function name +(may differ from the actual name), and all parameters the function takes in a `Task`: + +```csharp +#if UNITY_EDITOR || !ENABLE_MONO +[BackedType(typeof(ERC20Backing))] +#endif +public interface ERC20 : IContract +{ + Task BalanceOf(EvmAddress account); +} +``` + +Once you have the function written, simply add the `EvmMethodInfo` at the top of the function to +declare the metadata about the contract function. +This includes the `Name` and whether it's a `View` function: + +```csharp +#if UNITY_EDITOR || !ENABLE_MONO +[BackedType(typeof(ERC20Backing))] +#endif +public interface ERC20 : IContract +{ + [EvmMethodInfo(Name = "balanceOf", View = true)] + Task BalanceOf(EvmAddress account); +} +``` + +To define the EVM type for a parameter, you can use the `EvmParameterInfo` attribute. +However, this usually isn't needed, because the `Contract` class automatically infers most common +types, such as `EvmAddress` to be `address` and `string` to be `string`. + +```csharp +#if UNITY_EDITOR || !ENABLE_MONO +[BackedType(typeof(ERC20Backing))] +#endif +public interface ERC20 : IContract +{ + [EvmMethodInfo(Name = "balanceOf", View = true)] + Task BalanceOf([EvmParameterInfo(Type = "address")] string account); +} +``` + +To define the EVM return type for the function, you can use `EvmParamterInfo` on the return type: + +```csharp +#if UNITY_EDITOR || !ENABLE_MONO +[BackedType(typeof(ERC20Backing))] +#endif +public interface ERC20 : IContract +{ + [EvmMethodInfo(Name = "balanceOf", View = true)] + Task BalanceOf(EvmAddress account); + + [EvmMethodInfo(Name = "decimals", View = true)] + [return: EvmParameterInfo(Type = "uint8")] + Task Decimals(); +} +``` + +### Use the Task return type + +It's recommend to always use `Task` as the return type when declaring contract functions, even if +the given [provider](contract-provider.md) does not use `Task`. +When you don't use `Task`, the `Contract` class is blocked until a response from the given +`Provider` is received. +This means if the `Provider` returns a `Task` of the request, the `Contract` class is blocked until +that `Task` completes, which may lead to a deadlock. + +### Define a contract constructor + +To define a constructor function, use the `EvmConstructorMethod` attribute at the top of the +function declaring the constructor. +The return type of the function must be the type of the interface, since a new instance of the +interface is returned by the `Contract` class. + +You must also do one of the following: + +- Declare a `static readonly string Bytecode` in the interface that has the bytecode. + + ```csharp + #if UNITY_EDITOR || !ENABLE_MONO + [BackedType(typeof(ERC20Backing))] + #endif + public interface ERC20 : IContract + { + public static readonly string Bytecode = "0x6080604052348015620000115760008...."; + + [EvmConstructorMethod] + Task DeployNew(String name_, String symbol_); + + [EvmMethodInfo(Name = "balanceOf", View = true)] + Task BalanceOf(EvmAddress account); + + [EvmMethodInfo(Name = "decimals", View = true)] + [return: EvmParameterInfo(Type = "uint8")] + Task Decimals(); + } + ``` + +- Set the `Bytecode` field in the `EvmConstructorMethod` attribute. + + ```csharp + #if UNITY_EDITOR || !ENABLE_MONO + [BackedType(typeof(ERC20Backing))] + #endif + public interface ERC20 : IContract + { + [EvmConstructorMethod(Bytecode = "0x608060405238....")] + Task DeployNew(String name_, String symbol_); + + [EvmMethodInfo(Name = "balanceOf", View = true)] + Task BalanceOf(EvmAddress account); + + [EvmMethodInfo(Name = "decimals", View = true)] + [return: EvmParameterInfo(Type = "uint8")] + Task Decimals(); + } + ``` + +By default, the [contract code generator](index.md#generate-contract-code) uses the second option. diff --git a/wallet/how-to/interact-with-smart-contracts/unity/contract-provider.md b/wallet/how-to/interact-with-smart-contracts/unity/contract-provider.md new file mode 100644 index 00000000000..aa0509073fa --- /dev/null +++ b/wallet/how-to/interact-with-smart-contracts/unity/contract-provider.md @@ -0,0 +1,78 @@ +--- +sidebar_position: 4 +--- + +# Contract provider + +When [interacting with smart contracts in Unity](index.md), the provider is similar to a JavaScript +provider. +The provider is responsible for sending the request formed inside the +[contract proxy class](contract-proxy-class.md) to the blockchain RPC node and optionally decoding +the response. +If the provider doesn't decode the response, then it's considered an [`ILegacyProvider`](#ilegacyprovider). + +## IProvider + +The `IProvider` interface defines the following function: + +```csharp +Task Request(string method, object[] parameters = null); +``` + +This function must send a JSON-RPC request with the given method and parameters. +It must decode the JSON-RPC result response into the type `TR`. + +The `IProvider` must also define two additional properties: + +```csharp +long ChainId { get; } // The current chain ID the provider is connected to + +string ConnectedAddress { get; } // The current address connected to the provider +``` + +For backwards compatibility, the `ILegacyProvider` function is also defined: + +```csharp +object Request(string method, object[] parameters = null); +``` + +To easily support this function, use `Request`: + +```csharp +public object Request(string method, object[] parameters = null) +{ + return this.Request(method, parameters); +} +``` + +## ILegacyProvider + +The `ILegacyProvider` is an interface that declares an interface that does not support response decoding. +The `ILegacyProvider` interface defines the following function: + +```csharp +object Request(string method, object[] parameters = null); +``` + +This function must send a JSON-RPC request with the given method and parameters. +It should decode the response, but it's not required. +It may return any of the following: + +- The response as a JSON string +- The response as a JSON string, wrapped in a `Task` +- The response decoded into some object +- The response decoded into some object, wrapped in a `Task` + +If the function returns a JSON string, then the `Contract` class attempts to deserialize the JSON +string into the desired type. +If it returns any other object type, the `Contract` class attempts to convert to the desired type by +first serializing the object into JSON, then deserializing the JSON back into the desired type. +The desired type is defined in the [contract interface](contract-interface.md) used. + +The `ILegacyProvider` must also define two additional properties: + +```csharp +long ChainId { get; } // The current chain ID the provider is connected to + +string ConnectedAddress { get; } // The current address connected to the provider +``` diff --git a/wallet/how-to/interact-with-smart-contracts/unity/contract-proxy-class.md b/wallet/how-to/interact-with-smart-contracts/unity/contract-proxy-class.md new file mode 100644 index 00000000000..7f9a52e1b15 --- /dev/null +++ b/wallet/how-to/interact-with-smart-contracts/unity/contract-proxy-class.md @@ -0,0 +1,30 @@ +--- +sidebar_position: 3 +--- + +# Contract proxy class + +When [interacting with smart contracts in Unity](index.md), the contract proxy class is responsible +for performing: + +- Transaction serialization +- Transaction execution +- Transaction result deserialization + +The contract proxy class is also responsible for invoking the [provider](contract-provider.md) and attempts +to support both asynchronous and synchronous provider objects. + +Since the proxy class is responsible for a lot, some parts of the class may be decoupled into their +own components. +For example, transaction serialization and deserialization is not very customizable and will likely +be moved into its own component to allow more extendability. + +:::caution important +The contract proxy class should be considered an internal and unstable API. +You should never need to inherit the `Contract` class, unless you're using the +[backed type contract factory](contract-factory.md#backed-type-contract-factory). +However, the [contract code generator](index.md#generate-contract-code) already generates these +classes for you. + +You only need to use `Contract.Attach(string address, IProvider provider)`. +::: diff --git a/wallet/how-to/interact-with-smart-contracts/unity/index.md b/wallet/how-to/interact-with-smart-contracts/unity/index.md new file mode 100644 index 00000000000..ee7123e28cf --- /dev/null +++ b/wallet/how-to/interact-with-smart-contracts/unity/index.md @@ -0,0 +1,124 @@ +--- +sidebar_position: 1 +--- + +# Interact with smart contracts in Unity + +You can interact with smart contracts from your Unity game with MetaMask SDK installed. + +## Prerequisites + +- [MetaMask SDK set up](../../connect/set-up-sdk/gaming/unity.md) in your Unity game +- A [contract ABI](../index.md#contract-abi) JSON file or Truffle artifact JSON file + +## Generate contract code + +You can use the MetaMask Unity contract code generator to generate +[contract interface](contract-interface.md) files. +The code generator automatically generates backed types for all contract interfaces to be used by +the [contract factory](contract-factory.md#backed-type-contract-factory). + +In your Unity editor, go to **Tools > MetaMask > Contract ABI Converter**. +This opens a new dialog box: + +

+ +![dialog](../../../assets/contract-abi-converter-dialog.png) + +

+ +Paste your contract ABI JSON file or Truffle build artifact JSON file. +If you plan to deploy your contract, you must provide a Truffle build artifact JSON, since this +has the required [contract bytecode](../index.md#contract-bytecode) needed for deployment. + +You can also specify the `Root Namespace` for the generated contract code. +The default value is `Contracts`, so make sure to add `using Contracts;` at the top of your scripts +before using the generated code. + +Select **Convert**, which opens a save dialog box. +Select a folder to save the generated code files to, somewhere inside the `Assets` folder. + +## Use the contract + +After generating the contract code, you can use the contract using the +`Contract.Attach(...)` function. + +This function takes a type `T` which must be the interface type of the contract to use. +This function returns that type `T`. + +You must provide the `address` string the contract should be loaded from, and the +[provider](../../../concepts/sdk/unity-contract-interaction.md#provider) to use to interact with the contract. +Usually, the provider is `MetaMaskUnity.Instance.Wallet`. + +The following is an example of using a contract: + +```csharp +public async void Start() +{ + var metaMask = MetaMaskUnity.Instance.Wallet; + var address = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"; + + ERC20 usdc = Contract.Attach(address, metaMask); +} +``` + +Once you have an instance of your contract interface of type `T` (in this example, `ERC20`), you may +invoke any function inside the interface type. +For example: + +```csharp +public async void Start() +{ + // ... setup ... + + var balance = await usdc.BalanceOf(metaMask.SelectedAddress); + Debug.Log(balance); +} +``` + +### Use contract templates + +The MetaMask Unity SDK offers several contract templates that you can create and manage inside the +Unity editor. +These templates are scriptable objects, so you can configure them once inside the editor and use +them throughout your scripts. +These templates automatically perform the `Contract.Attach` function for you and automatically +switch contract addresses when the network changes. + +You can create a new template by going to **Assets > Create > MetaMask > Contract Templates** and +selecting one of the following: + +- **ERC20** +- **ERC721** +- **ERC1155** + +Before using the contract template, you must configure the contract address to use for each chain: + +

+ +![empty template](../../../assets/unity-empty-template.png) + +

+ +Select **+** to add a new address/chain pair. +When adding a new address, if you don't see your desired blockchain listed, you can modify the +`ScriptableContract.ChainId` enum to include your chain and chain ID. + +

+ +![full template](../../../assets/unity-example-template.png) + +

+ +Once configured, you can use this scriptable object as a variable inside your scripts. +The contract template has the same interface and usage as if you used `Contract.Attach`, but the +setup and network switching is done for you. + +## Advanced topics + +To learn more about and customize your contract interactions using the Unity SDK, see the following topics: + +- [Contract interface](contract-interface.md) +- [Contract factory](contract-factory.md) +- [Contract proxy class](contract-proxy-class.md) +- [Provider](contract-provider.md) diff --git a/wallet/index.md b/wallet/index.md index 39830a76f17..f530c7d6587 100644 --- a/wallet/index.md +++ b/wallet/index.md @@ -47,7 +47,7 @@ functions, including: - [Sign data](how-to/sign-data) - [Display tokens, contract methods, and icons in MetaMask](how-to/display) -- [Interact with smart contracts](how-to/interact-with-smart-contracts.md) +- [Interact with smart contracts](how-to/interact-with-smart-contracts/index.md) - [Access a user's MetaMask provider](how-to/access-provider.md) ## Questions? diff --git a/wallet/reference/provider-api.md b/wallet/reference/provider-api.md index 2fc096ccf36..1f38027b6c5 100644 --- a/wallet/reference/provider-api.md +++ b/wallet/reference/provider-api.md @@ -1,6 +1,6 @@ --- description: MetaMask Ethereum provider API reference -sidebar_position: 2 +sidebar_position: 3 --- # Ethereum provider API diff --git a/wallet/reference/rpc-api.md b/wallet/reference/rpc-api.md index e2fd9ecc3ec..a84360d4aee 100644 --- a/wallet/reference/rpc-api.md +++ b/wallet/reference/rpc-api.md @@ -1,6 +1,6 @@ --- description: MetaMask Ethereum JSON-RPC API reference -sidebar_position: 3 +sidebar_position: 4 toc_max_heading_level: 2 --- diff --git a/wallet/reference/sdk-unity-api.md b/wallet/reference/sdk-unity-api.md new file mode 100644 index 00000000000..eb159b9e3b8 --- /dev/null +++ b/wallet/reference/sdk-unity-api.md @@ -0,0 +1,69 @@ +--- +description: Unity SDK API reference +sidebar_position: 2 +--- + +# Unity SDK API + +The following is an overview of the API methods used in the [Unity SDK](../how-to/connect/set-up-sdk/gaming/unity.md). + +## MetaMaskUnity + +This is a singleton class that you can use to access the `MetaMaskWallet` instance, which is +specific to Unity. + +### Instance + +This is the singleton instance of the `MetaMaskUnity` class that is lazy-loaded when you access it +for the first time. + +### Initialize + +This method initializes the `MetaMaskWallet` instance and makes it accessible via the `Wallet` property. +You can also pass extra options and parameters to it to customize the wallet instance: + +```csharp +// Initialize using default settings +MetaMaskUnity.Instance.Initialize(); + +// Initialize using custom transport and socket provider +var transport = new MyCustomTransport(); +var socketProvider = new MyCustomSocketProvider(); +MetaMaskUnity.Instance.Initialize(transport, socketProvider); + +// Initialize using custom config, transport and socket provider +var config = myMetaMaskConfig; +var transport = new MyCustomTransport(); +var socketProvider = new MyCustomSocketProvider(); +MetaMaskUnity.Instance.Initialize(config, transport, socketProvider); +``` + +### SaveSession + +This method saves the current session to the persistent storage. +This is useful when you want to save the session and restore it later. +This is automatically called when the application quits, but you can also manually call it. + +### LoadSession + +This method loads the session from the persistent storage. +This is useful when you want to restore the session after the application quits. +This is automatically called when the application starts, but you can also manually call it. + +## MetaMaskWallet + +### Connect + +This method connects to the MetaMask app. +It renders a generated QR code in the user interface for your users to scan with MetaMask Mobile. +After the user scans this QR code, a connect screen appears in MetaMask Mobile where the user can +approve the connection with your game application. + +### Disconnect + +This method disconnects the user that is connected from the MetaMask app session. + +### Request + +This method sends a request to MetaMask. +You can use it to call any [provider API method](../../../../reference/provider-api.md). \ No newline at end of file From a5308571936c4df739553779a00047045b150df0 Mon Sep 17 00:00:00 2001 From: Alexandra Tran Date: Thu, 14 Sep 2023 23:21:06 -0700 Subject: [PATCH 2/5] link fixes --- wallet/how-to/interact-with-smart-contracts/unity/index.md | 2 +- wallet/reference/sdk-unity-api.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/wallet/how-to/interact-with-smart-contracts/unity/index.md b/wallet/how-to/interact-with-smart-contracts/unity/index.md index ee7123e28cf..ddac47d791c 100644 --- a/wallet/how-to/interact-with-smart-contracts/unity/index.md +++ b/wallet/how-to/interact-with-smart-contracts/unity/index.md @@ -47,7 +47,7 @@ This function takes a type `T` which must be the interface type of the contract This function returns that type `T`. You must provide the `address` string the contract should be loaded from, and the -[provider](../../../concepts/sdk/unity-contract-interaction.md#provider) to use to interact with the contract. +[provider](contract-provider.md) to use to interact with the contract. Usually, the provider is `MetaMaskUnity.Instance.Wallet`. The following is an example of using a contract: diff --git a/wallet/reference/sdk-unity-api.md b/wallet/reference/sdk-unity-api.md index eb159b9e3b8..757b4a886f7 100644 --- a/wallet/reference/sdk-unity-api.md +++ b/wallet/reference/sdk-unity-api.md @@ -66,4 +66,4 @@ This method disconnects the user that is connected from the MetaMask app session ### Request This method sends a request to MetaMask. -You can use it to call any [provider API method](../../../../reference/provider-api.md). \ No newline at end of file +You can use it to call any [provider API method](provider-api.md). From 70febe14a38ae628f5b8aee27c27b20a67fddfa6 Mon Sep 17 00:00:00 2001 From: Alexandra Tran Date: Thu, 14 Sep 2023 23:35:58 -0700 Subject: [PATCH 3/5] Truffle -> Hardhat --- .../how-to/interact-with-smart-contracts/unity/index.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/wallet/how-to/interact-with-smart-contracts/unity/index.md b/wallet/how-to/interact-with-smart-contracts/unity/index.md index ddac47d791c..73b6dcb7643 100644 --- a/wallet/how-to/interact-with-smart-contracts/unity/index.md +++ b/wallet/how-to/interact-with-smart-contracts/unity/index.md @@ -9,7 +9,9 @@ You can interact with smart contracts from your Unity game with MetaMask SDK ins ## Prerequisites - [MetaMask SDK set up](../../connect/set-up-sdk/gaming/unity.md) in your Unity game -- A [contract ABI](../index.md#contract-abi) JSON file or Truffle artifact JSON file +- A [contract ABI](../index.md#contract-abi) JSON file or + [Hardhat artifact](https://hardhat.org/hardhat-runner/docs/advanced/artifacts#compilation-artifacts) + JSON file ## Generate contract code @@ -27,8 +29,8 @@ This opens a new dialog box:

-Paste your contract ABI JSON file or Truffle build artifact JSON file. -If you plan to deploy your contract, you must provide a Truffle build artifact JSON, since this +Paste your contract ABI JSON file or Hardhat artifact JSON file. +If you plan to deploy your contract, you must provide a Hardhat artifact, since this has the required [contract bytecode](../index.md#contract-bytecode) needed for deployment. You can also specify the `Root Namespace` for the generated contract code. From 0f7fcd989baf95ec180abe953dae0501d67c7b7c Mon Sep 17 00:00:00 2001 From: Alexandra Tran Date: Fri, 15 Sep 2023 09:17:38 -0700 Subject: [PATCH 4/5] minor fixes --- .../interact-with-smart-contracts/unity/contract-interface.md | 2 +- wallet/how-to/interact-with-smart-contracts/unity/index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/wallet/how-to/interact-with-smart-contracts/unity/contract-interface.md b/wallet/how-to/interact-with-smart-contracts/unity/contract-interface.md index 8a9a0b24035..ef0523eafdb 100644 --- a/wallet/how-to/interact-with-smart-contracts/unity/contract-interface.md +++ b/wallet/how-to/interact-with-smart-contracts/unity/contract-interface.md @@ -10,7 +10,7 @@ This interface includes all the functions of the contract, and optionally includ function and `Bytecode` field. You can use the [contract code generator](index.md#generate-contract-code) to generate a contract -interface given a contract ABI or Truffle artifact JSON file. +interface given a contract ABI or Hardhat artifact JSON file. To manually create a new contract interface, you must define a new interface that inherits from `IContract`. You may optionally declare the [`BackedType` attribute](contract-factory.md#backed-type-contract-factory). diff --git a/wallet/how-to/interact-with-smart-contracts/unity/index.md b/wallet/how-to/interact-with-smart-contracts/unity/index.md index 73b6dcb7643..d584e001337 100644 --- a/wallet/how-to/interact-with-smart-contracts/unity/index.md +++ b/wallet/how-to/interact-with-smart-contracts/unity/index.md @@ -123,4 +123,4 @@ To learn more about and customize your contract interactions using the Unity SDK - [Contract interface](contract-interface.md) - [Contract factory](contract-factory.md) - [Contract proxy class](contract-proxy-class.md) -- [Provider](contract-provider.md) +- [Contract provider](contract-provider.md) From 3b19958caf9afa068d94cd69caa52c5d26b9fd66 Mon Sep 17 00:00:00 2001 From: Alexandra Tran Date: Fri, 15 Sep 2023 13:26:27 -0700 Subject: [PATCH 5/5] address reviewer feedback --- .../assets/contract-abi-converter-dialog.png | Bin 20753 -> 24152 bytes .../unity/contract-factory.md | 4 ++-- .../unity/contract-interface.md | 12 +++++----- .../unity/index.md | 4 ++-- wallet/reference/sdk-unity-api.md | 22 ++++++++++-------- 5 files changed, 22 insertions(+), 20 deletions(-) diff --git a/wallet/assets/contract-abi-converter-dialog.png b/wallet/assets/contract-abi-converter-dialog.png index 5ad5e1b3cd391ed0b13e4e194f9fc7620fe20359..521b9001072895d2fc37e1929274416bbff7c890 100644 GIT binary patch literal 24152 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 literal 20753 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 MetaMask > Contract ABI Converter**. -This opens a new dialog box: +A new dialog box opens:

@@ -94,7 +94,7 @@ selecting one of the following: - **ERC721** - **ERC1155** -Before using the contract template, you must configure the contract address to use for each chain: +Before using the contract template, configure the contract address to use for each chain:

diff --git a/wallet/reference/sdk-unity-api.md b/wallet/reference/sdk-unity-api.md index 757b4a886f7..8b4aadd7cec 100644 --- a/wallet/reference/sdk-unity-api.md +++ b/wallet/reference/sdk-unity-api.md @@ -40,28 +40,30 @@ MetaMaskUnity.Instance.Initialize(config, transport, socketProvider); ### SaveSession -This method saves the current session to the persistent storage. -This is useful when you want to save the session and restore it later. -This is automatically called when the application quits, but you can also manually call it. +This method saves the current session to persistent storage. +It is useful when you want to save the session and restore it later. +When the application starts, it automatically calls this method. +You can also manually call this method. ### LoadSession -This method loads the session from the persistent storage. -This is useful when you want to restore the session after the application quits. -This is automatically called when the application starts, but you can also manually call it. +This method loads the session from persistent storage. +It is useful when you want to restore the session after the application quits. +When the application starts, it automatically calls this method. +You can also manually call this method. ## MetaMaskWallet ### Connect -This method connects to the MetaMask app. +This method connects to MetaMask. It renders a generated QR code in the user interface for your users to scan with MetaMask Mobile. -After the user scans this QR code, a connect screen appears in MetaMask Mobile where the user can -approve the connection with your game application. +After the user scans this QR code, a connection screen appears in MetaMask Mobile where the user can +approve the connection with your Unity game. ### Disconnect -This method disconnects the user that is connected from the MetaMask app session. +This method disconnects the user from the MetaMask session. ### Request