From 0edb329f4ca7bbabb264321ef026cd9f17f79c3f Mon Sep 17 00:00:00 2001 From: canguruhh Date: Tue, 8 Oct 2019 12:49:21 +0800 Subject: [PATCH 01/14] Theming for standalone github pages --- README.md | 13 ++--- _config.yml | 3 +- _layouts/default.html | 51 +++++++++++++++++++ tutorials/1-Metaverse-Wallet/README.md | 15 ++++-- tutorials/2-Avatars-and-MSTs/README.md | 9 ++-- tutorials/3-MITs/README.md | 12 ++++- .../tutorial.md | 0 7 files changed, 83 insertions(+), 20 deletions(-) create mode 100644 _layouts/default.html rename tutorials/{4-commaindline => 4-commandline}/tutorial.md (100%) diff --git a/README.md b/README.md index 2f313bc..a7b558b 100644 --- a/README.md +++ b/README.md @@ -48,14 +48,9 @@ These tutorials are designed * each tutorial comes with complete solutions to show you how its done in the end. Don't look till you're done! -1 - Integrate metaverse wallet into your dapp with your DID -2 - Issue and transfer MST’s -3 - Issue and transfer MIT’s -4 - learn the metaverse command line -5 - create metaverse wallet plugin -6 - execute coin swaps -7 - create multisig transactions -8 - understanding Metaverse MIPs +1. [Integrate Metaverse wallet into your dapp with your DID](tutorials/1-Metaverse-Wallet) +2. [Issue and transfer MST’s](tutorials/2-Avatars-and-MSTs) +3. [Issue and transfer MIT’s](tutorials/3-MITs) For more information refer to the [Metaverse Documentation](https://docs.mvs.org/docs/) @@ -159,4 +154,4 @@ Metaverse You should see the "blockchain" (from mvs-blockchain-js) and Metaverse (from metaversjs) objects show up in the console. -You should now be fully set up and ready to begin tutorial 1. +You should now be fully set up and ready to begin [tutorial 1](tutorials/1-Metaverse-Wallet). diff --git a/_config.yml b/_config.yml index c419263..0877766 100644 --- a/_config.yml +++ b/_config.yml @@ -1 +1,2 @@ -theme: jekyll-theme-cayman \ No newline at end of file +theme: jekyll-theme-minimal +logo: https://app.myetpwallet.com/assets/logo.png \ No newline at end of file diff --git a/_layouts/default.html b/_layouts/default.html new file mode 100644 index 0000000..64f7569 --- /dev/null +++ b/_layouts/default.html @@ -0,0 +1,51 @@ + + + + + + + + + + + +
+
+ {% if site.logo %} + Logo +

+ {% endif %} + +

Home

+

Tutorial 1Create Wallet

+

Tutorial 2Avatars and Smart Token

+

Tutorial 3Identifiable Token

+ +
+
+ + {{ content }} + +
+ +
+ + {% if site.google_analytics %} + + {% endif %} + + \ No newline at end of file diff --git a/tutorials/1-Metaverse-Wallet/README.md b/tutorials/1-Metaverse-Wallet/README.md index df8debb..acc2b14 100644 --- a/tutorials/1-Metaverse-Wallet/README.md +++ b/tutorials/1-Metaverse-Wallet/README.md @@ -1,3 +1,5 @@ +# Tutorial 1 - Metaverse Wallet + In this tutorial you will learn how to * Create a Metaverse wallet @@ -6,7 +8,7 @@ In this tutorial you will learn how to * Send transactions programatically * Integrate wallet into your dApp -### Introduction +## Introduction Metaverse is a UTXO based blockchain @@ -24,7 +26,7 @@ For more information on UTXO's look here https://komodoplatform.com/whats-utxo/ In Metaverse, as with Bitcoin, you can generate deterministic wallets using by memnonic code words. This gives you multiple addresses you can send and recieve transactions from. -### Hands on Tutorial +## Hands on Tutorial Note: Explicit detailed instructions are given to work with Metaverse, but not always so with HTML elements. If you get stuck with coding HTML elements, you can always refer to w3schools.com @@ -41,7 +43,7 @@ Create front end Open tut1.html and use this HTML front end as the base of your app. ``` -< + @@ -180,7 +182,7 @@ async function sendETP(amount){ } ``` -### Test NodeJS +## Test NodeJS To test your nodejs code, Create a function called run() and make sure it gets executed in the script. @@ -213,7 +215,7 @@ node tut1.js You should see an ETP balance, and a transaction hash in your terminal. You can take the transaction hash and view the transaction in the [Metaverse Testnet Blockchain Explorer](https://explorer-testnet.mvs.org/). -### Connect to Dapp +## Connect to Dapp To interact with metaversejs in your webapp, you need to reference metaversejs in your HTML. @@ -240,3 +242,6 @@ Verify that you have connected metaverse to the webapp by opening the browser co _TODO: Expand upon once metaversjs referencing is completed_ Now connect elements to the js functions and youre done! + +## Whats next? +Continue with the next tutorial and learn how to [issue and transfer Metaverse Smart Token (MST)](../2-Avatars-and-MSTs) \ No newline at end of file diff --git a/tutorials/2-Avatars-and-MSTs/README.md b/tutorials/2-Avatars-and-MSTs/README.md index c4f05cc..c4e2499 100644 --- a/tutorials/2-Avatars-and-MSTs/README.md +++ b/tutorials/2-Avatars-and-MSTs/README.md @@ -1,3 +1,5 @@ +# Tutorial 2 - Avatars and Smart Token + In this tutorial you will learn how to * Register an Avatar @@ -159,7 +161,7 @@ async function transferMST() { ``` -### Connect to your dApp +## Connect to your dApp To interact with metaversejs in your webapp, you need to reference metaversejs in your HTML. @@ -179,6 +181,7 @@ Also reference your tut2.js file. Verify that you have connected metaverse to the webapp by opening the browser console and typing "Metaverse". You should see the Metaverse object come up and look something like - - Next connect elements to the js functions and youre done! + +## Whats next? +Continue with the next tutorial and learn how to work with [Metaverse Identifiable Token (MIT)](../3-MITs) \ No newline at end of file diff --git a/tutorials/3-MITs/README.md b/tutorials/3-MITs/README.md index 93925d1..39c8cb4 100644 --- a/tutorials/3-MITs/README.md +++ b/tutorials/3-MITs/README.md @@ -1,3 +1,5 @@ +# Tutorial 3 - Metaverse Identifiable Token (MIT) + In this tutorial you will learn how to * What an MIT is @@ -7,7 +9,7 @@ In this tutorial you will learn how to * Integrate MIT's into your app -### Introduction +## Introduction What are MIT's MIT stands for Metaverse Identifiable Token. MIT is Metaverse's non-fungible token standard. You can think of them as single Issue Assets with a unique identifying symbol. MIT's can also store a content string. @@ -21,7 +23,7 @@ MIT's can be used to: MIT's can be transferred between avatars. Only Avatars can issue MIT's -### Hands on Tutorial +## Hands on Tutorial First lets create an html front end @@ -141,3 +143,9 @@ Verify that you have connected metaverse to the webapp by opening the browser co ''' ''' Next connect elements to the js functions and youre done! + +## Whats next? + +You have completed the Metaverse Tutorial series. For further information checkout the [examples](https://github.com/antron3000/MetaverseTutorials/tree/master/examples) section or read the official [Metaverse Documentation](https://docs.mvs.org). + +Join the Metaverse developer community today and build amazing dapps. \ No newline at end of file diff --git a/tutorials/4-commaindline/tutorial.md b/tutorials/4-commandline/tutorial.md similarity index 100% rename from tutorials/4-commaindline/tutorial.md rename to tutorials/4-commandline/tutorial.md From b681b8d84cbf6fe710da7b54f7fb6b2f9da316ad Mon Sep 17 00:00:00 2001 From: canguruhh Date: Tue, 8 Oct 2019 14:54:57 +0800 Subject: [PATCH 02/14] Logo --- _config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_config.yml b/_config.yml index 0877766..306506c 100644 --- a/_config.yml +++ b/_config.yml @@ -1,2 +1,2 @@ theme: jekyll-theme-minimal -logo: https://app.myetpwallet.com/assets/logo.png \ No newline at end of file +logo: logo.png From 1300dd7373abcd19c74ad65ef77d86580ddc0d9e Mon Sep 17 00:00:00 2001 From: canguruhh Date: Tue, 8 Oct 2019 15:04:09 +0800 Subject: [PATCH 03/14] Add logo --- logo.png | Bin 0 -> 18778 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 logo.png diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8c0505624fc6852a1baa0bd02e3be3863e899c98 GIT binary patch literal 18778 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
    T9|D#?GM{YieKb1JqmCA-w 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 Date: Tue, 8 Oct 2019 16:04:39 +0800 Subject: [PATCH 04/14] Logo --- _config.yml | 2 +- logo.png | Bin 18778 -> 0 bytes 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 logo.png diff --git a/_config.yml b/_config.yml index ff472d4..b262ed1 100644 --- a/_config.yml +++ b/_config.yml @@ -1,2 +1,2 @@ theme: jekyll-theme-minimal -logo: logo.png \ No newline at end of file +logo: images/logo.png diff --git a/logo.png b/logo.png deleted file mode 100644 index 8c0505624fc6852a1baa0bd02e3be3863e899c98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18778 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
      T9|D#?GM{YieKb1JqmCA-w zh`)g&Fe>tg!+Qj^d~}uBj@gE(Yu|5^pt6S!+pubO${36utMVVe(X?2xs@~^pscOHP zWX32nGtn?@8VK!u7h90ZGO*uY-aGq)H~BE_asOHCv*oC&?60yKtQ49X4Zkhll?gg{ z%wnw)p|N~bNB=EY^R0^6W?ZpgUn8!_w}HV^-YP)9rT247C6d+dQ#GvhAfMg2$$dRV zO?IutN~4>vDdfULq2G!KXG!9S{H9*bxv!H4+x0dj%>As$FKDm*G-Ntzy1lW$nyP~v zi-_BZ!?neko~giDRIk`SzmS||j~jS3TNhX*UYpq@SW|D3+cP*IAflS3dZv1#%5yL} zUuiUXWjk^}?p1&Bc5i%Er~dL@xTkSe4M|OY+;rUJ7J6HLDN+=Q*uILrwb3h7uyNS$ zLK#K5$DqZnnyeigrx+DdRfbQn>`LKwK^h-Y4&7LBcyQFdCwH#U+Dmw>ZC^fFyrjh8 zpK%TM`n`l+!c$^We0y><<6nJ1>t)K89@y)C&yip42#>l+CU` z*Qn7*Eao?`*>TTu4_ve_;DbYxEI z5kq+4nomyDy4oJ6k&`8++WjIP}ldZ}(f==G-U_GZ*m`*Sx9xUOk#$ zm!7K(=iWxYh>m_lMTtMXgK@FWg8n8IOj=nU06ggdz&{WGt{=hgZ2)k20{}aQ0Kgv) z03>!%1|1&&KsX30A*Sj+vzMY6HCuI2Wia!i&ZQwh9l>cwKY6OIZfJ^TiVoRNh#}I{ z7hBWn51nQS@kCP}@_BA?fXL%rN?WT9v=i-)6tL0p1D;W(<;ui(Jx@YKN)9|l#t=0Q zCjf^7RFFi|i9=DKLeRFMyV97f+N|s>599viM3hOo5Im5;e_Nd&b z>gZbzQ^^736_kIE^ZbInvY^|}Sd}U+#7romLH_RYmx!_p#p0UnFaLV0pK_!A{FsGZxH$Qf~2wB2Noo-17YsF6?w&Rk3*l^SyKx? zr)Uw)k2(N=iHC|wB@7rEv~c|Rng2)Eax!37dwk>@SF}jHa@hZGUy}VrtKxFEvKp22b|sKCBvSou8>gWi5y*J>J3oZvW=cL8AGOPA82vb zV~7d_b;%7RUq3iuTWCTv8WH#G+mz?dg_iUd#*T$s7JyRb6{)P}#Aik7dn|kifC)dq z{E?-kIQ|ePB_(KTgVr5Si2-n9!W*-iv`^kmhI0656aAyZo4g~{#!^>)rB>;TNMjtbzl zW-@L+YF}uDwZ|hBK6T4O_Ro94^80D7Le?APldR$P=%Xp`%|mELI2$HFX`X5Kjtlzv z3IJ#Io30}%qgC+oer|zdH0!9_5|IQ|4rw6-@F8^^zbufBk?`49{rh+GSbBKojbuXESBYsAuV65KD#gAQ2A4$i&D8TEV?N*GeoB-%%a-Tebx7$#*jN8G zNoNtnxM-%m`YSrH0X1`$2ke_I`kIOrpVJBhRBT@fVz_O#>ugus_02H>dwd4ySBk5C zC+$D8-r_{yaqt&o(EP~rqsAQ{NEbIQy^L}2V6ccG<;v{@M!v=jn~zfszT(RW2BQdqcD&~> z)5xEd#g>W&Ijfhe$#xQ9(5Rp+W#t6Y@*U;d@=X+~Mp4QK`rgm^B#sG4K%>G@OBFP# z5gMgDYJgB@*M*?kGi+->Wuxg}(R4!X7=WnYSspUr&xa|r-c8q|IjVd9(#p@cV_=l7 z2lE&Sz(-=xc!e^}T?qc%){LSx`(=sILmT-v zkVktLS&K6ZHTF!1IKUTMm21a_LP!ZmE-WyxxdtUS{OUBMS9_C+?EMlP)FyY*bTG}O zR#;nR)f0Sh7APt#y_SwKmab}By=%)kdhOZB2t6+OX^!=l8t7eJFT7?mFXUY}cicWE`7#sHx#F+fXPpLe^wLD)u6P8k@a zHR&wNjBo7KW=-E$AI=h%RBL(b2A33f9Avu_YRxxrLd(L}9Xr`0NnuCsK{(?76B_+;pyQdE?9U_&RX@T zP8{#uS3hN{TVXl(8vdy=iIEX#+@TT6b%zHr2wV8WxLCT+FH45oOSi>&oyOaPg)4Ao z#s_`RJBt+HX$Cu+CVMFWc;pV732*W>hDiWj7>iA2)bk&NsXsMI$-v1~ z0|^NJ>{o~_N*`~j8>w{3F;G# zQ42BN+OB0HMwh~Z!d) zh$Smga^X~(uD~xv&QkSZ?2%v;6sG+E9vtNbQ_3mdh~iLq!rj`Kfsgx=jT+hvlc1-i zE6pbZ-^RxapBLg{@=;fbpN`b4Lpe-Rv0VN zM$smbX)h)lv}>=^`K`Rty+HjPp5JWE7tHnqUW%w!T;!tKjM{+ehm$!~T?Z!gK+e=` zqFg-`?j|~|zDS8)J^SN?AihWsubA5`okKE)FH-CrwQ+f$${Mz2E+W;1*{TJ{;B9^0 z+RCp@_$3QELj|3UO*2oU5d8bA!~8YsmBy-3#zd5Ei+SwZ?0E2phc*;cOm7PE`lfGJ z&nKd8E*Bf&olOaJFJwK5mF~a4pIUXujQIM^iQCqoQ9fLYMi^+tr$piQn}bzS*NGvO z(M#OiZ2rt`6c&M%DRCzWN5AE|MnN7vLhF{ZHESk@P}&b+?7bF_#o85yi(jpSD<2(? zWgWO{0l;)8&hpjM^3x(`8m7J5;7D`Xpbf{Aa7SenO|M*my{hK&7V&Y%UrS-YPd(}; zyhL<;-MzJ2yo9k-%wuq>-;>`@MloE_v@7kJ{S#)lAJc#G-;Nf{XF*}E`Un5r}b z$*0Q!rjBtKzM)6{LfzUY6uF0ub#Whf7haT?BGjs2m=`&on0Q_phDi||@-S9+i~n-N1`lhw;s4D_qx(#Gn+sKzoy;pr6xfXedih7{imSra{}Sz zAVgB{Z72s!0)uZWbMM-p*kxS}@TI++;708~Gvh?pOG>Hs)V2qmTww%74N zotFv}Pv=5QYD#!i%4U!-IIXvND;2z_GBx9D?yA^J+9d+_!hU;;%JMtu zfBLrD9s`k&95R2G7glE{Jm_3h(}WVyad3H65R~TX@wk8clQ<%+XznzUG`d|?UtKs| zKAiUT;SbZmKce>jup8FMaETdRg@xtGA#=P$<3hZ1L8l90wRk;AVekl5t9`to-DS@n6M?Nhhz^>#6b2Q;LnA zl)L)>6fxiLd}M%13GZ_UXy!HES{3vV+TD!PaG1XILZK1{N9nNv4!pe^Y|XWtM3sRS zRFQifN|9Oo=CT$irxH%bX{W3&Hh&LL8RC6r8kl~9#2I(yWZl|^#Rzf-UK1z+z;_Od z9yi@Na9=>3TtE2#BzW?pA1g=Q|H_}|P39c{3>czZgb{o9#!pE2qjqYK!b3U!@{9|t zpx{GrVBcPXJ{ju4Kq~?RnXaNiHc7Q$q60GoFN9KMO}4{p;*Opb6DWnDTy91Z`?0DE z;Zu#99w-@yvOw>7vbAkaarAJt-!pAbV)hATZ>L*nnQGGHY zkH7QmZJ8rn>)gLRz7`slLG(+JoUk>T=Vk6~%paaJzK|x`O-aSkM@jX)N~ROaLJW%M zl+of$M?TR;Vid2r^dlbDs+ zBfgCFbXY44!9Mg#xbF6=7qRgMsC%3`oIVe~AD6*tW~A%ve+K&+<*OQlysqPX7f%}P zD&`K#*(RK5$V9`c9m849J)BNxZW%88=k}}r8%HE%8Bc-$yuq4*m#&1=i?hP}%$+q= zL$?#(BDA`8V!*yX1`mdnW|lOU@YsFwOG4XvZ1aGShNRZ`!S`(s?(;Zwv=q&AyUGXUF zZ#V6~fQ7{Q(J9G|fKn-!YJ2`9EmjYjJ%gc8_n9XuKT(hGNr|-O4z$lCrZLYsP z&{rI9S4z1(A&&Y0T9C96WWcDo7o&ohd@I;-jkXo#&!970L?GkOOxM5d50XG+Z`2>) zADUv%%Jud|-2qfo7Rc~}f_|aD+*m*5kIJku!gqlX=fpa@F%_4YzDb3zTGC{`?xHhl zv;XAS2J!;M| zk*>G{r-C!>aU@z5XgO#{R_%~L-O_^jBXy^TS6?-{D zx_91$v?#M8=r@-Z7P7ZVin$XjfmM{ zA6;J;YKwkL3{W?S)~tv}HC9VyRk04s)88*Rzr%;55mD1pq}h2FGRI^|IRCqf@J{`~ z_M)HgU>>{c$LK(7J62F+R^b)upSis=7Gqcu^N{<*hY@U$c-Zwgl14aPjGD9h z^9rr2NmkQ&@rEuwmrV9>@N1!IZ1zx?dQU!MtjWh%@z&b2vcNmM_IP z48c3<(fs`zOhTWFsnKr+CVfI>(}Aty?| zKs*0vKpg5Mq|j+Y04YU3277-WMM7KJ^AaR`U=>7<+EB+I>j}*=^GxnP_W15R+|EAIu)KwrV z<3wX|!Hx9n&y_UoE;5rkP*fUBD)@^5C4?ZHz`*XzpNr6rtMg*~-)1&SnYc4(73YFgg zn~#{XSEevLK@rk@I41DkA!5=PcG&zUCl{spd;*mZ?SGT1GZsU$mR_s}vKjFvh-Cd6 zN;4LCyYul2J*4ZEuyQX3MP}B&H2Bg7dwG-3 zyW=@Kx8PrEy@A+VXJluAR4<5;SYM=xnBnnuZO-l)nRJ=%Eo&mYgl2w3q<9iRa=O9Y zrOQVd&J`3BwZi|#o^|TI(+hTFzo`-uXwp8Y^9ngcUo(X4 z&vOp@d>=4mB)?-NfA!E_+T<0#CdvNn<9-`^9QReGb01`1pk(pP0Ixc=;Yp`yRPPUl z0pv5Uq?^U52l>SZjy!Hj;j=Nk8{P#-VAJtCVLYLkHbRbP67|!BjGoEZO~-dp`Kv8_ zIC9>faMN5Y&~(Vrq%3!PFKfrlE-u02S-J0LLKk71g=@oEO|!aj*uH$q8#q6T{=|tz zrUC6Fr+X8emVj;7>t`Q#JPqqFjH;^^O{(e}_ibh&dOCh@EyUBcPvh-3uI^`%E^0H) zWFCL_5Ai-?`|M56z%;9ce($fn-`qFC`)YF&EAe=kef$=mvC647(AGabr@EuNbnHcR-;w14 zUd?W?Sf!dQ5G|J56?JrJMUmV$n_>J_vS~%vf(2C~u9Vbd=7Vtl#9DGp;K}XaI@`!- zkcr;KO6f*6tcwn+VY=%GeJqMn3R^(+xz|ljdhn34}dZi@JY8D5t%*ehjYCeT-Y{7z6?UiD)*%0Kp-sn+&NJmR zG3;f)6hYeuvAs^o2)@~x?y360h-OzFtd+Ef^dPUto2*D7!v55-*`>qfcWuN(>9}xn zjq(D*R4b9N3|6_MfX5>IsLUNretYSyOCex<41`pVL0{wle~j z(#okU)wJBsU-LWT#tY$kB)7l1oe`KO-|z=}YLhR?`v`xF9k=JYisvqOMVRA2Zj^Jw zzptuom!FZkO1;jP{=aj_X{z56!k3 z3RmCrJBzo024u}y@5v1BKT%Hwr5xM#-AgAuiS*4vIxI+BoGynE#FanPQ7CAC!qX$6 za%%5duAvMs|GLv}f?pD{f5Nmo7xUALILv?7tk0hSQJup1)-PtO%(ZaC!H!jve@-{Ut?JP;6f$z{v9&xGpNO zujW2cvKC)FdDtgNBw;=Fs6Jn93{F3EOv{wA@e;JL@Dos>W2&uU@5iUa#9KuEqW-~q z?|U%qD=Wo@lQ&BWuDA6w_A!unS?oqF_8d>QCA2%V}+} z^zaj?4u1DVVcK7jg@7_`sx2Mm!k&1PexZu;`|!Ps3Z=VzoN*(^{$5%rnyyT)3~ zM5bTQO}<-oHRz!g`<=YE+P25By6f+wB;Dv{^R0evB;v+$yCb>!==GYn+b+v)V;k)C zh5OvgG&73pxm={QyG?kU>AKNtizt)%6&TsI=w8|1uD9+HACGWo@ z-=Enuk=O9Y`Kp)3%sqcPoKUrmJDj$Hnfxusra0e)>#`osh`PKskLH`VI6AfO zuPI(?f~I-dsEjq5O8L0BO?dTxABw@Z+G?0YFeunPkjVyZU)6AaJLcP=O{iKEC^{eQ zZ?eck*0T-oRaN8<>qFxG=D#q=nTn_jUuPJ%1x;tQ?a?f3DXn*Z#|ZJ&^kMJAVUBVU z1I2+Iqu0edzT_Z;)<#0sHJcZg4b@!rYDe>fH#|j;QiEsuiI!R8RkqfSLz&VYOOpx| zq30b>V?giWz~sgxX9nshAKL}jWXH+{lUR0OdBlpUxmMi;(RRo6=wnXdt@n9LuqP}a zuuk(Pd{dwt+Lyfhw|u~?dd#9J!!ACkb{em#BfyFmO24M5;jOM$gnw z*k>cO@bTH@vNyJj9!9CFAPeuli3W~})cY(2uXve6N<%yg`PI`JaUT~%jYfUZ+34#e zVh9_{n=ol_Iht*{OtO~`Q-s%hqPfB!T@K%yroh=5Nlx~9W0+2iP<<>475|c&3hNsO zPSqmrt{iZXJt0j>z5DWWpuf|=f16#&J$e3adbt7RdQsKO=zip+*_U@_$4U5hz6NCl zmSH*WG^=>FZkF>nO6Z~8B{dz>yNyGAvIPj7sgdwXc5RV*mGDG*;Kr6Kgo0-!yQ@dy z_`v6ON?qQXZ*lHHz~!o&%ODBq+B8oKCgU*ZQG z>yBRLbbIA=tEj9!H)vgr_2p2HK`%MFN{kj#NKO3XTfHM#pyv`w*1(u4`V4Zr zfBRBqd6v?*?7?$;NkEq6CA-j!IKq}A@>X1KXGxiT;P=PlWs5f#<4Aw~o2E$`lV@je z-#ni*p5Q-8BY@xt#367VU??FD(Z;ilv(>OjOcD%*YTJlm%j;Tcl`Q3jn z3f~!ne%QBqY$nNpSo)YIS`G{x1!2M8r3N>oON;`IlU>Yvtv8w3U5#-bST)8tRYirx zTeC4aK6@=LGxIYMBrPR9GcFSNpf&}7H4iU)#T4NJl9#P z#tOiNN}@T0tgr~q+i_|nUzJ@N$*(#wRFlZdUaYm?;x;6#NH_f%mgTCwW(PO5$-pb}F{>tYer5h{1Jjcj$Fc+4r3rJz5^i?hMWe;a-0mamxUbI=LJK~01P@d;xX$H^ zbDvpk`An<)C{-WG{WyiRcrF0JGVYQRnd3!kJ*R8e!YN-8MozU5KWuPp*tEv*dmDH5 z3)V96RBc<$Bz;|{W20U$TUU?Q5Kp#NQA}}MQa`cw9E}?5M^IJ<5!5IY4^OPNe2k^5 z+%_&UOZS>|m<-xe8kqVw!PaZ!MZ4_kbAa;V5A;DpL|4Rb(%TDi!DE}Z-4!u=FQ`PW zlgF=0ch?t!O?(dFInGpgXJw6=;aD2$1ysrCmJk^~%LA#feQch#SYreV_Rf zAvxq?2xBl^yM5@jKj+Vgw9V7sxBbz2zN{q& zefJ$1CT;r%{8LyR5SxRqm_C)TBvM|cG_(asQdO5Nd?*Ik?z{i`aL+)cpV%__MGAkV zEs&r_ronMNp3T_4I~D!*LrPMiTU-mn3axLfJV|q#K5yJZ@1;|*o1k}VaG^Z8?Pcw% zD_#r4CgOFfXB7z~+}J@oRlPQ`DmZ(tNCI!%ML#h{KQRMATez!>RvUYksh^l)!%TR* zJcBt(iz5_M_g(L=^dFnWYKWB==K9uS)wK94noq{J{gODY*ShTTezzAV=Iy~4Xvy46 z`nIS`r6G8e<>=+2jeXnAq|?_o_-xt1W;qdQV6-*g_TyfZYTexXugCY#gBrK@iEENM zM-D;iEAtAN>^7s8$K-%l3bCH_FpbJf_CGVkl|3(vTYBmp%FA_od8@ zJ4BIo2T^2(^O`?f3%j~=@@ zUq&*vF}jtvxQu%#DZK*QQS!D%AM8O&;f<;LSpb#LtB6^F$!6Cj61_lOtAP=d}3`HU2U7c=|BpoYUwx>2zAn&$U`tT@M@brd^zplV_<1$$u%o(;5x;8~(e$sn< zlwn4}HpGZXBl*&8>{#MT%{gwWeCIG)?XYOig1%>WogZ_rwz`9x)SXEP2EuV*#MnDO zPc|LU;aFwnV*lH64 zZfdm0&4S(ybg}K~nM_Hg<4bE7WR*28tG~i3Rtmo{JuEfoa}f&G*hVi!9Q4vy_nGww zR@uIEk9L0eJ~qi4pw=~JWawzVqqcLTW88ZFdUH1xx6G$S_;Y6NKveOq@CCg>HF7A3 z{=t5Z=1lV~#lALb);VgVbfxVWt$_SudTHiz7!RjK{p{yS-OVxd&d_hDih+|%i{RK{ zR4r^jqbrXb!ws1QzUwbE|CdU|<;{9;mmDlCqsaA81E$8sGGs|iS^Xr^tm?Ie;kfFb z2X%~Knyb7_pF3(KR2Q}2!o5|IRGAyDo-mUrl4yY49aYr(!3&RG8qsiCVSETTc4zins#JY+`qoy*XP`(zioGYSmLl9pM5b#%Oi<3$m@6w0hMx(MxEzRnQ)vQGx-Qel5~N ziN7WDB`+UjXGj;rbr|p1s+dAxv47v&VbQL}PA&#P#$KuBPp*-H$AxS6c%WTouMbHp}C+a=6 zrL^HF@I2m=(m7#0P{B}9*;7KEuS=>V_26prL!>vJcW)GP-U=G%0708xMX3EyQIk3| zt)Qe5Zf!GpleT|-nDm-OG_N&NN@<(jKk9aRR!>rL=c-}y!V5V5n2RH?T1Y4em-tfu z-k;Az5`-S+Zx9h`GIY`;7aBfV>}e>=EUBQ+bBl<@WOW2G?H?t-JRCZM#7G zNiA-Dw*i>X9INBX1yNjV$=$lPX2^fZ0}n)Pm5buncX9iQd~1jfU2=2^)#e}W!?Gas zK33lZYpQl=*CuaXczhG_^mIV2aVAC})Q7k#b2Y3)dFCm!Z+ z3{4NuMkI;r;j~5zp|3NbpqoC$hh%URZ3~eg4uYq8iuSTo`*hlsEm3yOFLJ>MgTcdr zetWL;iqz+W(uH6Myd#pNaPXy{Us8+Pp{WMfY%!0ok+~l=MdC*W4~~$dsFfd@AJIba zG~_70!OQ8`Z*)5MEr(MKOCDFGc8@a9#wvCks4ey^k1AJ864yGq(HDnk@()HGj(nol zByV1D#39I;G!~zYwNx2QJzH!OZSM~KPOsc)W-gF%csMR61Jg-=FsseFzh5z5#A@=yly5%cu`{+4o(Y*@>(PtFH{fMeS+2>wl-jq6 z)34qgZ8{g`*CoNig?J(GVy@#im~~h=y;A}KjK}SU@T;kyr_eV33%O}GY}%5p7(@eG zQDEZ2MN`S+W5(*GE`N%wqNn7%a zKEOY<#7JdJkIs5pH&cq()!FgZ@b{%J6jM^5s2HjLYKJkU7A{wqwv*34)_NI0y#1Z? zwGbwx(@fNRkMvDV@{^YWSUGI8Sf-6%caa`H!O3;0t-Y~TpQ^0AP`lMi<2}c>4;KuB zSI)^3)+%_stE)XhvG>=D1#?jd<#O+AlN34+jx#}Fzk?kl5L$(kgPV5#s+qG=-unvE zHeG0iHe1{3k{yDAd#gB^WR;7{2s1r%5J(N!iQ$OEv&Tz^NYdjVSY~nG!fI4U8;SwYkCifL-}& z-7;EZ=Z0Y_x_E95%VEj;YclhE4}%${^=RCc=AkFMY@p9txT?~TVQzL7Nd!corh}wr z<1F@!4QQ8I5|brIc?H46Jx1ciuxgib^4%Cyz^oA#O?RG?Qa_1S5dnL~=ya@;+Fgqk zlF>-*#qqzIqBhsUQ2Oa23qHB%Jh=CbH@4AWDPzCLqH5!_XJ3JI?>q2TM9R7X4X?DP zSKN={jWEhe<~))kCW_6gm57_qd1xwq){c|`hIJRtf<^320V2qdej$;?$t%H}ZQwZI z%A5>LA}K`IH@DR0LW~l;-p($_A+x8E_-%c3Phs?k94(|`c(lDVVH2Eg3)w+$?~237 z%1=yrQeU*nvqAi=&dmA(wRW+70WBvWt~mT?n*P$)AEtYm>-+uU4Fd%MKEw#G(X6jFl`U#hxhs&ey;}w?Fo|%j29c?Zx7N60j2>9;Z5qoL&EXJUi zVTp7+Z(L(fqeD5Rdy&Z4(=7f6;Vb_i_ILBRmHXK}Uy2&e z+7($|FuLYYu)z<7eQobYN>Cm!=dj=jf^wGL>*}ZcotyL*_{m$O@r*rk;}SFCQgELv zOUbO?PV{uz$0N-Q{o1D2$OVf}hl<}tp4Fwe>;)gqPb8Q?^?yS3f2*>>goRE@orXGm zH?;g;3kkVx$okWHjFfMq_#x;StrKY2i8|>E%GTp2?)Dp1Y!vAms;VGSB4qR)94=e% z=8vPqU-Uml3M{@iu?e{5C(srJ@vtOWbLBgt+~1I!>evrNI9=5TXf#JRx?AGB8qJM zQg(L>h^xnk3|Z_I*W98nLbJd;&nI<03c@X|<(Qs%<+m%VyX$$gkb$WB8pMb%FU=>I zBDr71T)Ca?tmf*&t5JWybW4>><X|ML=-PV;Zx+R;DmS3b#66hx;{t5o)s zDezpJfmtQiv+D+3j;qY6Eeoscma3MSoAH=-^5Gv6(CUfw2ew*r85F!utv@)xm!G;x9kx-!Cn1wjCi=#(bINqJ5+gbG)SE7c0b+_x@d4 zxuy0=?ZNPLzMoo+N~qnspefsK7NkftN4+EItIy&^37lom9635=yvcz zo*Ghxovm<FQ zP{puWjnJf71+rtKxFx;8Zgk$hV88+=fks~_#M$GK zggmP%)S_=O7zkjqcaZxtPO`WBPK{hocR0au!9r`b_T@`iYa=tHR)(|t9h>~_%fYEC zIQ3Lr>{)~SkcEzjc7EgYZZ`3>@KPj_=QQ|9N8O;IBJ~Psj}w6^cQ}RL)yflyds{Da zHiK>mi8yVm8t6vb~+qwU-R|~lS2n14Uun82)0U&YK-s}!(b=kW>b|X zRWjauf{zcQgUqc5=fZ^K^M77}uOs`mRc3+kH292dR~6nkfw>|rB02#zxOoAy-5U(wW&N>NV}lo7~y~dTeq7R;X7DC+>?X5n;HIqiCA$Vf9VWYnkd8K?O(oj631WFyKeAd)i&&u?+^5%T9|sTk?Xqgj1CR^PlmvxaVem6S6+sp^1a zPe6piyCL%LJU%u^_xVugW82UZdx>g7dPb5~pTn>tIo%n1!cuXhgD>1>>?0?lHlj?` zt^1J+iW?~i%f9Yd8U@~*bRUvVxhhgTi9DYG-gcBNN&8hCL*>)nKCckLN^jutl|Wpa zo>fcqXo*VdSywKjno5|ev*i<)KX&2CVUNMWYD`v) zi>VW|FJ3{k4CT;%*KH*~B35V6cY9l>YS!y?sF-8%XW=@dhFJN7dCB>%7q+F{P3Aim zas{9DD#dAH=2>h!?~a^#+lNQBB=5hh7fPE~b4*?!4Cu@1)mH;jJ|3|G>vZqv?ECz} za(dTTOBIZ2w4-XA-{m^UH!(!UsKP+-wD#sbf%60d#A1Ft;3bO_(L!@xHIz#_`k?z(sU3`EL-1)s6JD2C*Jzx}VkzW$W zwEr~>13h-8^xK?KE3s^pAiniq2@%Yb`X6;O3DlQMCCG1QT=FF8AGr2kSz&xyV{HY6 zY2b>qc$r|oPbgtpZb5@XfuoUensp4;NI^e_z(LB7W^DQ zs~QTT;QsvqT8XH{pGXY5)3-_^;e59)hYBx?UByd^Yg zgK-l-_{(n*p$IQQbr+xip&DQz5DBR`8 zWRdgur*4E4sK<)T$O^bWx4nk-!ChGglJH;tWAA@}6_J`1dGE8$u+9R7-B0%Cz5NIJ z0x>F$t*|`i`IS%bCKo2AzkW$6tZ3kiKwwKdtsp0~824`WDO4O46L|Ub@*jPLfjc%F zpHjIp-{k{{LH!S}*+?ho86|_E$p7~-ih~FX_-{g2FKMBg6Mw)_R+#>;9CE;ApaXH_|$)*HH4T_ zrh3R%{{P3|62suK|HG30+GqlIOY5UD+wgGPV!~qnoizL>E&j zOQ^>h)sp_HJoC?Y&bR%}`+I+9&hx&zvt)sy<}KKgdHxFH0-ik2 z!uba=jiI?&XmQWV$@h#?#7-D&mz=K?816a|iPK~E7e-c)7I}_DNlqB_oHGId>+$cwA-w`*>+d&j= zmwG=&J0lZM=4D~XdgafTBsAha$LLYYXzyW3wba z>$$2}{t+rNBL9mw?%kS%Mh{3hs(eZ5@-hPG+R*T4{XD|Jx8@D(TksQ68<&(K$;brk6BC)pniUI0ZOm>>##PAsGa$ura)KEvi&l#`(EPWtJ@0>Ao$Gm#tV zavmpQmMzn1^q&@ToNLUnYMuR#b3wVI-K7}6aJ}Y=ORI-l3Cf~mP+0tJhFKzu#O%Pi z4bkoRJJWCYMb1zPBXlYLxH4MT=tw1UCt`O^3jq^fhZe3Qn;(3gIEhYFzMC?Zh*Y!X z+YZ&dUaeLrz?1j*t`uWWDc?v{o08GEdJH_Ts84M|=VPAR>RbV$SS&F#r- zw21%PI*MJS$OA*P;^h==_FfObvEz*ZJ1tgFEVEftQcvl|j~~VprEUyO(uzM8bp-Mq z?cs_K@uZJB_B;Cv4v7*YYE;jeU+t=9w6?x4;SA-Ax9^tdYhtx&nR|l9WQATf80^zY zr9p$zi0d;_N4BwB=k7ZEF0Z0}zpV6=KqX?uc|Vh4=vf5O^sxFXLb=nV`b8rJ?oy&y z=ER`plEyvQ1)WAUEP0+=UjH~z+5{i9FJr`$vaZd}IWEb`5-e@tf;0XW zpq}gF@T< zP>7rvsO(;m>|7HjFReVKIdsAL6iD=?dQk4?NUEPz1X`I z*dPIh!yBC8i%mWastzP^C{stN9NsFl1DMg)jc*BKFBP^u z{-97c4ce0oX?BH)GTO0TKREauf|+fYW0+;= Date: Tue, 8 Oct 2019 16:08:07 +0800 Subject: [PATCH 05/14] Logo --- images/logo.png | Bin 0 -> 18778 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/logo.png diff --git a/images/logo.png b/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8c0505624fc6852a1baa0bd02e3be3863e899c98 GIT binary patch literal 18778 zcmX_n1yq#J_xD31l1d4}(g+9$NJt|fEG^x&(%oGm0)ni7bW1PNE!~~c-QC^1kKf<_ zymQW;-JQA5otZl`H|BnxP$dN^94s;{003~H(h|x5fC2#kq&Jx8V9i8Jza9AX#9ms< z2>_lx|Mx)x5|c>*087zATwF=X+|Jp~$=uGK3Mwv6W$$QbYGG{x0PZs>DrTxG+r&bb z3uo_TL;Qcr+9?xZQYpU=^CygCV5WY8FB3wYF-`Qbg+NjgmApGW1SKNEKb+{}YwT}W zQy6R1zaj!NL%#LiE_-EKP1Ij*3_Mg$3UB^CO(`G3XvV~jmFD`$?T?-Ro|0fGu&cdu zd5ujp0E^BZz{f2AMD27>iv(Qx3JS8&G-EUZNbY~1Vgk+bNzHFw20!BMyid?Y^8bR= z>>SA_i|J1YhPii8h z^hki}xk-owU@ids9#a1%3243n2u)?%-vLvsz#FKBsWebh4KxqpKP>|=v4J-qLxPw9 zR4>4=o0irc_>uq+emKz(JZ34v-(&_Ql~5*FOZQGPKnIi60YgKBjq=qXl!S$l#|YUd zQIxIKBjE*Sz+1ef(|!O*k0b(TdwTCah+8x`$P-b8YrwkGg#JilY`prgK2%^Y3INN_ zz9SE>*~`iN1uX=ZyUX*X#ud5%PQ3sr)T^b|{xiAkmqSrcz8KGKz@_f0pFZAE z{H1A!8rNzv6Rv)I<`5x~7=Fr`O%wV)im8Ks^zqZm;_F)!;YDts#8Mc^E0Q%&4~B9f z%ZRV(+`MuL04H^JEn}}RQT)vVmxtUQ4@K^!(&+(zQ)rX}0O(85v8nc!i*#WEfJAx# zbBP%FSqtgwX7raWXmc%3?+kgqyr*k#eUJYh>y!UWM?aENNeH^4ZjnZP7Dh+a z6GHfrMmCaLnnU@UDwUcv#fgw3^1EQ&4}T&Bx&hA5cVFwJIDQ6{eH0qQt`x7$<0bp@ z;n&mQPtF{PaN_i&VaEzGp>Upz&EW!bycxK#c-NceEm91wcI!86oo(++`CdPXhV_-w z{KhWmBr8$>jZznS4jU?ULwyz?+5ChD)$Ki%5v7>4rktk2lyn}|OS-oNGf#M*pnUn* z%19HPCtJbrhv2%M)R>baSX25n?Zh+qb9Q{M5b<_ix@V!{oQ$mP*6jRGgRG!bvP$l4oYrikds8TNe7@YU~txMv&fk0xYY&fKtZz7hp?g_ym1kwl6?YWBj7v^ZWa=f&T!7hS4v zcsX|CHxuv@?9?=wtC+osB73o7WMUX%$eGzy^AS0S1;kUeQ?))-c)q@hPtgZ8E|t~% zCu6Y%YKRo2T@`W_vwVTPV1!woovKKduhxAix>lQ9o1%Eu$MjNz)%s4Vr?400?ysq> za0&y8Ae@3DKq#W zTFR!%w90%gRxYu;5dV1*8^S7^Jflv+t;sg`AU?HG-#=B(E_cDBVe{st5Bt69z0FPT zxfHf0dO0>7`YiS!sbB}UgPkA+d)MsoM{&J2QSoe}7^Ar5FOjt)f|=tVzJI_Ax9HSe zrCYV>wCT)bKxd$4kd@z&KS)%Tugzh~5s(v*>l)}E_%$$*z?~$-G0C}^w3#%Sv{-GZ z?XLa0DzB=>1X{MHouhS7Rc{-l{Z1=eQ%zg1{6k?%A^k*MVO=gkZmmMJLP6?;SzF0* zRZmrZ^^21ADfHQ*Dw`@FBQs+Xv+9nbwu9(~XrDhm-|vMmaDu0C3n;WHe4Q#B3HjCe z7ZL}P4@7)A&SJOO%`}Jbho-nztDg5UwOgd9B>j~#BQdLW3Oo%73zhxc#}+5dmPFn; z-`%h#<9zO*x9mB3o|06a)ViNHTYSKCU~v#Um)8F_jVV=&%W1f+TYTx``iRKWw3s(m zi@$vp#T5h0DmQ7_VeF9_g_9-K*=~qSqeBwm3t`8!RpC`Z-UZGDErWjE=IZY1KE*b> zRD+;JaX;F}Pmi9DBS5Y{J(3wpXn|r7Pvu5zFQN+7)BdLVQs$Hj6uOc8ec^s>_arkMmXZQ-A3lb zofai-Bw{5NlFT?1-xagUa5D=d*enHSc>lcpBhtxcs?|TPnW71`mVNn-jk$=&*1B== zZvQlRC1vI5suxK-d$*pwN5)|5Sx_!NraAm(
        T9|D#?GM{YieKb1JqmCA-w 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 Date: Tue, 11 Feb 2020 18:19:31 +0100 Subject: [PATCH 06/14] Update README.md --- tutorials/2-Avatars-and-MSTs/README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tutorials/2-Avatars-and-MSTs/README.md b/tutorials/2-Avatars-and-MSTs/README.md index c4e2499..facb0bd 100644 --- a/tutorials/2-Avatars-and-MSTs/README.md +++ b/tutorials/2-Avatars-and-MSTs/README.md @@ -97,7 +97,9 @@ async function registerAvatar(avatar_name,avatar_address) { Create a function to look up an avatar address ``` - +function getAvatar(avatar) { + return blockchain.avatar.get(avatar); +} ``` @@ -184,4 +186,4 @@ Verify that you have connected metaverse to the webapp by opening the browser co Next connect elements to the js functions and youre done! ## Whats next? -Continue with the next tutorial and learn how to work with [Metaverse Identifiable Token (MIT)](../3-MITs) \ No newline at end of file +Continue with the next tutorial and learn how to work with [Metaverse Identifiable Token (MIT)](../3-MITs) From 8298815d84535d45ff8c6ab35d29848b44cbf81b Mon Sep 17 00:00:00 2001 From: canguruhh Date: Tue, 11 Feb 2020 18:20:52 +0100 Subject: [PATCH 07/14] Update README.md --- tutorials/3-MITs/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tutorials/3-MITs/README.md b/tutorials/3-MITs/README.md index 39c8cb4..2436637 100644 --- a/tutorials/3-MITs/README.md +++ b/tutorials/3-MITs/README.md @@ -120,6 +120,9 @@ console.log(tx) Create a function to verify a MIT content hash ``` +function getMIT(symbol) { + return blockchain.MIT.get(symbol) +} ``` @@ -148,4 +151,4 @@ Next connect elements to the js functions and youre done! You have completed the Metaverse Tutorial series. For further information checkout the [examples](https://github.com/antron3000/MetaverseTutorials/tree/master/examples) section or read the official [Metaverse Documentation](https://docs.mvs.org). -Join the Metaverse developer community today and build amazing dapps. \ No newline at end of file +Join the Metaverse developer community today and build amazing dapps. From c1f4e90522c5e7f618f8f5b18365c89e7aa18293 Mon Sep 17 00:00:00 2001 From: canguruhh Date: Tue, 11 Feb 2020 18:24:16 +0100 Subject: [PATCH 08/14] Create CNAME --- CNAME | 1 + 1 file changed, 1 insertion(+) create mode 100644 CNAME diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..105c718 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +tutorials.metaverse.org \ No newline at end of file From 81f20bba3cd995d5dc47e3ffb231992912273745 Mon Sep 17 00:00:00 2001 From: canguruhh Date: Tue, 11 Feb 2020 18:27:23 +0100 Subject: [PATCH 09/14] Update CNAME --- CNAME | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CNAME b/CNAME index 105c718..4b9676d 100644 --- a/CNAME +++ b/CNAME @@ -1 +1 @@ -tutorials.metaverse.org \ No newline at end of file +tutorials.mvs.org \ No newline at end of file From 58305ec62576487e2f16502fbe33bc7fa480d013 Mon Sep 17 00:00:00 2001 From: canguruhh Date: Tue, 11 Feb 2020 18:44:39 +0100 Subject: [PATCH 10/14] Update default.html --- _layouts/default.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_layouts/default.html b/_layouts/default.html index 64f7569..0200b71 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -18,7 +18,7 @@

        {% endif %} -

        Home

        +

        Home

        Tutorial 1Create Wallet

        Tutorial 2Avatars and Smart Token

        Tutorial 3Identifiable Token

        @@ -48,4 +48,4 @@ {% endif %} - \ No newline at end of file + From eac61c139aa9891e74b9d97165f9d908f9701a9b Mon Sep 17 00:00:00 2001 From: canguruhh Date: Tue, 11 Feb 2020 18:45:29 +0100 Subject: [PATCH 11/14] Update default.html --- _layouts/default.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_layouts/default.html b/_layouts/default.html index 0200b71..9fec916 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -18,7 +18,7 @@

        {% endif %} -

        Home

        +

        Home

        Tutorial 1Create Wallet

        Tutorial 2Avatars and Smart Token

        Tutorial 3Identifiable Token

        From cd229ddfbbe0c5059ded33572903b8f0dc000813 Mon Sep 17 00:00:00 2001 From: canguruhh Date: Tue, 11 Feb 2020 18:49:17 +0100 Subject: [PATCH 12/14] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a7b558b..e0619eb 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ This is a Metaverse Tutorial series This is a series of Metaverse tutorials. To begin clone this repository ``` -git clone https://github.com/antron3000/MetaverseTutorials.git +git clone https://github.com/mvs-org/MetaverseTutorials.git ``` From 780bbd75e2b0c6f2da7051bc30cb93ecfd09dec3 Mon Sep 17 00:00:00 2001 From: canguruhh Date: Tue, 11 Feb 2020 18:51:56 +0100 Subject: [PATCH 13/14] Update README.md --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index e0619eb..8befad8 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,6 @@ # MetaverseTutorials Step by step tutorials for the Metaverse Blockchain -This is a Metaverse Tutorial series - This is a series of Metaverse tutorials. To begin clone this repository ``` From 29d50fd520a835099ba7c6335741fe3796330a26 Mon Sep 17 00:00:00 2001 From: ehsueh Date: Wed, 19 Feb 2020 02:54:02 -0500 Subject: [PATCH 14/14] Add content and fix grammar errors (#4) * Set theme jekyll-theme-hacker * Set theme jekyll-theme-minimal * fix and add content * fix html * fix minor styling * fix EnGliSH * merge bug fixes --- README.md | 64 +++---- tutorials/1-Metaverse-Wallet/README.md | 119 +++++-------- tutorials/1-Metaverse-Wallet/index2.html | 32 ++-- tutorials/1-Metaverse-Wallet/solution.html | 22 +-- tutorials/1-Metaverse-Wallet/solution.js | 42 ++--- tutorials/2-Avatars-and-MSTs/README.md | 140 ++++++--------- tutorials/2-Avatars-and-MSTs/solution.html | 41 ++--- tutorials/2-Avatars-and-MSTs/solution.js | 116 +++++++++---- tutorials/3-MITs/README.md | 188 +++++++++++---------- tutorials/3-MITs/solution.html | 45 +++-- tutorials/3-MITs/solution.js | 156 +++++++++++++---- 11 files changed, 511 insertions(+), 454 deletions(-) diff --git a/README.md b/README.md index 8befad8..fe2cdc1 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,22 @@ -# MetaverseTutorials +# Metaverse Tutorials Step by step tutorials for the Metaverse Blockchain -This is a series of Metaverse tutorials. To begin clone this repository - +This is a series of Metaverse tutorials. To begin, clone this repository ``` git clone https://github.com/mvs-org/MetaverseTutorials.git - ``` -navigate to the tutorial directory - +Navigate to the tutorial directory ``` cd MetaverseTutorials ``` -update your repo to the latest version of mvs-blockchain-js +Update your repo to the latest version of mvs-blockchain-js ``` git submodule update --init --recursive ``` Install the metaverse npm package - ``` npm install metaversejs --save ``` @@ -31,49 +27,45 @@ cd mvs-blockchain-js && npm install ``` -Each tutorial builds on the previous ones, so it is recommended to do them in order - -To begin a tutorial navigate to the tutorials folder and follow instructions. +Each tutorial builds on the previous one, so it is recommended to do them in order. Tutorial Information: -These tutorials are designed -* to be simple, no fluff -* hands on -* explain inner workings and give broad understanding of Metaverse blockchain -* Show you step by step how to create dApp on Metaverse. Can also be used to integrate into your existing app. -* provide working examples of what you should have built. -* each tutorial comes with complete solutions to show you how its done in the end. Don't look till you're done! +These tutorials are designed to: +* Be simple, no fluff +* Be hands-on +* Explain the inner workings and give us a broad understanding of the Metaverse blockchain +* Show you step-by-step how to create dApps on Metaverse and how they can be used to integrate into your existing dApp +* Each tutorial comes with complete solutions to show you how it's done in the end. Don't look till you're done! +1. [Integrate Metaverse wallet into your dApp with your DID](tutorials/1-Metaverse-Wallet) +2. [Issue and transfer MST](tutorials/2-Avatars-and-MSTs) +3. [Issue and transfer MIT](tutorials/3-MITs) -1. [Integrate Metaverse wallet into your dapp with your DID](tutorials/1-Metaverse-Wallet) -2. [Issue and transfer MST’s](tutorials/2-Avatars-and-MSTs) -3. [Issue and transfer MIT’s](tutorials/3-MITs) +For more information refer to the [Metaverse Documentation](https://docs.mvs.org/docs/). +Also check out some working examples in the `./examples` folder. -For more information refer to the [Metaverse Documentation](https://docs.mvs.org/docs/) - -Please follow the Environment setup instructions below before starting. +Please follow the "Environment Setup" instructions below before starting. # Environment Setup -Start by entering the "playground" directory. This is where you can build ALL your Metaverse apps during the tutorial. - +Start by entering the `playground` directory. This is where you can build ALL your Metaverse apps during the tutorial. ``` cd tutorials/playground ``` **Interact with metaverse libraries via nodejs** -create a testScript +Create a testScript ``` touch testScript.js ``` -To interact with Metaverse using javascript you can interact with mvs-blockchain-js and metaversejs +To interact with Metaverse using javascript you can interact with `mvs-blockchain-js` and `metaversejs`. -For use in nodejs scripts, import mvs-blockchain from the mvs-blockchain folder, and require metaversjs. +For use in nodejs scripts, import `mvs-blockchain` from the `mvs-blockchain` folder, and require `metaversjs`. -Inside the testscript, add: +Inside the testscript, add the following. You will be using the `blockchain` and `Metaverse` objects later in the other tutorials. ``` //import mvs-blockchain-js @@ -93,13 +85,13 @@ console.log(Metaverse) console.log("Metaversjs has been successfully imported!") ``` -now run +Now run ``` node testScript.js ``` -**Interact with metaverse via webapp** +**Interact with metaverse via web app** First create an html file ``` @@ -118,17 +110,16 @@ and add - ``` -To interact with webapps you must generate "index.js" from mvs-blockchain-js and "metaverse.min.js" from metaversejs. To generate these files you must clone each repository and simply run +To interact with web apps you must generate `index.js` from `mvs-blockchain-js` and `metaverse.min.js` from `metaversejs`. To generate these files you must clone each repository and simply run ``` grunt ``` -This will generate javascript files into the /dist folder that you can import into your app. You don't have to worry about this for now. We have generated these files and placed them in the playground folder. To include them in your webapp just add these script tags into your html page. +This will generate javascript files into the `/dist` folder that you can import into your app. You don't have to worry about this for now. We have generated these files and placed them in the playground folder. To include them in your web app, just add these script tags into your html page. ``` @@ -141,7 +132,6 @@ python -m SimpleHTTPServer 4444 ``` To test that the libraries have been successfully imported into your webpage, open the web console and enter - ``` blockchain = await Blockchain({url: "https://explorer-testnet.mvs.org/api/"}) @@ -150,6 +140,6 @@ blockchain Metaverse ``` -You should see the "blockchain" (from mvs-blockchain-js) and Metaverse (from metaversjs) objects show up in the console. +You should see the "blockchain" (from mvs-blockchain-js) and "Metaverse" (from metaversjs) objects show up in the console. You should now be fully set up and ready to begin [tutorial 1](tutorials/1-Metaverse-Wallet). diff --git a/tutorials/1-Metaverse-Wallet/README.md b/tutorials/1-Metaverse-Wallet/README.md index acc2b14..78bce0b 100644 --- a/tutorials/1-Metaverse-Wallet/README.md +++ b/tutorials/1-Metaverse-Wallet/README.md @@ -1,79 +1,69 @@ # Tutorial 1 - Metaverse Wallet -In this tutorial you will learn how to +In this tutorial you will learn how to: * Create a Metaverse wallet -* Import an Existing wallet +* Import an existing wallet * Check your ETP balance * Send transactions programatically -* Integrate wallet into your dApp +* Integrate a wallet into your dApp ## Introduction -Metaverse is a UTXO based blockchain +Metaverse is an **unspent-transaction-output (UTXO)** based blockchain with ETP being the native currency. It is very similar to the way Bitcoin works. -ETP is the native currency of the Metaverse blockchain. To send and receive ETP you need a Metaverse wallet. - -ETP uses a UTXO based model. This means it is very close to the way Bitcoin works. - -Every time you receive a transaction, it becomes a UTXO. -Every time you send a transaction, you collect UTXO's into a transaction input, +Every time you send a transaction, you collect UTXOs into a transaction input, which becomes a UTXO on the receivers end, and the change left over becomes a UTXO on your end. -If this sounds complicated don't worry. Metaverse's library manages UTXO's for you +Every time you receive a transaction, it's a UTXO you can spend. -For more information on UTXO's look here https://komodoplatform.com/whats-utxo/ +If this sounds complicated, don't worry. Metaverse's library manages UTXOs for you. -In Metaverse, as with Bitcoin, you can generate deterministic wallets using by memnonic code words. This gives you multiple addresses you can send and recieve transactions from. +For more information on UTXOs, [look here](https://komodoplatform.com/whats-utxo/) -## Hands on Tutorial +To send and receive ETP you need a Metaverse wallet. +In Metaverse, as with Bitcoin, you can generate deterministic wallets by using memnonic code words. +This gives you multiple addresses you can send and recieve transactions from. -Note: Explicit detailed instructions are given to work with Metaverse, but not always so with HTML elements. If you get stuck with coding HTML elements, you can always refer to w3schools.com +## Hands-on Tutorial -Start by setting up a directory to work in +Note: Explicit detailed instructions are given to work with Metaverse, but not always so with HTML elements. If you get stuck with coding HTML elements, you can always refer to [w3schools.com](https://www.w3schools.com/) +Start by setting up a directory to work in ``` cd MetaverseTutorials/tutorials/playground touch tut1.html touch tut1.js ``` -Create front end - -Open tut1.html and use this HTML front end as the base of your app. - +Open `tut1.html` and use this HTML front-end as the base of your app. ``` - + Tutorial 1 - +

        Create new Wallet

        -
        -

        Wallet Details


      • Addresses:
      • Check ETP Balance

        -

        Send ETP

        -


        - - + @@ -81,39 +71,32 @@ Open tut1.html and use this HTML front end as the base of your app. You should now be set up to use the Metaverse javascript libraries. We are using the async/await syntax. The await keyword can only be used in async functions so we will create async functions to perform all actions. -First lets define some key variables - +First let's define some key variables ``` -var wallet //An object representing your Metaverse Wallet -var mnemonic //A mnemonic code word used to generate your Wallet -var addresses //An array containing addresses belonging to the wallet -var balances //A JSON object containing Wallet balances - +let wallet //An object representing your Metaverse Wallet +let mnemonic //A mnemonic code word used to generate your Wallet +let addresses //An array containing addresses belonging to the wallet +let balances //A JSON object containing Wallet balances ``` Start by creating a function to generate a new mnemonic - ``` async function generateMnemonic(){ mnemonic = await Metaverse.wallet.generateMnemonic() } - ``` -And a function to create a Wallet from the mnemonic, using the testnet keyword since we're on the testnet. - - +And a function to create a wallet from the mnemonic, using the testnet keyword since we're on the testnet ``` async function createWallet(){ wallet = await Metaverse.wallet.fromMnemonic(mnemonic,'testnet') - addresses = await wallet.getAddresses() // get list of addresses } ``` -Once you've created a wallet you must get some testnet ETP from the testnet faucet. -A function to get Wallet balances +Once you've created a wallet you must get some testnet ETP from the [testnet faucet](https://free.mvs.org/). +A function to get wallet balances. Note: this is the blockchain object you initialized before. ``` async function getETPBalance(){ @@ -133,23 +116,20 @@ async function getETPBalance(){ return ETPBalance } - ``` -And Finally a function to send ETP - +And finally, a function to send ETP ``` - async function sendETP(amount){ -//Define the amount of ETP you want to send -//Measured in ETP units. There are 100 million units per ETP. - var target = { + //Define the amount of ETP you want to send + //Measured in ETP units. There are 100 million units per ETP. + let target = { ETP: 100000000 //100 million units = 1 ETP }; //Define recipient - var recipient_address = "MVbtobP4m44AKsx5PqBbtrBUdycNHxM3eQ"; + recipient_address = "MVbtobP4m44AKsx5PqBbtrBUdycNHxM3eQ"; //Get latest blockchain length let height = await blockchain.height() @@ -165,7 +145,6 @@ async function sendETP(amount){ //Build the transaction object let tx = await Metaverse.transaction_builder.send(result.utxo, recipient_address, undefined, target, result.utxo[0].address, result.change) - //Sign the transaction with your wallet tx = await wallet.sign(tx) @@ -180,17 +159,16 @@ async function sendETP(amount){ //log amount ETP sent to WHO console.log(tx) } - ``` -## Test NodeJS -To test your nodejs code, Create a function called run() and make sure it gets executed in the script. +## Run and Test -For now, since the metaverse faucet is not operational, use this mnemonic: +To test your nodejs code, Create a function called `run()` and make sure it gets executed in the script. -``` -var mnemonic = "van juice oak general lyrics gravity hammer shield over eager crew volume survey join lonely purchase kitten artwork mass cousin process mixture add knife" +You can use this mnemonic if there are still funds left in it. Or generate your own and load some test ETP from the [faucet](https://free.mvs.org/) mentioned above. +``` +let mnemonic = "van juice oak general lyrics gravity hammer shield over eager crew volume survey join lonely purchase kitten artwork mass cousin process mixture add knife" ``` ``` @@ -206,8 +184,7 @@ async function run(){ } ``` -now in your terminal run - +Now in your terminal run ``` node tut1.js ``` @@ -215,33 +192,27 @@ node tut1.js You should see an ETP balance, and a transaction hash in your terminal. You can take the transaction hash and view the transaction in the [Metaverse Testnet Blockchain Explorer](https://explorer-testnet.mvs.org/). -## Connect to Dapp - -To interact with metaversejs in your webapp, you need to reference metaversejs in your HTML. +## Connect to Your DApp +To interact with `metaversejs` in your web app, you need to reference `metaversejs` in your HTML. ``` ``` -Also reference your tut1.js file. - +Also reference your `tut1.js` file. ``` ``` Next serve the webpage with - - ``` -python -m SimpleHTTPServer 3333 +python -m SimpleHTTPServer 4444 ``` +or however you prefer. -or however you prefer - -Verify that you have connected metaverse to the webapp by opening the browser console and typing "Metaverse". You should see the Metaverse object come up and look something like +Verify that you have connected Metaverse to the web app by opening the browser console and typing "Metaverse". You should see the Metaverse object come up. -_TODO: Expand upon once metaversjs referencing is completed_ -Now connect elements to the js functions and youre done! +Now connect elements to the js functions and you're done! -## Whats next? +## What's Next? Continue with the next tutorial and learn how to [issue and transfer Metaverse Smart Token (MST)](../2-Avatars-and-MSTs) \ No newline at end of file diff --git a/tutorials/1-Metaverse-Wallet/index2.html b/tutorials/1-Metaverse-Wallet/index2.html index 579bdd1..3a85b2b 100644 --- a/tutorials/1-Metaverse-Wallet/index2.html +++ b/tutorials/1-Metaverse-Wallet/index2.html @@ -1,4 +1,5 @@ + @@ -9,35 +10,30 @@ + +

        Create new Wallet

        -

        Create new Wallet

        - - - -

        Send ETP

        - - - -

        Check ETP Balance

        +

        Send ETP

        -

        Issue MST

        +

        Check ETP Balance

        -

        Send MST

        +

        Issue MST

        -

        Deposit

        +

        Send MST

        -

        Create Avatar

        +

        Deposit

        -

        Get Avatar

        +

        Create Avatar

        -

        Create MIT

        +

        Get Avatar

        -

        Transfer MIT

        +

        Create MIT

        -

        Send Multisig transaction

        +

        Transfer MIT

        -

        Send Locked Asset

        +

        Send Multisig transaction

        +

        Send Locked Asset

        diff --git a/tutorials/1-Metaverse-Wallet/solution.html b/tutorials/1-Metaverse-Wallet/solution.html index 736ebfe..ff26a31 100644 --- a/tutorials/1-Metaverse-Wallet/solution.html +++ b/tutorials/1-Metaverse-Wallet/solution.html @@ -2,7 +2,7 @@ - + Tutorial 1 @@ -20,27 +20,19 @@
        Mnemonic
        Addresses and Balances
        - - - - + + + +
        AddressBalance
        AddressBalance

        - -

        Send ETP

        -


        - - - - - - + - + \ No newline at end of file diff --git a/tutorials/1-Metaverse-Wallet/solution.js b/tutorials/1-Metaverse-Wallet/solution.js index 430e8ee..4f3d877 100644 --- a/tutorials/1-Metaverse-Wallet/solution.js +++ b/tutorials/1-Metaverse-Wallet/solution.js @@ -3,17 +3,15 @@ // url: "https://explorer-testnet.mvs.org/api/" // }); -var wallet -var mnemonic -var addresses -var balances +let wallet +let mnemonic +let addresses +let balances -var hidden = true +let hidden = true async function initialize(){ blockchain = await Blockchain({url: "https://explorer-testnet.mvs.org/api/"}) - let test = document.getElementById("addressSelect") - console.log(test) } async function generateMnemonic(){ @@ -41,15 +39,15 @@ async function importWallet() { async function showBalances(){ - var balancesTable = document.getElementById("balancesTable"); + let balancesTable = document.getElementById("balancesTable"); for (i = 0; i < addresses.length; ++i) { - var row = balancesTable.insertRow(i+1); + let row = balancesTable.insertRow(i+1); // Insert new cells ( elements) at the 1st and 2nd position of the "new" element: - var cell1 = row.insertCell(0); - var cell2 = row.insertCell(1); + let cell1 = row.insertCell(0); + let cell2 = row.insertCell(1); // Add some text to the new cells: cell1.innerHTML = addresses[i]; @@ -88,34 +86,32 @@ async function populateAddressSelect() { let anyOption = document.createElement("option"); anyOption.value = addresses anyOption.innerHTML = "any" - addressSelect.appendChild(anyOption) for (i = 0; i < addresses.length; ++i) { - var opt = document.createElement("option"); + let opt = document.createElement("option"); opt.value= [addresses[i]]; opt.innerHTML = addresses[i]; - addressSelect.appendChild(opt); } } async function sendETP(){ - let amount = document.getElementById("sendAmount").innerHTML - var target = { + let amount = document.getElementById("sendAmount").value + let recipient_address = document.getElementById("sendTo").value; + recipient_address = recipient_address.toString() + amount = parseInt(amount) + console.log(amount) + let target = { ETP: amount }; - - var recipient_address = document.getElementById("sendTo").innerHTML; - - console.log(amount) console.log(recipient_address) let height = await blockchain.height() let txs = await blockchain.addresses.txs(addresses) //Get all utxo - let utxos = await Metaverse.output.calculateUtxo(txs.transactions, wallet.getAddresses()) + let utxos = await Metaverse.output.calculateUtxo(txs.transactions, addresses) //Collect utxo for given target let result = await Metaverse.output.findUtxo(utxos, target, height) @@ -136,12 +132,10 @@ async function showHide(){ if(hidden){ document.getElementById("mnemonicLabel").innerHTML = mnemonic document.getElementById("showHideMnemnonic").innerHTML = "Hide" - hidden = false; } else{ document.getElementById("mnemonicLabel").innerHTML = "" document.getElementById("showHideMnemnonic").innerHTML = "Show" - hidden = true; } -} +} \ No newline at end of file diff --git a/tutorials/2-Avatars-and-MSTs/README.md b/tutorials/2-Avatars-and-MSTs/README.md index facb0bd..b559324 100644 --- a/tutorials/2-Avatars-and-MSTs/README.md +++ b/tutorials/2-Avatars-and-MSTs/README.md @@ -1,85 +1,72 @@ -# Tutorial 2 - Avatars and Smart Token +# Tutorial 2 - Avatars and Metaverse Smart Tokens (MST) In this tutorial you will learn how to * Register an Avatar * Verify an Avatar against an address -* Customize and Issue an MST from your Avatar -* Check your MST Balances -* Transfer MST's programatically +* Customize and issue an MST from your Avatar +* Check your MST balances +* Transfer MSTs programatically * Integrate Avatar and MST functionality into your app ## Introduction -Avatars are digital representations of personal Identities that exist on the Metaverse Blockchain -Avatars have an alphanumeric symbol. -Avatars get attached to a Metaverse Address. There can only be one Avatar per address. -ETP and smart tokens can be sent to avatars instead of addresses. -MST's and MIT's can only be issued by Avatars +**Avatars** are digital representations of personal identities -- **digital identitites (DIDs)** -- that exist on the Metaverse Blockchain. +Avatars have unique alphanumeric symbols. An Avatar is attached to exactly one Metaverse address (i.e there can only be at most one Avatar per address). +Transfer of tokens can be done by referring to Avatars instead of addresses. -For more info: https://medium.com/metaverse-blockchain/metaverse-explained-avatars-57be355d42d4 +For more info on Avatars, visit this [article](https://medium.com/metaverse-blockchain/metaverse-explained-avatars-57be355d42d4). -MST's are Metaverse Smart Tokens. MST is Metaverse's fungible token standard. MST's can be seen as subcurrencies on the Metaverse Blockchain. -It costs 10 ETP to create an MST. MST's must be issued by an avatar. +**Metaverse Smart Token (MST)** is Metaverse's fungible token standard. MSTs can be seen as sub-currencies on the Metaverse Blockchain. +It costs 10 ETP to create an MST. The creation and issuance of an MST must be done through an Avatar (i.e. to issue a token, you can't just use a Metaverse address that's not already tied to an Avatar). +Again, ETP and other Metaverse Smart Tokens (MSTs) can be sent to Avatars instead of addresses. -Avatar certifications +There are other things an Avatar can or cannot do and such limitations are defined through a system of **Certificates**. There are three types of certificates on Metaverse: Domain Certificate, Secondary Issue Certificate and Naming Certificate. For more details on what they do, check out this [article](https://medium.com/metaverse-blockchain/metaverse-explained-certificates-b84767d1ae8f). -## Hands on Tutorial - -First lets create an html front end +## Hands-on Tutorial +First let's create an html front-end ``` - + Tutorial 2

        Register Avatar

        - -

        Issue MST

        -
        - -

        Balances

        - - - - - + + + + +
        MSTIssuerAmount
        MSTIssuerAmount

        Send MST

        -

        - ``` -nodejs - -Create a function to register your avatar. - +Now, create a function to register your Avatar. Remember, you'll have to initialize the `wallet` object first (see the previous tutorial). ``` async function registerAvatar(avatar_name,avatar_address) { - let change_address = avatar_address let height = await blockchain.height() let txs = await blockchain.addresses.txs([avatar_address]) @@ -91,99 +78,84 @@ async function registerAvatar(avatar_name,avatar_address) { tx = await tx.toString('hex') tx = await blockchain.transaction.broadcast(tx) } - ``` Create a function to look up an avatar address - ``` function getAvatar(avatar) { return blockchain.avatar.get(avatar); } ``` - Create a function to issue an MST - ``` - -async function issueMST(issuer,symbol,max_supply,decimalPrecision,issuer,description){ - - - - var recipient_address = issuer; - var change_address = issuer; - - - let wallet = await Metaverse.wallet.fromMnemonic("lunar there win define minor shadow damage lounge bitter abstract sail alcohol yellow left lift vapor tourist rent gloom sustain gym dry congress zero") +async function issueMST(issuer,symbol,max_supply,decimalPrecision,description){ + let issuingAddress = await getAvatar(issuer) + let recipient_address = issuingAddress; + let change_address = issuingAddress; + let height = await blockchain.height() + console.log(issuingAddress) let txs = await blockchain.addresses.txs(wallet.getAddresses()) - let utxos = await Metaverse.transaction_builder.calculateUtxo(txs.transactions, wallet.getAddresses()) //Get all utxo - let result = await Metaverse.transaction_builder.findUtxo(utxos, {}, Metaverse.transaction.ASSET_ISSUE_DEFAULT_FEE) //Collect utxo for given target - let tx = await Metaverse.transaction_builder.issue(result.utxo, recipient_address, symbol, max_supply, precision, issuer, description, change_address, result.change) + let utxos = await Metaverse.output.calculateUtxo(txs.transactions, wallet.getAddresses()) //Get all utxo + let result = await Metaverse.output.findUtxo(utxos, {}, height, 1000000000) //Collect utxo to pay for the fee of 10 ETP + let tx = await Metaverse.transaction_builder.issueAsset(result.utxo, recipient_address, symbol, max_supply, precision, issuer, description, 0,false, change_address, result.change,true,0,'testnet',null,undefined) tx = await wallet.sign(tx) tx = await tx.encode() - console.log(tx.toString('hex')); - + tx = await tx.toString('hex') + tx = await blockchain.transaction.broadcast(tx) + console.log(tx); } - ``` -Create a function to get MST balance - +Create a function to get your MST balance ``` - async function getBalances(){ let wallet = await Metaverse.wallet.fromMnemonic(mnemonic, 'testnet') let height = await blockchain.height() let addresses = wallet.getAddresses() let txs = await blockchain.addresses.txs(addresses) - let utxo = await Metaverse.output.calculateUtxo(txs.transactions, wallet.getAddresses()) let balances = await blockchain.balance.all(utxo, wallet.getAddresses(), height) console.log(balances.MST) - } ``` - -Create a function to transfer MST's - +Create a function to transfer MSTs ``` -async function transferMST() { +async function transferMST(amount,recipient_address,MSTSymbol) { + amount = parseInt(amount) + recipient_address = await getAvatar(recipient_address) + let target = {}; + target[MSTSymbol] = amount + console.log(target) + change_address = wallet.getAddress(0) let height = await blockchain.height() - let txs = await blockchain.addresses.txs(["tDZ5YMLJ3z6VbvAsX1c8oe9hJ2nND4jszz", "t85Hm2nYwQXrry2cVmEHPq8krRdJ7KYjmq"]) - let utxos = await Metaverse.output.calculateUtxo(txs.transactions, ["tDZ5YMLJ3z6VbvAsX1c8oe9hJ2nND4jszz", "t85Hm2nYwQXrry2cVmEHPq8krRdJ7KYjmq"])) //Get all utxo - let result = await Metaverse.output.findUtxo(utxos, target, height)) //Collect utxo for given target - let tx = await Metaverse.transaction_builder.send(result.utxo, recipient_address, undefined, target, change_address, result.change)) - tx = await wallet.sign(tx)) - tx = await tx.encode()) - tx = await blockchain.transaction.broadcast(tx.toString('hex'))) - + let txs = await blockchain.addresses.txs(wallet.getAddresses()) + let utxos = await Metaverse.output.calculateUtxo(txs.transactions, wallet.getAddresses()) //Get all utxo + let result = await Metaverse.output.findUtxo(utxos, target, height) //Collect utxo for given target + let tx = await Metaverse.transaction_builder.send(result.utxo, recipient_address, undefined, target, change_address, result.change) + tx = await wallet.sign(tx) + tx = await tx.encode() + tx = await blockchain.transaction.broadcast(tx.toString('hex')) + console.log(tx) } - ``` -## Connect to your dApp - -To interact with metaversejs in your webapp, you need to reference metaversejs in your HTML. +## Connect to Your DApp +To interact with `metaversejs` in your webapp, you need to reference `metaversejs` in your HTML. ``` - - ``` -Also reference your tut2.js file. - +Also reference your `tut2.js` file. ``` - - ``` -Verify that you have connected metaverse to the webapp by opening the browser console and typing "Metaverse". You should see the Metaverse object come up and look something like +Verify that you have connected metaverse to the webapp by opening the browser console and typing "Metaverse". You should see the Metaverse object come up. -Next connect elements to the js functions and youre done! +Next connect elements to the js functions and you're done! -## Whats next? +## What's Next? Continue with the next tutorial and learn how to work with [Metaverse Identifiable Token (MIT)](../3-MITs) diff --git a/tutorials/2-Avatars-and-MSTs/solution.html b/tutorials/2-Avatars-and-MSTs/solution.html index ee70fd7..66b8564 100644 --- a/tutorials/2-Avatars-and-MSTs/solution.html +++ b/tutorials/2-Avatars-and-MSTs/solution.html @@ -2,60 +2,53 @@ - + Tutorial 2 - -

        Register Avatar