<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>0xZOZ</title>
        <link>https://paragraph.com/@zoz</link>
        <description>👋 Hi, I’m @0xzoz
👀 I’m interested in genart | web3 | algo stables...
🌱 PP created by abraham.ai
📫 reach me zeroexzoz@gmail.com | zoz.eth</description>
        <lastBuildDate>Thu, 18 Jun 2026 03:18:52 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>0xZOZ</title>
            <url>https://storage.googleapis.com/papyrus_images/e4ec4b4558ba864b63d6302e771b5a38cfa2a226f646e9ddaedb3ac7260a01c1.png</url>
            <link>https://paragraph.com/@zoz</link>
        </image>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[Learning to be Artificial]]></title>
            <link>https://paragraph.com/@zoz/learning-to-be-artificial</link>
            <guid>WhcAHXTappSV2yk6AYzX</guid>
            <pubDate>Tue, 06 Dec 2022 03:27:20 GMT</pubDate>
            <description><![CDATA[The goal was always to automate, The reality is closer than imaginedThe TaskIt can be challenging to groom an AI to create content with a certain flair or flavor from a small amount of previously generated content. In general, the more data the AI has to work with, the better it will be able to learn the patterns and characteristics that define the desired style. With a small amount of data, it may be difficult for the AI to fully understand the nuances of the desired style, which can lead to...]]></description>
            <content:encoded><![CDATA[<h2 id="h-the-goal-was-always-to-automate-the-reality-is-closer-than-imagined" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">The goal was always to automate, The reality is closer than imagined</h2><hr><h2 id="h-the-task" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">The Task</h2><p>It can be challenging to groom an AI to create content with a certain flair or flavor from a small amount of previously generated content. In general, the more data the AI has to work with, the better it will be able to learn the patterns and characteristics that define the desired style. With a small amount of data, it may be difficult for the AI to fully understand the nuances of the desired style, which can lead to less accurate and less realistic generated content.</p><p>However, if you only have a small amount of data to work with, there are still some steps you can take to try to improve the quality of the AI&apos;s generated content. One option is to augment your dataset by using techniques like data synthesis or text generation to generate additional training data. This can help the AI learn a wider range of patterns and characteristics, which may improve the quality of the generated content.</p><p>Another option is to use a technique called transfer learning to fine-tune the AI&apos;s existing knowledge to the specific characteristics of your dataset. Transfer learning involves taking a pre-trained AI model that has already learned to generate text, and then adjusting its parameters to better fit the characteristics of your dataset. This can help the AI learn the nuances of the desired style more quickly and effectively, even with a small amount of data.</p><p>It&apos;s important to note that generating content with a certain style or flair is a difficult task, and there are no guarantees that the AI will be able to produce high-quality content with a small amount of training data. You may need to experiment with different techniques and approaches to find the best way to train your AI on your specific dataset.</p><hr><h2 id="h-the-blueprint" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">The Blueprint</h2><ol><li><p>Collect a large dataset of text that has been written in the style you want the AI to learn. This dataset should include a variety of different examples that reflect the full range of patterns and characteristics that define the desired style.</p></li><li><p>Pre-process the dataset by cleaning and organizing the data to make it easier for the AI to learn from. This may include steps like removing punctuation and special characters, tokenizing the text, and converting the words to lowercase.</p></li><li><p>Use a natural language processing (NLP) technique like fine-tuning to train the AI on the dataset. Fine-tuning involves adjusting the AI&apos;s existing parameters, which were learned from a pre-trained model, to better fit the specific characteristics of the new dataset. This can help the AI learn the nuances of the desired style and generate more accurate and realistic content.</p></li><li><p>Test the AI&apos;s performance by having it generate new content and evaluating the results. You can use a variety of metrics to assess the quality of the generated content, such as grammar and spelling, coherence and cohesiveness, and overall fluency and style.</p></li><li><p>Adjust the AI&apos;s training and fine-tuning parameters as needed to improve the quality of the generated content. This may involve experimenting with different NLP techniques, adjusting the size and composition of the training dataset, or using techniques like data augmentation or transfer learning to improve the AI&apos;s ability to learn the desired style.</p></li><li><p>Continue to refine and improve the AI&apos;s performance over time by providing it with additional training data and making adjustments as needed. As the AI becomes more experienced, it should be able to generate higher-quality content that more closely matches the desired style and flair.</p></li></ol><hr><h2 id="h-but-i-dont-have-a-large-dataset" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">But I dont have a Large Dataset</h2><p>If you want to decrease the amount of data needed to train an AI to create content with a certain flair or flavor, you can try using techniques like data augmentation or transfer learning.</p><p>Data augmentation involves generating additional training data based on the existing data you have. This can be done using techniques like text generation or data synthesis, which use AI algorithms to create new text that is similar to the original data. By augmenting your dataset in this way, you can provide the AI with more examples of the desired style, which may improve its ability to learn and generate content with that style.</p><p>Transfer learning involves using a pre-trained AI model that has already learned to generate text, and then fine-tuning its parameters to better fit the characteristics of your dataset. This can help the AI learn the desired style more quickly and effectively, even with a smaller amount of data. By using transfer learning, you can leverage the AI&apos;s existing knowledge to reduce the amount of data needed to train it for a specific task.</p><p>It&apos;s important to note that both of these techniques can be complex and may require specialized expertise to implement effectively. You may want to consult with a professional or conduct some research to learn more about how these techniques work and how to apply them in your specific situation.</p><hr><h2 id="h-best-tools-available" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Best Tools Available</h2><p>There are a number of tools available that can be used to train an AI to create content with a certain flair or flavor. Some of the best tools for this task include natural language processing (NLP) frameworks like TensorFlow, PyTorch, and spaCy, which provide a range of pre-built models and algorithms that can be used to train and fine-tune AI models for text generation tasks.</p><p>Additionally, there are a number of open-source AI models and datasets available that can be used as a starting point for training an AI to generate text with a specific style or flair. For example, the GPT-3 model from OpenAI is a large-scale AI model that has been trained on a massive amount of text data and can be fine-tuned for a variety of natural language processing tasks, including text generation.</p><p>In addition to these tools, there are also a number of specialized AI platforms and services that offer pre-trained models and other resources for training AI models to generate text. For example, OpenAI offers a range of AI models and tools that can be used to train AI models for text generation tasks, and Google Cloud offers a Natural Language API that can be used to analyze and generate text with a specific style or flair.</p><p>Ultimately, the best tools for training an AI to generate content with a certain flair or flavor will depend on your specific needs and goals. You may want to research and experiment with different tools and approaches to find the ones that work best for your situation.</p><hr><h2 id="h-when-will-it-be-commonplace" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">When will it be Commonplace?</h2><p>It is difficult to predict with any certainty when AI-generated content with a specific style or flair will become a normal occurrence. As I mentioned earlier, generating content with a specific flair or flavor is a challenging task, and it may be some time before AI systems are able to produce high-quality content that matches the complexity and nuance of human-generated text.</p><p>Additionally, the use of AI for text generation is a contentious topic, and there are concerns about the potential impact of AI-generated content on industries like journalism and creative writing. It remains to be seen how these concerns will be addressed and how they will affect the future of AI-generated content.</p><p>With that said, AI technology is advancing rapidly, and it is possible that AI-generated content with a specific style or flair could become more common in the coming years. It is also possible that advances in AI technology could lead to the development of new tools and techniques that make it easier to train AI models to generate high-quality content with a specific style or flair. However, it is impossible to predict the exact timeline for these developments with any certainty.</p><h2 id="h-about" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">About</h2><p>The 0xZOZ account that was created at the beginning of 2022 was a way to utilize new tech, try things without judgment, and learn by failing. This whole article apart from the title, subtitles, and this section were created by AI, including the cover image. In early 2022, I knew AI would be a thing, In fact, my profile picture was generated by an AI model. Little did I know of the speed it would progress. Although the output is not perfect, you have to admit it is mindblowing that my idea to conception took less than 10 minutes! I have seen AI tools creep into my daily workflow and inprove efficiency greatly. Be it creating branding images, cover photos or having an assistant helping me code with Githubs co-pilot. These tools are truly amazing.</p><p>While some may see the downstream effects of this devastating for a lot of people and jobs that currently exist. I would argue that it opens doors to creativity people never had at their fingertips like this before. This leads me to the traits that will thrive in this rapidly changing and the ever-evolving world we are entering.</p><p>Creativity and execution.... If you start now, you will be ahead of the curve and have infinite tools available.</p><p>This was the first of many of my experiments incorporating AI into my workflow and fine tuning my ability to create with these new tools.</p>]]></content:encoded>
            <author>zoz@newsletter.paragraph.com (0xZOZ)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/b74932e35e84cf1fd28a36576137d5011bb0d751ae1d1d6e49016b215c6945bd.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Set Up a Move Developer Environment[SUI]]]></title>
            <link>https://paragraph.com/@zoz/set-up-a-move-developer-environment-sui</link>
            <guid>42vkBFTECqhQuSixUKcv</guid>
            <pubDate>Thu, 01 Dec 2022 18:54:29 GMT</pubDate>
            <description><![CDATA[0 - 1 setup instructions to get to have a Sui/Move/React base application to build uponSet Up EnvironmentDownload and install VS CodeDownload and install Move ExtentionInstall Suicargo install --locked --git https://github.com/MystenLabs/sui.git --branch devnet suiInstall Sui WalletCreate Front EndInstall YarnInstall create-react-appCreate App Connection MethodWe will be using Suiet Kit. It is a wallet connection library built specifically for SUI and the most used wallets.You can view a samp...]]></description>
            <content:encoded><![CDATA[<h3 id="h-0-1-setup-instructions-to-get-to-have-a-suimovereact-base-application-to-build-upon" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">0 - 1 setup instructions to get to have a Sui/Move/React base application to build upon</h3><hr><h2 id="h-set-up-environment" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Set Up Environment</h2><ul><li><p>Download and install <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://code.visualstudio.com/download">VS Code</a></p></li><li><p>Download and install <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://marketplace.visualstudio.com/items?itemName=move.move-analyzer">Move Extention</a></p></li><li><p>Install <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.sui.io/devnet/build/install">Sui</a><code>cargo install --locked --git https://github.com/MystenLabs/sui.git --branch devnet sui</code></p></li><li><p>Install <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://chrome.google.com/webstore/detail/sui-wallet/opcgpfmipidbgpenhmajoajpbobppdil">Sui Wallet</a></p></li></ul><hr><h2 id="h-create-front-end" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0"><strong>Create Front End</strong></h2><ul><li><p>Install <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.hostinger.com/tutorials/how-to-install-yarn">Yarn</a></p></li><li><p>Install <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://create-react-app.dev/">create-react-app</a></p></li></ul><hr><h2 id="h-create-app-connection-method" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0"><strong>Create App Connection Method</strong></h2><ul><li><p>We will be using <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://kit.suiet.app/docs/QuickStart">Suiet Kit</a>. It is a wallet connection library built specifically for SUI and the most used wallets.</p></li><li><p>You can view a sample PR <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/0xzoz/wordsuip/commit/ee31b7fb1360cd12c1a7f83334e47432f62311a5">here</a> that will show you how to add it to your application</p></li></ul><hr><h2 id="h-create-move-contracts" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0"><strong>Create Move Contracts</strong></h2><ul><li><p>Develop Modules - can copy/pasta any of <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/MystenLabs/sui/tree/main/sui_programmability/examples">these</a> examples if needed</p></li><li><p>Create a folder in the <code>/src</code> dir of your application and add the modules in a structure like <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/move-language/move/blob/main/language/documentation/book/src/packages.md#package-layout-and-manifest-syntax">this</a></p></li></ul><h2 id="h-testing-and-deploying-locally" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0"><strong>Testing and Deploying Locally</strong></h2><hr><ul><li><p>cd into the package - eg <code>cd /src/contracts/your-package-name</code></p></li><li><p>Build the package - <code>sui move build</code></p></li><li><p>Test the package(there are no tests currently in the example packages) - <code>sui move test</code></p></li></ul><h3 id="h-set-up-local-devnet" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0"><strong>Set Up Local Devnet</strong></h3><blockquote><p><code>sui move</code> does not have a publish function. We will use <code>sui client</code> to interact with a local network we set up below</p></blockquote><ul><li><p>We will now create an extra terminal(<code>Ctrl+`</code> + <code>Ctrl+Shift+`</code>) in VSCode to run the following commands</p><ul><li><p><code>sui genesis --force</code> - This overwrites your current <code>.sui</code> folder at the root of your machine</p></li><li><p><code>sui start</code></p></li></ul></li></ul><blockquote><p>The network that genesis creates includes four validators and five user accounts that contain five coin objects each. We will deploy using one of these accounts but we will also fund a browser wallet to interact as we would in the real world(see below)</p></blockquote><ul><li><p>Move back to your other terminal and publish your project<code>sui client publish --gas-budget 1000</code></p></li></ul><p>You will receive a certificate and the ID’s of the objects published from the package that will look like this</p><pre data-type="codeBlock" text="----- Certificate ----
Transaction Hash: H5mfT9UgoV+qW1kbWXT1HFvWzmSnPCxSgEplu3lI5UM=
Transaction Signature: AA==@Vga6rEHwv+ytGgIjR/krZtQcxAH1VXejqXDpekNWQ4Q/MWmeW+6NnFMvgvdiexJ9aJ0Wei41PxMC8JS6Ee3ICg==@WUoEWyFiMdiC5G4KUvAKKJgI9nks+et6+8qncumfJs4=
Signed Authorities Bitmap: RoaringBitmap&lt;[0, 1, 2]&gt;
Transaction Kind : Publish
----- Transaction Effects ----
Status : Success
Created Objects:
  - ID: 0x77e2392b2d77412b89533d7e5d9c82caed714822 , Owner: Immutable
  - ID: 0x9ada30b2e52c23ea36c9fb7c4905bc58ca44eabc , Owner: Account Address ( 0xf271faa139f3d1c992d43deba597686d392fc39a )
  - ID: 0xa4890ca9d1ba6b871f885fdc92396b8baae52549 , Owner: Shared
Mutated Objects:
  - ID: 0x08af5d44a99e483881c76fb106b025542a48ccec , Owner: Account Address ( 0xf271faa139f3d1c992d43deba597686d392fc39a )
"><code><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span> Certificate <span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span>
Transaction Hash: H5mfT9UgoV<span class="hljs-operator">+</span>qW1kbWXT1HFvWzmSnPCxSgEplu3lI5UM<span class="hljs-operator">=</span>
Transaction Signature: AA<span class="hljs-operator">=</span><span class="hljs-operator">=</span>@Vga6rEHwv<span class="hljs-operator">+</span>ytGgIjR<span class="hljs-operator">/</span>krZtQcxAH1VXejqXDpekNWQ4Q<span class="hljs-operator">/</span>MWmeW<span class="hljs-operator">+</span>6NnFMvgvdiexJ9aJ0Wei41PxMC8JS6Ee3ICg<span class="hljs-operator">=</span><span class="hljs-operator">=</span>@WUoEWyFiMdiC5G4KUvAKKJgI9nks<span class="hljs-operator">+</span>et6<span class="hljs-operator">+</span>8qncumfJs4<span class="hljs-operator">=</span>
Signed Authorities Bitmap: RoaringBitmap<span class="hljs-operator">&#x3C;</span>[<span class="hljs-number">0</span>, <span class="hljs-number">1</span>, <span class="hljs-number">2</span>]<span class="hljs-operator">></span>
Transaction Kind : Publish
<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span> Transaction Effects <span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span>
Status : Success
Created Objects:
  <span class="hljs-operator">-</span> ID: <span class="hljs-number">0x77e2392b2d77412b89533d7e5d9c82caed714822</span> , Owner: Immutable
  <span class="hljs-operator">-</span> ID: <span class="hljs-number">0x9ada30b2e52c23ea36c9fb7c4905bc58ca44eabc</span> , Owner: Account Address ( <span class="hljs-number">0xf271faa139f3d1c992d43deba597686d392fc39a</span> )
  <span class="hljs-operator">-</span> ID: <span class="hljs-number">0xa4890ca9d1ba6b871f885fdc92396b8baae52549</span> , Owner: Shared
Mutated Objects:
  <span class="hljs-operator">-</span> ID: <span class="hljs-number">0x08af5d44a99e483881c76fb106b025542a48ccec</span> , Owner: Account Address ( <span class="hljs-number">0xf271faa139f3d1c992d43deba597686d392fc39a</span> )
</code></pre><blockquote><p>To Note: in this instance we are publishing a module and two structs1. <code>ID: 0x77....822 , Owner: Immutable</code> - The module address as its immutable2. <code>ID: 0x9...abc , Owner: Account Address ( 0xf...39a )</code> - A capability issued by the module on initialization3. <code>ID: 0xa...549 , Owner: Shared</code> - A registry created in the module and is shared</p></blockquote><h3 id="h-fund-your-browser-wallet" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0"><strong>Fund your browser wallet</strong></h3><ol><li><p>Find Sui Gas Object Id<code>sui client objects</code></p></li><li><p>Transfer to your browser wallet<code>sui client transfer --to &lt;BROWSER-WALLET-ADDRESS&gt; --object-id &lt;SUI-GAS-OBJECT-ID&gt; --gas-budget 1000</code></p></li></ol><hr><h2 id="h-interacting-with-your-deployed-modules" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0"><strong>Interacting with your Deployed Modules</strong></h2><ul><li><p>Create a <code>.env</code> file in the root of your project to add the addresses returned. You will need to install a package(<code>env-cmd</code>) and use it when you start your application. This can be done by<code>yarn add env-cmd</code> and then changing your scripts start cmd in package.json to something like this <code>env-cmd -f .env react-scripts start</code></p></li></ul><p><em>Example</em></p><pre data-type="codeBlock" text="REACT_APP_SUI_LOCAL_NETWORK_WORDSUIP_PACKAGE_ADDRESS=0xca32f75d60edbb2bb7057df93b0a29c32f81f670
REACT_APP_SUI_LOCAL_NETWORK_WORDSUIP_USER_MANAGER_CAP_ADDRESS=0xc2fa11f372ebdb056303067deb2174e99f446f4c
REACT_APP_SUI_LOCAL_NETWORK_WORDSUIP_USER_REGISTRY_ADDRESS=0x9088202aa9636adae4af8373a2135ac5e657e1f3

REACT_APP_NETWORK=local # || devnet || testnet || mainnet

REACT_APP_SUI_LOCAL_ENDPOINT=http://127.0.0.1:9000
REACT_APP_SUI_DEVNET_ENDPOINT=https://fullnode.devnet.sui.io
"><code>REACT_APP_SUI_LOCAL_NETWORK_WORDSUIP_PACKAGE_ADDRESS<span class="hljs-operator">=</span><span class="hljs-number">0xca32f75d60edbb2bb7057df93b0a29c32f81f670</span>
REACT_APP_SUI_LOCAL_NETWORK_WORDSUIP_USER_MANAGER_CAP_ADDRESS<span class="hljs-operator">=</span><span class="hljs-number">0xc2fa11f372ebdb056303067deb2174e99f446f4c</span>
REACT_APP_SUI_LOCAL_NETWORK_WORDSUIP_USER_REGISTRY_ADDRESS<span class="hljs-operator">=</span><span class="hljs-number">0x9088202aa9636adae4af8373a2135ac5e657e1f3</span>

REACT_APP_NETWORK<span class="hljs-operator">=</span>local # <span class="hljs-operator">|</span><span class="hljs-operator">|</span> devnet <span class="hljs-operator">|</span><span class="hljs-operator">|</span> testnet <span class="hljs-operator">|</span><span class="hljs-operator">|</span> mainnet

REACT_APP_SUI_LOCAL_ENDPOINT<span class="hljs-operator">=</span>http:<span class="hljs-comment">//127.0.0.1:9000</span>
REACT_APP_SUI_DEVNET_ENDPOINT<span class="hljs-operator">=</span>https:<span class="hljs-comment">//fullnode.devnet.sui.io</span>
</code></pre><h3 id="h-create-client-side-interaction" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0"><strong>Create Client Side Interaction</strong></h3><ul><li><p>Create a folder <code>/hooks</code> and create a file called <code>useSui.tsx</code>. We will use this to store all of the contract interactions client side and be able to use it in our application. An example can be found <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/0xzoz/wordsuip/commit/a933038f2562b76d8a13ea3fc78efe34298f384f">here</a></p></li><li><p>We can now manipulate the UI to utilize this hook and interact with our module on our local network.</p></li><li><p>Open another terminal and start the application. you must be at the root of your create-react-app<code>yarn start</code></p></li></ul><blockquote><p>You should now have 3 terminals open</p><ol><li><p>Sui local network</p></li><li><p>Application</p></li><li><p>An extra one to interact/add packages etc whilst you are working</p></li></ol></blockquote><hr><h2 id="h-resetting-or-changing-the-contract" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0"><strong>Resetting or Changing the Contract</strong></h2><ul><li><p>The idea of this developer environment is to be able to streamline our ability to develop Move applications. You can follow these steps to demolish your existing setup, make changes, redeploy and test.</p></li></ul><ol><li><p>Stop Sui local network in your Sui terminal</p></li><li><p>Nuke the db - <code>sui genesis --force</code></p></li><li><p>Restart Sui local network - <code>sui start</code></p></li><li><p>Make your desired changes in your contract, UI or both</p></li><li><p>Redeploy your contract - <code>sui client publish --gas-budget 1000</code></p></li><li><p>Change your <code>.env</code> variables with the new addresses</p></li><li><p>Stop and Restart your application to recognize these changes CTRL + C and <code>yarn start</code></p></li><li><p>Send Sui Gas to your browser wallet</p></li></ol><h3 id="h-test-away-watch-out-for-scaffold-movexyz" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">TEST AWAY! Watch out for scaffold-move.xyz!</h3>]]></content:encoded>
            <author>zoz@newsletter.paragraph.com (0xZOZ)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/f30dffcffc5850c32a5c39cda39566b549337e373359dfc0e6dee1f0244b546c.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[ Boomer | Woke | Up]]></title>
            <link>https://paragraph.com/@zoz/boomer-woke-up</link>
            <guid>LtgDSSetH6NtAeIikYRX</guid>
            <pubDate>Tue, 29 Nov 2022 05:16:55 GMT</pubDate>
            <description><![CDATA[Why the next time you hear about Crypto/Web3/[insert next narrative], it will be the last.BOOMERS are the Generation that will be last to decide whether there is a use case within crypto that will impact normal life or it will impact normal life without them noticing. WOKES are the culture that has fought for so long to discredit the idea, industry, and movement. They will realize that pieces are being built and are useful to help the rights that they/them/all stand for. UP ONLY** **started a...]]></description>
            <content:encoded><![CDATA[<h3 id="h-why-the-next-time-you-hear-about-cryptoweb3insert-next-narrative-it-will-be-the-last" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Why the next time you hear about Crypto/Web3/[insert next narrative], it will be the last.</h3><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://en.wikipedia.org/wiki/Baby_boomers"><strong>BOOMERS</strong></a> are the Generation that will be last to decide whether there is a use case within crypto that will impact normal life or it will impact normal life without them noticing. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://en.wikipedia.org/wiki/Woke"><strong>WOKES</strong></a> are the culture that has fought for so long to discredit the idea, industry, and movement. They will realize that pieces are being built and are useful to help the rights that they/them/all stand for. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://uponly.tv/"><strong>UP ONLY</strong></a>** **started as a meme during the largest bull market the industry has seen thus far but is smarter than it seems, while commonly seen as a reference to <em>$$$</em> value, it actually represents <em>PROGRESS</em></p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/8eeac6ad20964a07624c847429796672.png" alt="" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><hr><h3 id="h-boomers-wokes-up-only" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">boomers + wokes = up only</h3><p>We will describe here a glimmer of hope as we crawl our way out of the deep dark hole of <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.nerdwallet.com/article/investing/crypto-winter">deceit, lies, and mismanagement that has crippled trust in the crypto industry during 2022</a>. We will give a recap of the previous cycles of innovation and how each led to attracting a new &apos;type&apos; of individual and the next &apos;type&apos; was dependent on the last.</p><p>Subsequently, we will then present why the next wave of participants and their cohorts/alignments is the last frontier before we see the new tech/old tech merge and it no longer being contested.</p><h2 id="h-recap-of-previous-cycles" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Recap of previous cycles</h2><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.bullionstar.com/blogs/ronan-manly/dawn-of-bitcoin-price-discovery-2009-2011-the-very-early-bitcoin-exchanges/"><strong>2009 - 2011</strong></a></p><p>From the inception of Bitcoin and the industry to being talked about more broadly as a larger group. This was the progression from specialists to the broader range of their peers. Still very nascent but a few articles were in the media and knowledge spread outside of the core group of &apos;founders&apos;.</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://money.cnn.com/2013/04/12/investing/bitcoin-bubble/index.html"><strong>2011-2013</strong></a></p><p>More common now that it had its core group of specialist followers that would spread the word outside of their circles. As you imagine, the circles of the core knowledge demographic were directly related to tech workers. The growth of the following subset was wider-reaching than mostly specialists to a collection of tech workers, entrepreneurs, and hobbyists.</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://cointelegraph.com/news/record-breaking-2017-brought-bitcoin-altcoins-drastically-increased-mainstream-acceptance"><strong>2013-2017</strong></a></p><p>There was now a very diverse cohort that had tentacles across all cultures. The epochal explosion the industry would need to take it to just over saturation point. This was the moment that those unfamiliar with tech got their first glimpse of the tech in a prehistoric operating state. Nevertheless, with value tied to tech, it drew in speculators from all walks of life. Not many would stay but enough to kindle the fire.</p><p><strong>2018 - 2021</strong></p><p>While there were now believers from all walks of life, these were few and far between in their relative groups. Likely not taken seriously by their peers depending on the lifestyles they were associated with. This was about to change as some breakthrough <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://en.wikipedia.org/wiki/Meme"><em>MEMES</em></a> <em>would entrench cultures and fully grasp the mindset of the next generations. We went fully mainstream this last cycle, </em><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.theverge.com/22310188/nft-explainer-what-is-blockchain-crypto-art-faq"><em>NFT&apos;s</em></a> brought artists, trendsetters, and a culture of creators. Meanwhile, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://ethereum.org/en/defi/"><em>DeFi</em></a> *captured <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://coinflex.com/education/what-is-tradfi/">TradFi&apos;s</a> mind and showed that finance could be much more lightweight and transparent. We now have enough mindshare that the inevitability of this technology being intertwined into every aspect of our lives is only a matter of time. It just doesn&apos;t seem that way to most</p><h2 id="h-whats-next" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">What&apos;s Next?</h2><p>There is still some pushback, especially after the very public blow-ups the industry saw in 2022. These come from what we will define as the last two big bosses due to their authority within the world. We will describe their reluctance, the importance, and what brings them on board over the next years.</p><h3 id="h-boomer" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Boomer</h3><p><strong>The Demographic:</strong> Ah, the Baby Boomers(people born from 1946 to 1964)! They come of age in the largest boom we have seen in the last few centuries. Where technology got exponentially better, but they were always slow to pick it up due to the world they were born in that was basically computer free. While life was humbler then, with less focus outside your given immediate environment. Crypto as a whole doesn&apos;t really make sense to the broader selection of the boomers and for due right. Why would something that is not tangible or is stored as bits be valuable outside of its realm? The world is fine as it is, the bank holds my money, I go to the grocery store to use that money, I use the apps on my devices and they work. These are all valid points and even more so conditioned thinking from deceptive behavior. It didn&apos;t all start out like this but incentives were aligned to create this end product.</p><p>This changes in the coming years as the younger generations that are digitally native start exposing the hidden obscure intricacies that can only be discovered by fresh eyes the systems that themselves were not built for. As the wool begins to be removed from their vision they will reluctantly need an alternative that can help them navigate. As the population ages, some adopt, others pass, and they will be the last to have fully known life before a percentage of their time was spent digitally and therefore understand the need for the tools that were being built from 2009 - the present.</p><h3 id="h-woke" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Woke</h3><p><strong>The Culture:</strong> While we have seen widespread diversification of participants across the globe, so too has a culture that the overwhelming majority also viscerally <em>HATES</em> crypto. Woke culture has intercepted our world as a whole for better or worse. Some of the brightest minds subscribe to these ideals and want fairness in this world that ironically only crypto natives can appreciate. So why the disdain towards the industry? Well, we only have to look at the biggest feature of the technology, assigning value to bits and bytes! If you can theoretically produce value from nothing with relative ease, you attract opportunistic actors with questionable morals. What is the biggest feature is also the largest bug. With each cycle, there is around a 5% efficacy rate(a totally made-up number but you get the point) of users that stay after the trip. The other tourists go back to their daily lives either wrecked from the debris created by the demolishment of exuberance from months/year prior or simply bored from the lack of dopamine hits.</p><p>Why wouldn&apos;t they hate it with all that said? Of course they would but it&apos;s easy to dismiss the beauty of the bee after getting stung. What is missing is the path from reaction to revelation, once enough people can articulate the benefits that could be conceived from the toolkit. There is a realization that the same battles they fight could be prevented by embedding mechanisms into our digital infrastructure. Instead of fighting the issues, they could help rebuild from the ground up</p><h3 id="h-up" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Up</h3><p><strong>The Meme:</strong> In early 2021 a podcast was created and the name became a meme. Up Only was synonymous with the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.youtube.com/watch?v=A-U7JWz8dR4">Zhupercycle</a>, another meme created in a subsequent episode of the podcast. While only an idea(false but relevant at the time) it quickly became a belief for many as memories fade of the pain that was endured during the off years. Hell, maybe the majority had never felt the pain and was ignorant to the struggles OG&apos;s had suffered(they were just lucky after all). Yet in 2022, many of the believers got to feel that pain. Even the creator of the Zhupercycle meme was too long and ultimately lost everything.</p><p>While the money has evaporated, let&apos;s take a look to see if there is anything that still resembles an up-and-to-the-right chart. One particular metric always increases but it&apos;s not easy to see unless you have spent time on the ground. Developers, ideas, and projects always increase. If you are developing in the space you know that there is always work for talented individuals. Ironically we still are up only but most people don&apos;t realize it yet. The most active development is even happening on projects that have either just launched or haven&apos;t launched yet. A quick look at the most active <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/trending/rust?since=monthly">Rust repositories</a> over the last month shows two crypto projects in the top 5 - <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://sui.io/">Sui</a> and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.aleo.org/">Aleo</a>.</p><p>Just as DeFi was born at a time when most had identified the space as dead. In the next 2 years, we will open up scalable infrastructure, polished products, abstraction of clunky artifacts, and a narrative that you least expect will pop up that will seem dumb at first to most. In previous cycles it was conceivable to have a grasp of everything that was happening in the crypto world but this is no longer true. One can only meaningfully keep up with a couple of projects at a time, let alone ecosystems and frameworks.</p><p>Web2 companies now all have entire teams and products being built around Web3. With industry skeletons coming out of the closet in 2022, being transparent, not blindly trusting entities and a more resilient DeFi3.0 will be the norm.</p><p>The next time you hear the word crypto in an intriguing light will be the last. With the two bosses eventually slayed in the coming years. The technology will fully infiltrate society.</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.urbandictionary.com/define.php?term=wagmi">Wagmi?</a> No, but it was never about making it. It was allowing everyone to have the tools to be on equal footing and not allow corruption by default. An unpopular opinion is the items that occurred in 2022 were actually the most beneficial over the last couple of years. It&apos;s darkest at dawn.</p><h3 id="h-cover-image" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Cover Image</h3><hr><p>The image above(like my PP) is created with <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://abraham.ai/">abraham.ai</a> - an AI artwork generator</p><p><strong>SEED:</strong> Boomer woke up</p><h3 id="h-about" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">About</h3><hr><p><em>Twitter:</em> @0xzoz</p><p><em>GitHub:</em> @0xzoz</p><p><em>Mirror:</em> @0xzoz</p><p><em>Discord:</em> @zoz.eth#6952</p><hr><p><strong>ENS: zoz.eth</strong></p>]]></content:encoded>
            <author>zoz@newsletter.paragraph.com (0xZOZ)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/0f8f3f69d053eef63dbd333cd6d84ce567adbc5f0aee98072b29210f61bd8ace.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Automate Sui Full Node Deployment]]></title>
            <link>https://paragraph.com/@zoz/automate-sui-full-node-deployment</link>
            <guid>598mci1ZEZBxllYJXpKp</guid>
            <pubDate>Mon, 07 Nov 2022 21:35:28 GMT</pubDate>
            <description><![CDATA[MotivationMaintaining a blockchain network node or validator is a lot of work to initially set up. Depending on the network there are varying levels of system administration work that needs to be done. Early in the life of a network, you will usually have to deploy the same infrastructure over and over again. At the start of my journey validating blockchain protocols, Luke Youngblood had a quote from Elon Musk that he mentioned in a talk that stuck with me "Build the machine that builds the m...]]></description>
            <content:encoded><![CDATA[<h2 id="h-motivation" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Motivation</h2><hr><p>Maintaining a blockchain network node or validator is a lot of work to initially set up. Depending on the network there are varying levels of system administration work that needs to be done. Early in the life of a network, you will usually have to deploy the same infrastructure over and over again. At the start of my journey validating blockchain protocols, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/LukeYoungblood">Luke Youngblood </a>had a quote from <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/elonmusk">Elon Musk</a> that he mentioned in a talk that stuck with me &quot;<em>Build the machine that builds the machines</em>&quot;. Over the years I have toyed with various different infrastructure provisioning automation from pure <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.shellscript.sh/">shell scripts</a> to complex <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.terraform.io/">Terraform</a> deployments.</p><p>With the release of a new network - <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://sui.io/">Sui</a> and the start of their <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://sui.io/resources-sui/announcing-sui-incentivized-testnet/">testnet</a> it seems like a good idea to build out the infrastructure deployment from scratch to help validators and full node operators while learning a new tool - <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.ansible.com/">Ansible</a>.</p><p>This tutorial is to show the base structure to set up ansible to build the Sui program and configure a machine while showing the reader how the pieces intertwine. It will also act as an explainer of the key concepts of Ansible.</p><h2 id="h-pr" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">PR</h2><hr><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/0xzoz/sui-node-automation/pull/1">https://github.com/0xzoz/sui-node-automation/pull/1</a></p><h2 id="h-techproduct" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Tech/Product</h2><hr><h3 id="h-sui" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Sui</h3><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://sui.io/">Sui</a> is a blockchain network that is being developed by <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://mystenlabs.com/">Mysten Labs</a>. Mysten Labs consists of some of the core engineers from <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.meta.com/ca/">Meta&apos;s</a> defunct <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.diem.com/en-us/">Diem/Move</a> project, including the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/b1ackd0g">creator</a> of the Move language. It is some of the most exciting tech in the blockchain space and is being built from the ground up factoring in the learnings from the development of Diem/Move. It also sets out to address some of the issues with the existing protocols and languages within the industry at present.</p><p>The platform claims to offer unprecedented low latency and scalability for straightforward use cases. This is achievable since the platform enables the capability of parallel transactions. Consequently, Sui can use processing resources more efficiently. With over $300 million in funding since its inception under a year ago, it is one of the most anticipated L1&apos;s to come out since Ethereum.</p><h3 id="h-ansible" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Ansible</h3><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.ansible.com/">Ansible</a> is a software tool that provides simple but powerful automation for cross-platform computer support. It is primarily intended for IT professionals, who use it for application deployment, updates on workstations and servers, cloud provisioning, configuration management, intra-service orchestration, and nearly anything a systems administrator does on a weekly or daily basis. Ansible doesn&apos;t depend on agent software and has no additional security infrastructure, so it&apos;s easy to deploy.</p><p>It works by having a control node and managed nodes. The control node runs ansible and provisions the managed nodes. the control node sends modules to the managed nodes to execute via an ssh connection.</p><p>The best part is the composability of the platform allowing the user to package up multiple modules to be used in different applications. With the ability to connect your previously built legos, it drastically speeds up the development process and leaves little room for human error.</p><h2 id="h-scope" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Scope</h2><hr><p>Because there is little information about validator operation and workflow in the Sui ecosystem at this stage, this PR is intended to be a base that can be built upon. Eventually, this will be a repository that any user wishing to run a full node, operate a validator, perform validator operations safely and monitor the node. All from a control machine with one-line commands.</p><p>We want this particular PR to allow a user to clone the repository, make a few minor changes and be able to deploy a full node with only one command. It will provision the target machine, build the Sui program and configure it as a systemd service and then start the service.</p><p>Subsequent articles will go into detail about running a validator, adding monitoring etc.</p><h2 id="h-commits" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Commits</h2><hr><ol><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/0xzoz/sui-node-automation/pull/1/commits/5d12c29b65791e375578cd66a7d15a8228b9dd4f"><em>Add folder structure</em></a></p><p>We want to add a folder structure that relates to the ansible framework. Below will show the outlined structure to help give context as empty folders do not show on git commits.</p><pre data-type="codeBlock" text="├── group_vars (keep the variables for items that will be used multiple times) 
│   └── all
├── roles  (An ansible role is way to keep related files for a playbook together)
│   └── sui_fullnode (our first role we will be working with)
│       └── tasks (a place to store tasks, usually a file in tasks bundles related sub tasks)
│       └── templates (a place to store templates of files to add to your target machine)
├── inventory.yml.sample (a basic inventory template with the key/values we need for our instance) 
├── LICENSE
└── README.md
"><code>├── group_vars (keep the variables for items that will be used multiple times) 
│   └── <span class="hljs-attribute">all</span>
├── roles  (An ansible role is way <span class="hljs-selector-tag">to</span> keep related files for <span class="hljs-selector-tag">a</span> playbook together)
│   └── sui_fullnode (our first role we will be working with)
│       └── tasks (<span class="hljs-selector-tag">a</span> place <span class="hljs-selector-tag">to</span> store tasks, usually <span class="hljs-selector-tag">a</span> file in tasks bundles related sub tasks)
│       └── templates (<span class="hljs-selector-tag">a</span> place <span class="hljs-selector-tag">to</span> store templates of files <span class="hljs-selector-tag">to</span> add <span class="hljs-selector-tag">to</span> your target machine)
├── inventory<span class="hljs-selector-class">.yml</span><span class="hljs-selector-class">.sample</span> (<span class="hljs-selector-tag">a</span> basic inventory template with the key/values we need for our instance) 
├── LICENSE
└── README<span class="hljs-selector-class">.md</span>
</code></pre></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/0xzoz/sui-node-automation/pull/1/commits/7e8e62a670a575fcf5e99d017e5bbcc6eee4d74b"><em>Add docs, sample inventory and license</em></a></p><p>We want to add documentation to guide users cloning this repo on how to do a couple of items:</p><ul><li><p>Configure their <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.ansible.com/ansible/latest/network/getting_started/basic_concepts.html#control-node">control machine</a></p></li><li><p>Set up ssh keys to connect from the control machine to the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.ansible.com/ansible/latest/network/getting_started/basic_concepts.html#managed-nodes">managed nodes</a></p></li><li><p>Create their <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.ansible.com/ansible/latest/network/getting_started/basic_concepts.html#inventory">inventory</a></p></li><li><p>Provision and start their node.</p></li></ul><p>We also want to add the sample inventory key/values that the user will want to copy and configure.</p><p>Lastly, we will want to add a license to our repo that will allow this code to be forked and utilized by others. We choose the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://opensource.org/licenses/MIT">MIT open source license</a> because we ❤️ OS and believe that software is a public good.</p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/0xzoz/sui-node-automation/pull/1/commits/65917a545bc67cd1dcdba7080ecd67180de984a4">Add variables</a></p><p>We want to add any common <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html">variables</a> that we will be using across our <code>sui_fullnode</code> role(and eventually other roles) to a file within the group vars folder. We have added the <code>all</code> subfolder as these will be used across all the <em>eventual</em> roles we will create.</p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/0xzoz/sui-node-automation/pull/1/commits/080f977fed2e8bee95d2dc2561a86a689ea73e12">Add templates</a></p><p>Ansible uses <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.ansible.com/ansible/latest/user_guide/playbooks_templating.html">templates</a> to create new files on the nodes using predefined models based on the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.ansible.com/ansible/latest/user_guide/playbooks_templating.html">Jinja2 templating</a> system. Templates are commonly used to configure services based on variable values that can be set up on the playbook itself, in included variable files, or obtained via <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.digitalocean.com/community/tutorial_series/how-to-write-ansible-playbooks#how-to-access-system-information-(facts)-in-ansible-playbooks">facts</a>. This enables you to create more versatile setups that adapt behaviour based on dynamic information.</p><p>Here we create two templates:</p><ul><li><p>Sui fullnode yaml: We want to have the fullnode yaml file stored here to populate with our preferred config</p></li><li><p>Sui systemd file: We want to have a systemd that our playbook can use to create a systemd service for our node.</p></li></ul></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/0xzoz/sui-node-automation/pull/1/commits/e193f6ce94e9f589dc93cbb1c1756471e27c2386"><em>Add build task</em></a></p><p>Now to the juicy stuff! These task folders bundle a specific set of sub-tasks(<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.ansible.com/ansible/latest/user_guide/modules_intro.html">modules</a>) related to the parent task. In this case, it is setting up our Sui environment and building the source(Sui is a spaceship so be prepared to wait while it builds 🚀). Ansible has two types of modules you can use for tasks - <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.ansible.com/ansible/latest/collections/ansible/builtin/index.html">builtin</a> and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.ansible.com/ansible/2.6/modules/community_maintained.html">community</a>. BuiltIn are maintained by ansible and you can expect them to be in working condition, community modules can be developed by anyone and should be reviewed before using them. Modules are a way to complete specific actions, an example would be downloading apt packages which would look like the following:</p><pre data-type="codeBlock" text="- name: install apt packages required for building sui binary
  apt:
    install_recommends: no
    force: yes
    name:
      - curl
      - git-all
      - libssl-dev
      - libclang-dev
      - tzdata
      - ca-certificates
      - build-essential
      - pkg-config
      - cmake
      - acl   # needed to prevent errors when building as unprivileged user via become
    state: present
    update_cache: yes
"><code><span class="hljs-operator">-</span> name: install apt packages required <span class="hljs-keyword">for</span> building sui binary
  apt:
    install_recommends: no
    force: yes
    name:
      <span class="hljs-operator">-</span> curl
      <span class="hljs-operator">-</span> git<span class="hljs-operator">-</span>all
      <span class="hljs-operator">-</span> libssl<span class="hljs-operator">-</span>dev
      <span class="hljs-operator">-</span> libclang<span class="hljs-operator">-</span>dev
      <span class="hljs-operator">-</span> tzdata
      <span class="hljs-operator">-</span> ca<span class="hljs-operator">-</span>certificates
      <span class="hljs-operator">-</span> build<span class="hljs-operator">-</span>essential
      <span class="hljs-operator">-</span> pkg<span class="hljs-operator">-</span>config
      <span class="hljs-operator">-</span> cmake
      <span class="hljs-operator">-</span> acl   # needed to prevent errors when building <span class="hljs-keyword">as</span> unprivileged user via become
    state: present
    update_cache: yes
</code></pre><p>Here is the order of tasks we will be doing in this build document and the modules they are utilizing:</p><ul><li><p>Create an unprivileged sui user - (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.ansible.com/ansible/latest/collections/ansible/builtin/user_module.html">user module</a>)</p></li><li><p>Check if cargo is installed - (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.ansible.com/ansible/latest/collections/ansible/builtin/shell_module.html">shell module</a>)**</p></li><li><p>Download rust Installer - (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.ansible.com/ansible/latest/collections/ansible/builtin/get_url_module.html">get_url module</a>)</p></li><li><p>Install rust/cargo - (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.ansible.com/ansible/latest/collections/ansible/builtin/shell_module.html">shell module</a>)</p></li><li><p>Update bashrc for rust/cargo for sui user - (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.ansible.com/ansible/latest/collections/ansible/builtin/lineinfile_module.html">lineinfile module</a>)</p></li><li><p>Update apt-get repo and cache - (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.ansible.com/ansible/latest/collections/ansible/builtin/apt_module.html">apt module</a>)</p></li><li><p>install apt packages required for building sui binary - (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.ansible.com/ansible/latest/collections/ansible/builtin/apt_module.html">apt module</a>)</p></li><li><p>Check if sui is installed - (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.ansible.com/ansible/latest/collections/ansible/builtin/shell_module.html">shell module</a>) <em>Note: notice the two different ways of using shell</em></p></li><li><p>Install sui - (shell module) <em>Note: notice the two different ways of using shell</em></p></li></ul></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/0xzoz/sui-node-automation/pull/1/commits/a6edab4b8c6660d3a99136831f758322156b3645"><em>Add sui configuration task</em></a></p><p>This file pulls the most recent sui repository from the devnet branch(not necessary but I added it anyhow) and configures your node with a <code>fullnode.yaml</code> file and the genesis.blob.</p><p>Here is the order of tasks we will be doing in this build document and the modules they are utilizing:</p><ul><li><p>Clone the SUI repo - (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.ansible.com/ansible/latest/collections/ansible/builtin/git_module.html">git module</a>)</p></li><li><p>Creates fullnode directory- (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.ansible.com/ansible/latest/collections/ansible/builtin/file_module.html">file module</a>)</p></li><li><p>Copy fullnode yaml file - (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.ansible.com/ansible/latest/collections/ansible/builtin/template_module.html">template module</a>)</p></li><li><p>Get genesis blob - (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.ansible.com/ansible/latest/collections/ansible/builtin/command_module.html">command module</a>)</p></li><li><p>Allow all access to tcp port 9000 - (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.ansible.com/ansible/latest/collections/community/general/ufw_module.html">ufw module</a>)</p></li><li><p>Allow all access to tcp port 9184 for metrics - (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.ansible.com/ansible/latest/collections/community/general/ufw_module.html">ufw module</a>)</p></li></ul></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/0xzoz/sui-node-automation/pull/1/commits/231cbe5f74710f3e53b2c03b1467b379696f3688">Add systemd configuration task</a></p><p>This will set up and start a systemd service to run the Sui fullnode</p><p>Here is the order of tasks we will be doing in this build document and the modules they are utilizing:</p><ul><li><p>Deploy /etc/systemd/system/sui.service - (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.ansible.com/ansible/latest/collections/ansible/builtin/template_module.html">template module</a>)</p></li><li><p>Enable and start sui service - (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.ansible.com/ansible/latest/collections/ansible/builtin/systemd_module.html">systemd module</a>)</p></li></ul></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/0xzoz/sui-node-automation/pull/1/commits/664336153da6e085359af8fc361b6ec61ab953f3">Package in sui_fullnode role, configure tasks and populate root file</a></p><p>We now want to tie all this together. We add the previous three tasks to a parent YAML file in the <code>sui-fullnode</code> role folder and we create the entry point for ansible in the root as <code>main.yml</code>. We should note that there are a couple of commented-out lines - Stay tuned for subsequent tutorials securing a server and adding a monitoring stack 👩🏽‍💻</p></li></ol><h2 id="h-conclusion" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Conclusion</h2><hr><p>This post should help you get familiarized with ansible and see how easy it is to create reproducible infrastructure. It will be a primer for more complex operations as the repository grows and we add validator functionality, add server security and implement a monitoring stack.</p><p>It may also act as an entry point to learning about Sui as a protocol or allow you as a node operator to have a more streamlined workflow. It&apos;s still very early days in the blockchain/web3/crypto space. Sui is likely to play a large part in developing the technology and scaling it to billions of users.</p><p>Stay tuned to hear about the next articles in the <code>pull-requests-with-zoz</code> series</p><hr><h2 id="h-this-is-one-of-many-articles-based-on-the-concept-of-pull-requests-with-zoz" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">This is one of many articles based on the concept of <code>pull-requests-with-zoz</code></h2><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://mirror.xyz/zoz.eth/WtdGWxlW1tLfujD4-SdhPwAFkMHcJNdwr-WIOG0xSxw">https://mirror.xyz/zoz.eth/WtdGWxlW1tLfujD4-SdhPwAFkMHcJNdwr-WIOG0xSxw</a></p><h2 id="h-cover-image" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Cover Image</h2><hr><p>The image above(like my PP) is created with <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://abraham.ai/">abraham.ai</a> - an AI artwork generator</p><p><strong>SEED:</strong> Automated Sui node</p><h3 id="h-about" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">About</h3><hr><p><em>Twitter:</em> @0xzoz</p><p><em>GitHub:</em> @0xzoz</p><p><em>Mirror:</em> @0xzoz</p><p><em>Discord:</em> @zoz.eth#6952</p><hr><p><strong>ENS: zoz.eth</strong></p>]]></content:encoded>
            <author>zoz@newsletter.paragraph.com (0xZOZ)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/c83f226b6907a1930c8ebaece57430474e4c966e5f5ff0e969c0fc5d6f31c86e.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[the-future-of-work-with-zoz]]></title>
            <link>https://paragraph.com/@zoz/the-future-of-work-with-zoz</link>
            <guid>Swk1FKXPnLz4AtPlZ2xL</guid>
            <pubDate>Mon, 17 Oct 2022 16:33:05 GMT</pubDate>
            <description><![CDATA[What will some of the roles within our systems look like in 5, 10, 20 yearsPrecursorIn 2019(light years for the crypto industry), the crypto landscape looked very different. I was still around, but it was more of a goblin town than what we call goblin town today. Many 2017-era projects were either dead, pivoting, pivoting from a pivot or on their last legs! Around this time, I wrote one of my first articles. The seeds were sown in my mind from the birth of POS(Proof of Stake), being feasible ...]]></description>
            <content:encoded><![CDATA[<h3 id="h-what-will-some-of-the-roles-within-our-systems-look-like-in-5-10-20-years" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">What will some of the roles within our systems look like in 5, 10, 20 years</h3><hr><h2 id="h-precursor" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Precursor</h2><p>In 2019(light years for the crypto industry), the crypto landscape looked very different. I was still around, but it was more of a goblin town than what we call goblin town today. Many 2017-era projects were either dead, pivoting, pivoting from a pivot or on their last legs! Around this time, I wrote one of my first articles. The seeds were sown in my mind from the birth of POS(Proof of Stake), being feasible and even implemented in a few early cases. The article was titled ”<strong>The Future of Work is not Work</strong>”. I wish I had tools like Mirror or Paragraph back then because after trying to search for the article, it appears I no longer have my Medium account, and it is lost forever. But the TLDR of the article was this:</p><p>Due to the new roles emerging around decentralized products, projects and protocols, we had to reimagine the typical role of working in everyday life. It would no longer make sense for people to work for a company the way we did for the last 300 years(more so 100 years with industrialization). It would not happen all at once and would likely slowly infiltrate as this generation loses its foothold to the new digital natives with a different perspective. An example used was that a user would contribute to a handful of diverse communities in various ways(left up to interpretation, but one was as a validator) as an alternative to going to the same office in the same company every day.</p><p>This may not seem too far of a stretch by today’s standards. However, before PoS, DAOs and NFTs were even in flavour with crypto natives, let alone front-screen news. It was also before Covid, the last bull run and Micheal Saylor buying up all the Bitcoin! With this series, I want to dive in and put some ideas about where we might be headed, what roles might exist and other musings about the future of work. Keep in mind <em>might</em> is the operative word here;. At the same time, I was able to transition into the exact role I mentioned in the paragraph above, it is currently a minute number of workers/entrepreneurs/jack of all trades, master of none types that are operating like this. Nothing is ever certain!</p><h2 id="h-content" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Content</h2><ul><li><p>The Future of Work is not Work: spot saved for if I ever find the original article</p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://mirror.xyz/zoz.eth/N7vKFNQMGY3Nl7BHOWdCkSDkBv59n0X5LYWKQNiO7hI">Opportunity Capitalist</a></p></li><li><p>Onboarding(coming soon)</p></li><li><p>Prompt Engineer(coming soon)</p></li><li><p>Curator(coming soon)</p></li><li><p>Mechanism Designer(coming soon)</p></li></ul><h3 id="h-" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0"></h3><hr><h3 id="h-cover-image" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Cover Image</h3><p>The image above(like my PP) is created with <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://abraham.ai/">abraham.ai</a> - an AI artwork generator. <strong>SEED:</strong> The Future of Work is not Work</p><hr><h3 id="h-about" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">About</h3><p>Twitter: @0xzoz</p><p>GitHub: @0xzoz</p><p>Mirror: @0xzoz</p><p>Discord: @zoz.eth#6952</p><hr><p><strong>ENS: zoz.eth</strong></p>]]></content:encoded>
            <author>zoz@newsletter.paragraph.com (0xZOZ)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/0edce2d0124070d1c44a7ccc1361d31e76e5614d808c3e861fdbcb837471807b.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Opportunity Capitalist]]></title>
            <link>https://paragraph.com/@zoz/opportunity-capitalist</link>
            <guid>3Ee7SA2lQQdwHQJckQNw</guid>
            <pubDate>Mon, 17 Oct 2022 16:31:05 GMT</pubDate>
            <description><![CDATA[op·por·tu·ni·ty cap·i·tal·ist /ˌäpərˈt(y)o͞onədē/ /ˈkapədləst/ noun noun: opportunity capitalist; plural noun: opportunity capitalists An individual who, instead of working a traditional job, spends time contributing to decentralized protocols/projects/products to gain equity/skills/relationships. An iteration of the VC but at a smaller meaningful scale that is not purely return motivated.Venture Capitalists Sowed the SeedsThere is no doubt that Venture Capital fueled the industrial age alloc...]]></description>
            <content:encoded><![CDATA[<p><strong>op·por·tu·ni·ty cap·i·tal·ist</strong></p><p>/ˌäpərˈt(y)o͞onədē/ /ˈkapədləst/</p><p><em>noun</em></p><p>noun: <strong>opportunity</strong> <strong>capitalist</strong>; plural noun: <strong>opportunity</strong> <strong>capitalists</strong></p><p>An individual who, instead of working a traditional job, spends time contributing to decentralized protocols/projects/products to gain equity/skills/relationships. An iteration of the VC but at a smaller meaningful scale that is not purely return motivated.</p><hr><h2 id="h-venture-capitalists-sowed-the-seeds" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Venture Capitalists Sowed the Seeds</h2><p>There is no doubt that Venture Capital fueled the industrial age allocating capital to long shots that reaped rewards, changed the fabric of society and shaped our day-to-day lives. Let’s dive into how we got to the present-day venture firm, how it differs from the original implementation and a brief timeline. This will lead us to some of the next questions and predictions.</p><p><strong>What is Venture Capital?</strong></p><p>It’s a form of private equity. The equity is secured from liquidity providers(wealthy individuals and corporations) and used to fund early-stage projects(start-ups) after the seed stage. These ventures are usually high risk and high reward with a low efficacy rate. It is a mutual agreement between the founders of the project and the VC firm, the founders would often not be able to scale without the funding and support. The VC firm&apos;s business is based on a certain percentage of its bets will be extremely successful and go to the IPO stage where they can exit to secure the gains. Rinse and repeat.</p><p><strong>History of Venture Capital</strong></p><p>Originating in the early 1900’s it was nothing like it is today. The majority of the population did not have the capital, information or resources to participate in the above description. It was the very wealthy individuals and families who created these investments. The next cohort of Venture Capital came after World War II(~1945). George&apos;s Doriot is termed the &quot;father of venture capitalism&quot; and founded <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://en.wikipedia.org/wiki/American_Research_and_Development_Corporation">ARDC</a> in 1946 to encourage private-sector investment in businesses run by soldiers returning from World War II. This kicked off the next era of innovation, although the structure was more like a public company compared to the VC firms that exist today. This cohort fertilized the seeds that grew into separate spin-offs and morphed into a variety of different models.</p><p><strong>Timeline</strong></p><pre data-type="codeBlock" text="├── Early 1900&apos;s : Wealthy inividuals &amp; familys
│   ├── J.P. Morgan
│   └── the Rockefellers
│
├── 1945 : American Research and Development Corporation
│   ├── Georges Doriot
│   ├── Ralph Flanders
│   └── Karl Compton (former president of MIT)
│
├── 1958 : Small Business Investment Act of 1958
│   └── The Small Business Investment Act of 1958 provided tax breaks that helped contribute 
│       to the rise of private-equity firms
│
├── 1960s : venture capital came to be almost synonymous with technology finance.
│   └── The Firms were primarily focused on companies were exploiting breakthroughs in electronic, 
│       medical, or data-processing technology 
│
├── 1970s : growth of the venture capital industry was fueled by the emergence of the independent investment firms 
│   ├── Kleiner Perkins
│   └── Sequoia Capital
│
├── 1973 : leading venture capitalists formed the National Venture Capital Association (NVCA)
│
├── 1980&apos;s : From just a few dozen firms at the start of the decade, there were over 650 firms by the end of the 1980s
│
├── 1990&apos;s : World Wide Web
│   ├── Netscape and Amazon (company) were founded in 1994, and Yahoo! in 1995. Each funded with venture capital
│   └── The Exit: Internet IPOs—AOL in 1992; Netcom in 1994; UUNet, Spyglass and Netscape in 1995; Lycos, Excite, Yahoo!, 
│       CompuServe, Infoseek, C/NET, and E*Trade in 1996; and Amazon, ONSALE, Go2Net, N2K, NextLink, and SportsLine 
│       in 1997
│   
└── 2000 : The Dot Com Crash
"><code>├── Early <span class="hljs-number">1900</span><span class="hljs-comment">'s : Wealthy inividuals &#x26; familys</span>
│   ├── J.P. Morgan
│   └── the Rockefellers
│
├── <span class="hljs-number">1945</span> : American Research <span class="hljs-built_in">and</span> Development Corporation
│   ├── Georges Doriot
│   ├── Ralph Flanders
│   └── Karl Compton (former president <span class="hljs-keyword">of</span> MIT)
│
├── <span class="hljs-number">1958</span> : Small Business Investment Act <span class="hljs-keyword">of</span> <span class="hljs-number">1958</span>
│   └── The Small Business Investment Act <span class="hljs-keyword">of</span> <span class="hljs-number">1958</span> provided tax breaks that helped contribute 
│       <span class="hljs-keyword">to</span> the rise <span class="hljs-keyword">of</span> <span class="hljs-keyword">private</span>-equity firms
│
├── <span class="hljs-number">1960s</span> : venture capital came <span class="hljs-keyword">to</span> be almost synonymous <span class="hljs-keyword">with</span> technology finance.
│   └── The Firms were primarily focused <span class="hljs-keyword">on</span> companies were exploiting breakthroughs <span class="hljs-keyword">in</span> electronic, 
│       medical, <span class="hljs-built_in">or</span> data-processing technology 
│
├── <span class="hljs-number">1970s</span> : growth <span class="hljs-keyword">of</span> the venture capital industry was fueled <span class="hljs-keyword">by</span> the emergence <span class="hljs-keyword">of</span> the independent investment firms 
│   ├── Kleiner Perkins
│   └── Sequoia Capital
│
├── <span class="hljs-number">1973</span> : leading venture capitalists formed the National Venture Capital Association (NVCA)
│
├── <span class="hljs-number">1980</span><span class="hljs-comment">'s : From just a few dozen firms at the start of the decade, there were over 650 firms by the end of the 1980s</span>
│
├── <span class="hljs-number">1990</span><span class="hljs-comment">'s : World Wide Web</span>
│   ├── Netscape <span class="hljs-built_in">and</span> Amazon (company) were founded <span class="hljs-keyword">in</span> <span class="hljs-number">1994</span>, <span class="hljs-built_in">and</span> Yahoo! <span class="hljs-keyword">in</span> <span class="hljs-number">1995</span>. <span class="hljs-keyword">Each</span> funded <span class="hljs-keyword">with</span> venture capital
│   └── The <span class="hljs-keyword">Exit</span>: Internet IPOs—AOL <span class="hljs-keyword">in</span> <span class="hljs-number">1992</span>; Netcom <span class="hljs-keyword">in</span> <span class="hljs-number">1994</span>; UUNet, Spyglass <span class="hljs-built_in">and</span> Netscape <span class="hljs-keyword">in</span> <span class="hljs-number">1995</span>; Lycos, Excite, Yahoo!, 
│       CompuServe, Infoseek, C/NET, <span class="hljs-built_in">and</span> E*Trade <span class="hljs-keyword">in</span> <span class="hljs-number">1996</span>; <span class="hljs-built_in">and</span> Amazon, ONSALE, Go2Net, N2K, NextLink, <span class="hljs-built_in">and</span> SportsLine 
│       <span class="hljs-keyword">in</span> <span class="hljs-number">1997</span>
│   
└── <span class="hljs-number">2000</span> : The Dot Com Crash
</code></pre><p><strong>Today</strong></p><p>As you can see, reading this now and using this network of networks. The internet did not die, it grew into a vast luscious forest where any person could become a VC with a LinkedIn profile and acronyms that a PHD has never heard of:</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/51bca9ae6f1a8e8cf6e09dcf1cd3f94b" alt="" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>With the flood of venture capital owning non-trivial stakes in what we call Crypto or Web3, what originally was the gasoline for the fire may have sucked the oxygen from the room. Arguably the model just changes, or there may be room for a subset of Venture Capital. The argument is that capital is no longer the scarce resource that a product/protocol/project needs.</p><hr><h2 id="h-is-a-network-a-business" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Is a Network a Business?</h2><p>Why was the preceding section so important to the concept we introduced in the title? Without knowing how our lives were built by a sea of capital, the most valuable resource at the time. We may not have the context we need to see the similarities between early company formation and how it compares to early network growth in the present. From wealthy elites to tens of thousands to around a million today, this shows the idea of venture capital scaled to the masses, and it scaled because there was an ever-growing amount of companies being built. Mostly due to technological innovation as we saw from the 90s until now. With every stage of innovation, there is a cross-over from the old to the new that overlaps and is not as efficient as it could be but with time, it is optimized.</p><p>As we are seeing by the information barrier being removed with the internet coming of age, there are coordination abilities sprouting to life that couldn’t have been possible only a decade before. While networks have always existed, the internet taught us that they could be managed at a global scale by clusters of nodes.</p><p>Companies, in general, operate very well with their hierarchical structure and processes. For the majority of the last couple of centuries, this has been the most efficient way a business operation could exist. Notwithstanding the downfall of bureaucracies today(a story for another time) and the bloat they now endure, companies have their place in the world of today and yesteryear but will a better option be available soon? It depends on the context.</p><p>Networks were missing one key attribute to become a vehicle for groups to coordinate in the same way that a company operates. While they were much more nimble and resilient than a company, they lacked the important necessary ingredient ‘value’. Particularly natively packaged trustless transfer of value between the different nodes within the system. In the last 10 years, this has become increasingly available. First with Bitcoin, then with smart contracts and now the products being built around these valuable primitives.</p><p>This is now the golden era of experimentation, iteration and invention of what is possible with these new tools to coordinate and operate between nodes or entities spanning continents. We have only just touched the surface of what is possible. We now have a large number of Venture Capitalists, debatably the majority of them merely providing capital coupled with an explosion of ideas from an ever-growing pool of entrepreneurs. If a network is now suitable to be a vehicle for a business and there is an abundant supply of the former two. What is the real scarce resource?</p><hr><h2 id="h-we-dont-need-loggers-and-logging-we-need-fertilizers" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">We don’t need Loggers and Logging, We need Fertilizers</h2><p>There’s now a gap opening between the end user and the business vessel that we call a network. Let’s start with what a network needs; First and foremost, it needs a reason to exist. Be it a decentralized state machine, a more efficient way to distribute trustless value or simply to exchange dog pictures(or coins). It needs infrastructure, it needs people using it, and it needs a community of individuals with a purpose. Money can only buy a certain amount of this for a limited amount of time before reality starts to seep through the cracks.</p><p>What will not be as obvious today as in hindsight is when the fog clears that the ecosystem within a network, the roots, the passionate individuals and the presence is what fuels it. Without it, there is just a piece of technology left by the wayside after the funds are extracted. Like a hole in the ground of a decommissioned gold mine. Speaking of such.</p><p>A story comes to mind of a small gold mining town. On Alta Mountain within the Little Cottonwood Canyon in Salt Lake City, Utah, During the early days, the sawmills operating at Alta required vast amounts of logs. Trees were felled in such great numbers that the slopes were practically denuded of timber by 1884. With the removal of the trees, there was little to hold back the accumulated snow. During the winter of 1873-74, a disastrous snow slide swept down from the mountain and destroyed about one-half of the town. Sixty persons reportedly lost their lives in the main blocks of the town. A fire followed the avalanche, and between the two destroyers, the town was almost completely wiped out. Other avalanches and fires swept through the town in the following years. In 1885 a slide swept down from Rustler Mountain, partially destroying the town. This history acts as a metaphor, a story about greed, unfamiliarity and lack of thoughtful foresight that resembles what we might be seeing now within these networks. This is for good reason, what seemed like fiction only a couple of years ago is now a small ecosystem within the forest VC created. What this means is there is an opportunity to fill the gap between the extreme event of failure and death that is resonant in the early days of the venture as it grew away from wealthy elites and before it became what it is today.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/c9d2f49e18b7dad22006fe9bc0ae18a3" alt="" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><hr><h2 id="h-the-opportunity" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">The Opportunity</h2><p>Opportunity exists in this gap. We are now seeing a shift where a role is emerging out of necessity. After the dust began to settle in 2019 after the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://en.wikipedia.org/wiki/Cryptocurrency_bubble#2017_boom_and_2018_crash">crash of early 2018</a>, to the foreign bystanders it looked like “that whole crypto thing” had been a fad. Undeniably it even looked that way to lots of passengers still aboard the 2015,16,17 bus as the seats emptied during 18/19. But many seeds were starting to sprout with one thing missing - believers, skills, and passionate individuals to use those skills. While the majority of the initial building was done by regular employees and founders, similar to existing early-stage ventures. They needed new roles like Validators, Community Mods and Builders to build upon the networks that were being designed and constructed. During that time, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/zmanian?ref_src=twsrc%5Egoogle%7Ctwcamp%5Eserp%7Ctwgr%5Eauthor">Zaki Manian</a> designed one of the few ecosystem growth campaigns designed to recruit, train and eventually employ(not in the traditional sense) - The <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.figment.io/resources/incentivized-testnets-are-the-new-normal">Incentivized Testnet</a>. It would allow any individual to permissionlessly enrol and join a game based on the operation of running validator nodes to protect the network being built. It may seem strange reading this now but similar to mining Bitcoin way back in the day, you could barely find enough people to join the testing phase. Because now, with the hindsight of seeing the value of the networks(In physical, philosophical and by value), it is a no-brainer. The equity earned by participating in these early games allowed the participants to own a meaningful stake in the network.</p><p>This was the beginning of these types of opportunities. We started to see other such examples, like early digital art collecting with the narrative of unique scarce timestamped sealed packets of data(NFT’s) and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://en.wikipedia.org/wiki/Working_group">working group</a> roles within <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.investopedia.com/tech/what-dao/#:~:text=A%20DAO%20is%20a%20decentralized,on%20initiatives%20for%20the%20entity.">DAO’</a>s. Notably missing is <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.coindesk.com/learn/what-is-yield-farming-the-rocket-fuel-of-defi-explained/">farming</a>, While an innovation in <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://en.wikipedia.org/wiki/Mechanism_design#:~:text=Mechanism%20design%20is%20a%20field,settings%2C%20where%20players%20act%20rationally.">mechanism design</a> for the time, this does not fall into the same category as above because it was a somewhat different breed of user who ultimately extracted value with this endeavour. It was one who was versed in the knowledge barrier of the next participants.</p><p><strong>The Opportunity Capitalist</strong> is what a network needs. They are defined by values and are involved in jumpstarting these networks for learning, ideals, equity share and for the improvements they provide compared to previous and current systems. Monetary gain is a secondary motive, most value accrues from the journey. Networking and training are just as valuable due to these skills not being defined or available when acquired. This insight gives skills and knowledge that compound and leads to future opportunities. It should be noted though that this is not scalable by design. To give meaningful value back to the network, like any social network, is the capability for a single person to nourish relationships and provide their most valuable assets - attention and time. Realistically the individual becomes ineffective after around 5 networks and neutralizes the value for each one added to the attention list, at worst, it is destructive to their presence within the other networks.</p><p>Due to the value being time and attention instead of capital. These networks naturally grow and overlap these opportunity capitalists even though the immediate breath is small, have an exponential effect due to the overlap between nodes within the multi-layered mesh</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/48f74d09f68dc29d629f3177507406dc" alt="The inner pentagon represents 0% of the OCs time and attention increasing to the outer pentagon at 100%. We can see these OCs overlap creating a trunk in the middle." class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">The inner pentagon represents 0% of the OCs time and attention increasing to the outer pentagon at 100%. We can see these OCs overlap creating a trunk in the middle.</figcaption></figure><p>This is the real <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://jacob.energy/hyperstructures.html">hyperstructure</a> being built. The one that will sew the fabric of our digital lives, products and relationships together. While this role was essentially created in 2019 while the ecosystem is a very unique subset of participants, over the last few years we have had a change within the idealogy of new participants. They come from <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://coinflex.com/education/what-is-tradfi/">TradFi</a> (traditional finance), and startup world and bring with them the processes and organization. Trying to inadvertently coerce these networks to fit a mould of familiarity. This may not be the approach that will drive these networks forward and could be detrimental to Opportunity Capitalists.</p><p>We now enter the do-or-die stage of the OC, do traditional values overthrow the progress being made using traditional resumes filled with buzzwords and political correctness OR do we step outside our comfort zone and have anons with a track record of <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.researchhub.com/paper/1270814/decentralized-society-finding-web3s-soul">soul-bound</a> achievements to take the reign? Likely somewhere in the middle.</p><hr><h2 id="h-home-sweet-home" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Home Sweet Home</h2><p>Although nomadic by nature, OC’s need a home and there are a couple of prerequisites that must be considered:</p><p><strong>Credible neutrality:</strong> the home must be agnostic as tribalism is ever prevalent in most networks. Strong values but open to ideas.</p><p><strong>Organic</strong>: there must be no foundation, investors, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.investopedia.com/terms/s/simple-agreement-future-tokens-saft.asp">SAFTs</a>. The network had to have been built by contributors because they shared a vision, not due to incentives provided by another entity higher up the pyramid.</p><p>while there may be a multitude of projects that fit these needs, it’s hard to find them due to the nature of ideals and lack of easy capital. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://canto.io/">Canto</a> and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://0l.network/">0L</a> are a couple of examples of such networks.</p><p>I would love to have your opinion about this concept!!! Please reach out and let me know. This is part of the-future-of-work-with-zoz series</p><hr><h3 id="h-cover-image" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Cover Image</h3><p>The image above(like my PP) is created with <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://abraham.ai/">abraham.ai</a> - an AI artwork generator <strong>SEED</strong>: opportunity capitalist</p><hr><h3 id="h-about" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">About</h3><p><em>Twitter:</em> @0xzoz</p><p><em>GitHub:</em> @0xzoz</p><p><em>Mirror:</em> @0xzoz</p><p><em>Discord:</em> @zoz.eth#6952</p><hr><p><strong>ENS: zoz.eth</strong></p>]]></content:encoded>
            <author>zoz@newsletter.paragraph.com (0xZOZ)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/5ceccba2ec4d1400d8a144d7609a4d91465fa42dc0d885ecd82a622d6d440dbb.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Wallet Integration: Hard]]></title>
            <link>https://paragraph.com/@zoz/wallet-integration-hard</link>
            <guid>ra6kkFUACaBR67NKXxGE</guid>
            <pubDate>Tue, 04 Oct 2022 03:54:46 GMT</pubDate>
            <description><![CDATA[Wallet SeriesThis is a three-part series in the larger pull-requests-with-zoz series: Easy - Adding an injected provider to an existing library Medium - Adding an integration of a wallet Hard(this) - Adding a wallet as a package to an existing libraryMotivationWhen starting to contribute to the open-source community-run browser wallet Tally Ho by integrating it with products, I didn’t know much about how a crypto wallet is integrated with dApps. Having spent numerous hours helping the team an...]]></description>
            <content:encoded><![CDATA[<h2 id="h-wallet-series" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Wallet Series</h2><p>This is a three-part series in the larger <code>pull-requests-with-zoz</code> series:</p><p><strong>Easy</strong> - Adding an injected provider to an existing library</p><p><strong>Medium</strong> - <em>Adding an integration of a wallet</em></p><p><strong>Hard</strong>(this) - <em>Adding a wallet as a package to an existing library</em></p><h2 id="h-motivation" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Motivation</h2><p>When starting to contribute to the open-source community-run browser wallet Tally Ho by integrating it with products, I didn’t know much about how a crypto wallet is integrated with dApps. Having spent numerous hours helping the team and community, I now have a better understanding of what is technically happening and how it can be done in the best way possible to help with not only connecting to an application but also strategically providing the tools for others to help brand awareness and visibility.</p><p>This article breaks down how to integrate a wallet with a wallet library by creating a separate package that’s loosely coupled to the library to provide more composability. Tally Ho had originally been integrated into Web3Modal as an add-on to the injected provider slot, which the library uses to bundle the common wallet type together. Generally, this works by identifying the current extension browser and connecting to that. For example, if you have MathWallet installed instead of Metamask, the injected option would show the MathWallet logo and name on the button, and it would connect seamlessly.</p><p>Due to the early stage nature of Tally Ho as a project and the roll out of features compared to other more established wallets, it was generally used alongside another wallet. This did not provide the best user experience. To remedy this, we change the current implementation and implemented it as a package. I went over the first integration in the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://mirror.xyz/zoz.eth/EhytfIluQfOXWGmgykmNXPmZxH4gLOzb9hRfSUkTaxY">Wallet Integration: Easy</a> article in this series if you would like to check it out.</p><h2 id="h-pr" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">PR</h2><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/WalletConnect/web3modal/pull/571">https://github.com/WalletConnect/web3modal/pull/571</a></p><h2 id="h-techproduct" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Tech/Product</h2><h3 id="h-tally-ho" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Tally Ho</h3><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://tally.cash">Tally Ho</a> is an Open Source Community run Web Browser Extension Wallet. Wow, that&apos;s a mouthful! What exactly does that mean?</p><p><strong>Necessary Backstory</strong>: The largest wallet in space is Metamask. While once a grassroots endeavour, with the growth of crypto as an industry, MM’s user base also grew - massively! MM is owned by Consensus, and they have investors who they have to please. This led to the wallet creating a revenue-generating feature: the ability to do token swaps natively in the wallet(for a generous fee, of course). Around this time, MM also changed their license so others could not use their code(not very web3-like).</p><p>Tally Ho is an initiative to do exactly the opposite. Create a wallet that is built, owned and used by its users. It’s open source so you can fork the crap out of it, but most importantly, the value accrues back to the users. It is the essence of web3 and proves that we can do good!</p><h3 id="h-web3modal" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Web3Modal</h3><p>This is one of the most used wallet libraries within the industry. Web3Modal is an easy-to-use library to help developers add support for multiple providers in their apps with a simple, customizable configuration.</p><p>By default, Web3Modal Library supports injected providers like ( <strong>Metamask</strong>, <strong>Brave Wallet</strong>, <strong>Dapper</strong>, <strong>Frame</strong>, <strong>Gnosis Safe</strong>, <strong>Tally</strong>, Web3 Browsers, etc) and <strong>WalletConnect</strong>. You can also easily configure the library to support <strong>Coinbase Wallet</strong>, <strong>Torus</strong>, <strong>Portis</strong>, <strong>Fortmatic</strong> and many more.</p><h2 id="h-scope" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Scope</h2><p>To change the existing Tally Ho wallet integration from an add-on to the injected provider package and separate it out into its own package. The reasoning for this is 3 fold:</p><ol><li><p>Due to a change in the Tally Ho code injecting Web3 into the browser, the original integration broke, and the Tally Ho logo would no longer show. The wallet would still connect, but this didn’t really jive with us.</p></li><li><p>You needed to set Tally Ho as the default wallet in settings if you had other browser wallets alongside Tally Ho. Again, this is a really bad UX, and we could do better</p></li><li><p>Due to the collaborative nature of the Tally Ho story and being a community-run open-source wallet, products want to have Tally Ho as an option, even if the user does not have it installed, to create brand awareness.</p></li></ol><p>With a new understanding of the best way to implement this and the above user issues, we wanted to address them. Let’s break down what we did. You can always look through the other articles in this wallet series for higher-level explanations if some of the points below don’t quite make sense.</p><h2 id="h-commits" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Commits</h2><ol><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/WalletConnect/web3modal/pull/571/commits/dc568b4537e441565dbabc9df6e1b18d803a2f60">Renaming for latest brand change</a></p></li></ol><p>Since the initial PR integrating Tally Ho there was a name change due to some conflicts with the name <em>Tally</em> instead of <em>Tally Ho.</em> This commit corrects the naming to represent Tally Ho before we make further changes.</p><ol><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/WalletConnect/web3modal/pull/571/commits/316669985cc90f69e8857c0362f4d6515e7644ee">Add additional check to capture Tally Ho instead of fallback wallet</a></p></li></ol><p>Because of changes within the Tally Ho codebase and injecting Web3 into the window(see 1. above), we need to factor in that Tally wants to be noticed instead of being overridden by the fallback wallet(web3). A simple check is added to the logic that checks if Tally Ho is identified and if Web3 is identified. This will give Tally Ho precedence over the default.</p><ol><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/WalletConnect/web3modal/pull/571/commits/33a60825bdd7b67689df62f183d1e1d5a056925f">Use window.tally to make Tally Ho dominant wallet when installed</a></p></li></ol><p>Tally Ho uses two different methods to inject into the window object. Firstly injecting Tally(eg <code>window.Tally</code>) directly into the window object allows it to be detected and used at all times. Secondly, if the ‘<em>set as default’</em> option is checked in the settings. Then Tally Ho mimicks Metamask by also injecting it into the Ethereum object in the window object (eg <code>window.ethereum</code>) and can be checked via <code>window.ethereum.isTally</code> field. Because we want to allow Tally Ho to be recognized and used alongside other extension browsers. We refactor the package to use the <code>window.tally</code> method.</p><ol><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/WalletConnect/web3modal/pull/571/commits/a273c58530c7850217cd1a1a731f215806d8c186">Add Tally Ho provider</a></p></li></ol><p>We need to add a custom provider for Tally Ho to be able to use a couple of Tally Ho specific packages:</p><p>- <code>tallyho-detect-provider</code> - <code>tallyho-onboarding</code></p><p>This new provider will make sure that Tally Ho is not using the standard injected provider if the product using Web3Modal specifically sets Tally Ho as a separate slot.</p><ol><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/WalletConnect/web3modal/pull/571/commits/d562a02fb36f1603616318fe4ab04353b518f538">Allow Tally Ho to be interchangeable either as injected or as a provider option</a></p></li></ol><p>Because we want this change to be backwards compatible and also allow products that do not add Tally Ho as a package to be able to have Tally Ho as an injected provider. This requires a couple of changes.</p><p>- A check in <code>src/helpers/utils.ts</code> (L182) to set the injected value to Tally Ho if the package is not installed and if Tally Ho is installed</p><p>- Change the name of the Tally Ho injected instance to be able to be used for the package as well</p><p>- Change logic ordering in <code>src/providers/connectors/injected.ts</code></p><p>- Instead of just console logging in <code>src/providers/connectors/tallyho.ts</code> throw an error to exit the operation.</p><ol><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/WalletConnect/web3modal/pull/571/commits/df574c17bc6f43ea5dd4e17548dd4c3b43d7f1b4">Add documentation</a></p></li></ol><p>Add the relevant documentation to capture the changes that were incorporated into this PR.</p><h2 id="h-conclusion" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Conclusion</h2><p>We end our wallet series here by adding a wallet package into a library. The skills you have learnt over the last 3 articles more than provide you with the ability to contribute to a DAO and open source protocol. Hopefully, this gave an understanding of wallets and their interaction with the browser and web applications.</p><p>We at Tally Ho need contributors to help integrate with other projects. If you would like to join the pawdnership team, please reach out. We are also happy to help mentor keen enthusiast individuals!</p><div data-type="subscribeButton" class="center-contents"><a class="email-subscribe-button" href="null">Subscribe</a></div><h2 id="h-this-is-one-of-many-articles-based-on-the-concept-of-pull-requests-with-zoz" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">This is one of many articles based on the concept of pull-requests-with-zoz</h2><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://mirror.xyz/zoz.eth/WtdGWxlW1tLfujD4-SdhPwAFkMHcJNdwr-WIOG0xSxw">https://mirror.xyz/zoz.eth/WtdGWxlW1tLfujD4-SdhPwAFkMHcJNdwr-WIOG0xSxw</a></p><h3 id="h-cover-image" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Cover Image------------------------------------------------------------</h3><p>The image above(like my PP) is created with <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://abraham.ai/">abraham.ai</a> - an AI artwork generator <strong>SEED:</strong> zoz.eth integrating a dog wallet with a blockchain network using easy mode</p><h3 id="h-about" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">About-------------------------------------------------------------------</h3><p><em>Twitter:</em> @0xzoz</p><p><em>GitHub:</em> @0xzoz</p><p><em>Mirror:</em> @0xzoz</p><p><em>Discord:</em> @zoz.eth#6952</p><p><strong>---------------------------------------------------------------------------------------</strong></p><p><strong>ENS: zoz.eth</strong></p>]]></content:encoded>
            <author>zoz@newsletter.paragraph.com (0xZOZ)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/cac87134bf954c9446a809ae4a08651de8e19b56a8a59f0c392ca519e8499460.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Integrate a Ceramic  DataModel to Superfluid]]></title>
            <link>https://paragraph.com/@zoz/integrate-a-ceramic-datamodel-to-superfluid</link>
            <guid>7r6sCsaD32sz9ya0k0F2</guid>
            <pubDate>Tue, 20 Sep 2022 18:21:21 GMT</pubDate>
            <description><![CDATA[By the end of the post, you should be equipped with the knowledge of what Ceramic is, what the Superfluid Console is and how to integrate Ceramic into your favourite applications. The following breaks down a pull request of integrating Ceramic into an application.MotivationI had originally heard about Ceramic from a podcast. The concept of having a data model standard within Web3 made a lot of sense. This concept took a while for me to grasp technical concepts of how to make that magic actual...]]></description>
            <content:encoded><![CDATA[<p>By the end of the post, you should be equipped with the knowledge of what Ceramic is, what the Superfluid Console is and how to integrate Ceramic into your favourite applications. The following breaks down a pull request of integrating Ceramic into an application.</p><h2 id="h-motivation" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Motivation</h2><p>I had originally heard about <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://ceramic.network/">Ceramic</a> from a podcast. The concept of having a data model standard within Web3 made a lot of sense. This concept took a while for me to grasp technical concepts of how to make that magic actually happen but I documented it <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://mirror.xyz/zoz.eth/V5P5ogJTsmfDWMB4uTiW1FD9BKzuYwQuuFSAkEMYyBw">here</a> so it is easier for you. When I saw a Gitcoin bounty to integrate this tech with <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.superfluid.finance/">Superfluid</a> I knew it was the best opportunity of learning firsthand if there was substance to my intuition.</p><h2 id="h-pr" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">PR</h2><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/superfluid-finance/superfluid-console/pull/93/commits/b1ac01fb3c866ddc7442059d0f566fdfe92482c8">https://github.com/superfluid-finance/superfluid-console/pull/93/commits/b1ac01fb3c866ddc7442059d0f566fdfe92482c8</a></p><h2 id="h-techproduct" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Tech/Product</h2><h3 id="h-ceramic" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Ceramic</h3><p>The website describes it as: “Ceramic is a decentralized data network that brings unlimited data composability to Web3 applications.” but what does that mean exactly, and why should you care?</p><p>Ceramic acts as a platform to store your user’s data and create standardized data models that, once adopted and reused by the industry, will allow the next layer of composability within Web3 and Defi. It uniquely allows the user to own their data using their DID(persistent decentralized identifier) that can be generated in many ways, but in this case, using the user’s crypto wallet.</p><p>It works by creating streams for data models that are then available for users using their DID. You can think of it as a data table, your DID is the row, and each stream created is a column. An example might look like the one below:</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/2105bb0726c14652ac51cde83814d44c0cce1d59795d320742241e46caeb29b6.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><h3 id="h-superfluid" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Superfluid</h3><p>Imagine a world where value can be distributed in real-time at any interval and determined individually for the use case. Powerful, easy and one of the simplest product market fit for blockchain and crypto. Well, Superfluid is just that, a streaming service building block that can be used modularly with other products. But what good is this without a way to visualize that data in real-time across each of the networks superfluid is deployed to? In comes <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://console.superfluid.finance/">superfluid console</a> - A way for users to do just that. It would be nice if this was using a common framework for the data so it could be even more composable in the ever-growing Defi ecosystem, wouldn’t it?</p><h2 id="h-scope" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Scope</h2><p>What we wanted to do in this PR is marry the two technologies while incubating the design of an Address Book Data Model to track a user’s connected wallets and their streams. Creating this would allow it to be packaged and stored decentrally on Ceramic while accessible to other applications that could leverage the existing model.</p><p>There are two parts to getting this completed.</p><ol><li><p>Creating the Data Model and deploying it to the Ceramic registry. We covered this in a previous blog <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://mirror.xyz/zoz.eth/V5P5ogJTsmfDWMB4uTiW1FD9BKzuYwQuuFSAkEMYyBw">post</a>.</p></li><li><p>Using the already available DID on ceramic to connect with Superfluid. Then creating the ability to add, edit and retrieve Address Book data to be used within the Super Fluid console.</p></li></ol><h2 id="h-commits" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Commits</h2><blockquote><p>Unfortunately this PR was completed before the concept of <code>pull-requests-with-zoz</code> was conceived and it was done with one large commit(Im now starting to expose just how little I knew🤦🏼). For purposes of this article we will breakdown this large commit into steps like it should have been done.</p></blockquote><p>Let’s first break down what needed to done. I had no previous exposure to either Ceramic or Superfluid so I had to get a grasp of how these applications work. Ceramic was a large learning curve and my first post breaks it down for a dummy like me. Secondly, I really didn’t know how Address Books worked in the console and it took me a long time to even find where to add an entry(not a great user experience, but its Web3 so we will give it a pass - <em>for now</em>). With that said and maaannnny more hours than I should have spent. I determined I needed 4 pieces added:</p><ul><li><p>Add the necessary packages, and references to the data models and wrap the app in a provider.</p></li><li><p>A button to connect to ceramic and recognize the user’s identity</p></li><li><p>A neat way to package the interactions a keep them separately contained - maybe a React hook</p></li><li><p>Replace the existing interactions with the applications state and use the newly created methods in the above step to instead use the new Data Model and interact with Ceramic.</p></li></ul><p>Don’t worry the next steps will help describe and allow you to visualize this better if it doesn’t make sense.</p><p><em>1.</em> <strong>Determining where the changes need to be made</strong></p><p>This is always the biggest hurdle when trying to grasp a new concept and multiple products with different codebases. There is no shortcut. You must read the code, break things, and insert a billion console logs(well at least I do). I usually create a separate branch just to do this and use it as a messy draft of what I will actually submit as my final PR.</p><p><em>2.</em> <strong>Add the necessary packages, and references to the data models and wrap the app in a provider</strong></p><p>I suggest reading the first Ceramic post as this explanation will be briefer(with the assumption you have a little more knowledge than I did when I started). We will need two packages:</p><p>- <code>@glazed/types</code>: This will be used to give a defined structure and connect Data Models with aliases - <code>@self.id/framework</code>: This is a powerful wrapper that encaptures all the functionality of the Ceramic protocol into a neat package.</p><p>We want to wrap the application in the Provider(<code>src/pages/_app.tsx</code> - L66) and add our references to our Data Models(<code>src/utils/ceramicModel.json</code> to use later on. Where did we get these references from? We created and published them to the Ceramic network. We also could have got them from the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/ceramicstudio/datamodels">Data Model Registry</a> if they had been published previously.</p><p><em>3.</em> <strong>A button to connect to ceramic and recognize the user’s identity</strong></p><p>We will go ahead and create a new React component of a Button(<code>src/components/CeramicConnect.tsx</code>) that will allow us to log in and get our identity. *Note: the button will be using our React hook we create in the next step</p><p>The button performs a couple of functions: Connect, Disconnect with the <code>@selfId</code> framework(L11 - L28) and also gets our DID. It is using our Ethereum address from our injected wallet to recognize us.</p><p>4. <strong>Package the interactions in a React hook</strong></p><p>Let’s first understand what a React hook is. A hook is a collection of functions that isolate the stateful logic to use within other components. That is any variables that need to be changed and managed. In this instance we would like to manage the Ceramic state. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.freecodecamp.org/news/react-hooks-fundamentals/#:~:text=React%20Hooks%20are%20simple%20JavaScript,useState%20%3A%20To%20manage%20states.">This</a> article is helpful to give a more in depth explanation of hooks.</p><p>Here we create the <code>useAddressBook</code> hook and it is found in the <code>src/hooks/useAddressBook.ts</code> file. This hook is to manage the addressBook state within the Superfluid Console application so we want to bring in some other dependancies here like:</p><ul><li><p><code>useViewerConnection</code> from the <code>@self.id/framework.</code>We want to use this as it will get our current connection to Ceramic</p></li><li><p>Standard <code>useAppDispatch</code> and <code>useAppSelector</code> react hooks. Also the <code>useCallback</code> hook. These will help us interact with our application state and the app</p></li><li><p><code>useViewerRecord</code> from the <code>@self.Id/react</code> library. This will help us pull data from Ceramic by giving it an alias</p></li></ul><p>Now we just want to create reusable functions within the hook that will help us achieve our task of creating, updating and deleting the data within ceramic. The functions between lines 29-87. The two functions below that are just a way to massage and transform the data in and out.</p><p>5. <strong>Replace the existing interactions with the applications state and use the newly created methods</strong></p><p>Wow… Not really that much to it when its broken down and explained is there? On to our final boss… Connecting it in to the existing application and wiring it all up. This happens in the <code>src/components/AddressBook.tsx</code> file. This file was already doing much of the functions we need but it was using the state in react and on the client. So essentially we just refactor these existing functions. We need to bring in the following items:</p><ul><li><p><code>useViewerConnection</code> and <code>useViewerRecord</code> from <code>@self.id/framework</code></p></li><li><p>And of course our new <code>useAddressBook</code> hook</p></li></ul><p>When we bring in <code>addAddressBookEntry</code> and <code>removeAddressBookEntry</code> from <code>useAddressBook</code> we can now replace actions with these.</p><p>We also want to let the user know they need to connect to Ceramic to use this new functionality if they have not already. This is done by checking if we are connected and showing a warning if not. This happens between lines 111-120.</p><p><strong>There we go!!!</strong> <em>YOU</em> now have the knowledge to integrate Ceramic with your favourite applications</p><h2 id="h-conclusion" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Conclusion</h2><p>This post first serves as an example to what not to do in a PR by showing a poor monolithic approach of using one large commit. But also providing a solution to how it could be done better. These are the commits I would do now if I was to integrate another application</p><p>Ceramic is a powerful tool that will only get better as more integrations use the network. How I view it is like an interoperable data service that is blockchain agnostic. A new model for any application, not even blockchain to leverage. The intention of this post is empower even a novice like myself to integrate and use Ceramic. It also breaks down just how easy it is!</p><div data-type="subscribeButton" class="center-contents"><a class="email-subscribe-button" href="null">Subscribe</a></div><h2 id="h-this-is-the-first-of-many-articles-based-on-the-concept-of-prs-with-zoz" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">This is the first of many articles based on the concept of PR’s with zoz</h2><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://mirror.xyz/zoz.eth/WtdGWxlW1tLfujD4-SdhPwAFkMHcJNdwr-WIOG0xSxw">https://mirror.xyz/zoz.eth/WtdGWxlW1tLfujD4-SdhPwAFkMHcJNdwr-WIOG0xSxw</a></p><h3 id="h-cover-photo" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Cover Photo-------------------------------------------------------------</h3><p>The image above(like my PP) is created with <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://abraham.ai/">abraham.ai</a> - an AI artwork generator <strong>SEED:</strong> zoz.eth integrating a Ceramic Data Model into the Superfluid console</p><h3 id="h-about" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">About-------------------------------------------------------------------</h3><p><em>Twitter:</em> @0xzoz <em>GitHub:</em> @0xzoz <em>Mirror:</em> @0xzoz <em>Discord:</em> @zoz.eth#6952 <strong>---------------------------------------------------------------------------------------</strong></p><p><strong>ENS: zoz.eth</strong></p>]]></content:encoded>
            <author>zoz@newsletter.paragraph.com (0xZOZ)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/5cfd6b6594a9c8262bccf81be2cedefd6ca68f3f02325284f8c107ad5786c870.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[pull-requests-with-zoz]]></title>
            <link>https://paragraph.com/@zoz/pull-requests-with-zoz</link>
            <guid>WuuEfZwtSeCn5xFmGjUX</guid>
            <pubDate>Tue, 20 Sep 2022 18:05:18 GMT</pubDate>
            <description><![CDATA[Intro and How to Send a Pull RequestWallet SeriesEasy: Injected Provider - Web3Modal <> Tally Ho IntegrationMedium: Non-Library Integration - TBD (Coming Soon)Hard: Wallet Package - Web3Modal <> Tally Ho IntegrationCeramic x Superfluid IntegrationCover Photo-------------------------------------------------------------The image above is created with abraham.ai - an AI artwork generator SEED: zoz.ethAbout-------------------------------------------------------------------Twitter: @0xzoz GitHub: ...]]></description>
            <content:encoded><![CDATA[<ul><li><p>Intro and How to Send a Pull Request</p></li><li><p>Wallet Series</p><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://mirror.xyz/zoz.eth/EhytfIluQfOXWGmgykmNXPmZxH4gLOzb9hRfSUkTaxY">Easy: Injected Provider - Web3Modal &lt;&gt; Tally Ho Integration</a></p></li><li><p>Medium: Non-Library Integration - TBD (Coming Soon)</p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://mirror.xyz/zoz.eth/P72WPCZckTB69EDbTRDMAujCzwBSOO2UG4OtWptAwQg">Hard: Wallet Package - Web3Modal &lt;&gt; Tally Ho Integration</a></p></li></ul></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://mirror.xyz/zoz.eth/5K0TE03MZX1aIsj-XUrgbN6rn5JyBOVPAYk2bPtchuE">Ceramic x Superfluid Integration</a></p></li></ul><h3 id="h-cover-photo" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Cover Photo-------------------------------------------------------------</h3><p>The image above is created with <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://abraham.ai/">abraham.ai</a> - an AI artwork generator</p><p><strong>SEED:</strong> zoz.eth</p><h3 id="h-about" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">About-------------------------------------------------------------------</h3><p><em>Twitter:</em> @0xzoz</p><p><em>GitHub:</em> @0xzoz</p><p><em>Mirror:</em> @0xzoz</p><p>Farcaster: @0xzoz</p><p><em>Discord:</em> @zoz.eth#6952</p><p><strong>---------------------------------------------------------------------------------------</strong></p>]]></content:encoded>
            <author>zoz@newsletter.paragraph.com (0xZOZ)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/aa96a7924d5d0c5158686c71273e261aa6b4af8f55b9df5c3635c74a572206e2.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Wallet Integration: Easy]]></title>
            <link>https://paragraph.com/@zoz/wallet-integration-easy</link>
            <guid>fCrI2lgMxKNyLVZWrtNp</guid>
            <pubDate>Tue, 20 Sep 2022 17:46:29 GMT</pubDate>
            <description><![CDATA[Wallet SeriesThis is a three-part series in the larger pull-requests-with-zoz series: Easy(this) - Adding an injected provider to an existing library Medium - Adding an integration of a wallet Hard - Adding a wallet as a package to an existing libraryMotivationThis is where my journey started 😁. I was a wannabe blockchain developer that lacked knowledge and had never written a single line of open source code. I was inspired by a user(@commstark) on the Tally Ho Discord who had started contri...]]></description>
            <content:encoded><![CDATA[<h2 id="h-wallet-series" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Wallet Series</h2><p>This is a three-part series in the larger <code>pull-requests-with-zoz</code> series:</p><p><strong>Easy</strong>(this) - Adding an injected provider to an existing library</p><p><strong>Medium</strong> - <em>Adding an integration of a wallet</em></p><p><strong>Hard</strong> - <em>Adding a wallet as a package to an existing library</em></p><h2 id="h-motivation" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Motivation</h2><p>This is where my journey started 😁. I was a wannabe blockchain developer that lacked knowledge and had never written a single line of open source code. I was inspired by a user(<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/jon_day2">@commstark</a>) on the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://discord.gg/HTXvsdwCAW">Tally Ho Discord</a> who had started contributing to the project and created a team of helpers doing <em>non-technical</em> tasks. Tally Ho had just started their <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://gov.tally.cash/t/tally-pawdnership-pack/326">Pawdnership Pack</a> initiative to get developers helping to integrate the wallet with as many products as possible. I thought, why not, what did I have to lose? This is not that <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/moonshotcollective/pay.party/pull/111">actual first PR</a>, in fact, that was very simple(one line of code lol) but from that, I was able to piggyback on the success and the knowledge it gave me. I want to make this public to help others take the first step.</p><h2 id="h-pr" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">PR</h2><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/WalletConnect/web3modal/pull/389">https://github.com/WalletConnect/web3modal/pull/389</a></p><h2 id="h-techproduct" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Tech/Product</h2><h3 id="h-tally-ho" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Tally Ho</h3><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://tally.cash">Tally Ho</a> is an Open Source Community run Web Browser Extension Wallet. Wow, that&apos;s a mouthful! What exactly does that mean?</p><p><strong>Necessary Backstory</strong>: The largest wallet in space is Metamask, while once a grassroots endeavour, with the growth of crypto as an industry, MM’s user base also grew - massively! MM is owned by Consensus and they have investors who they have to please. This led to the wallet creating a revenue-generating feature: the ability to do token swaps natively in the wallet(for a generous fee of course). Around this time, MM also changed their license so others could not use their code(not very web3-like).</p><p>Tally Ho is an initiative to do exactly the opposite. Create a wallet that is built, owned and used by its users. It’s open source so you can fork the crap out of it but most importantly, the value accrues back to the users. It is the essence of web3 and proves that we can do good!</p><h3 id="h-web3modal" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Web3Modal</h3><p>This is one of the most used wallet libraries within the industry, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/WalletConnect/web3modal">Web3Modal</a> is an easy-to-use library to help developers add support for multiple providers in their apps with a simple customizable configuration.</p><p>By default, Web3Modal Library supports injected providers like ( <strong>Metamask</strong>, <strong>Brave Wallet</strong>, <strong>Dapper</strong>, <strong>Frame</strong>, <strong>Gnosis Safe</strong>, <strong>Tally</strong>, Web3 Browsers, etc) and <strong>WalletConnect</strong>. You can also easily configure the library to support <strong>Coinbase Wallet</strong>, <strong>Torus</strong>, <strong>Portis</strong>, <strong>Fortmatic</strong> and many more.</p><h2 id="h-scope" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Scope</h2><p>To allow Tally Ho to connect to applications when they are using the Web3Modal library. It is important that the Tally Ho logo shows as we want users to have a familiar experience when connecting to the app. This is a pretty simple addition seeing as the wallet library treats all injected providers as a single package and is compostable. Lets spend some time discussing how this actually works to better understand how a wallet is interacting with our browser</p><h3 id="h-the-what-and-how-of-a-provider" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">The What and How of a Provider</h3><p>A provider is an API the wallet injects into the window object on your local browser. Once installing a wallet like Tally Ho it does this by default. Tally Ho is different from other wallets but we will get into that below. Let’s use Metamask as this example to help build the concept. MM and most web3 wallets inject a global API in the <code>window.ethereum</code> object and this allows websites and dapps to do the following:</p><ul><li><p>Detect the Ethereum provider (<code>window.ethereum</code>)</p></li><li><p>Detect which Ethereum network the user is connected to</p></li><li><p>Get the user&apos;s Ethereum account(s)</p></li></ul><p>Here is a snippet of code to help you visualize the above statement</p><pre data-type="codeBlock" text="// usually this is encompassed in a if statement checking we have a wallet installed

if(window.ethereum){

   const provider = window.ethereum;
   startApp(provider); // initialize your app
     
} else {

   console.log(&apos;Please install Wallet!&apos;);

}
"><code><span class="hljs-comment">// usually this is encompassed in a if statement checking we have a wallet installed</span>

<span class="hljs-keyword">if</span>(window.ethereum){

   const provider <span class="hljs-operator">=</span> window.ethereum;
   startApp(provider); <span class="hljs-comment">// initialize your app</span>
     
} <span class="hljs-keyword">else</span> {

   console.log(<span class="hljs-string">'Please install Wallet!'</span>);

}
</code></pre><p>The presence of the provider object indicates an Ethereum user. We won’t go too deep but this global object acts as a gateway. Some highlights of the features:</p><ul><li><p><code>provider.isMetaMask</code> - Each wallet has its own variation(<code>provider.isTally</code>) but this allows you to check the wallet currently installed and active.</p></li><li><p><code>provider.isConnected()</code> - Check if the application is already connected.</p></li><li><p>send events - eg <code>provider.on(&apos;connect&apos;, handler: (connectInfo: ConnectInfo) =&gt; void);</code></p></li></ul><p>Hopefully, this should help with the basic building blocks to understanding how an injected wallet is interacting with your browser.</p><h3 id="h-how-is-tally-ho-different" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">How is Tally Ho Different?</h3><blockquote><p>Unrelated to the overarching concept but provides some context for future pieces in the wallet integration series.</p></blockquote><p>Tally Ho knows they are the underdog(pun intended lol). They need to be able to allow devs to connect in any way possible. While also not impeding the experience of having multiple browsers installed as it scales and before it has the full war chest of features we Web3 natives need.</p><p>The wallet does this in two ways:</p><ul><li><p>Allowing users to set the wallet as default in the settings. This then injects the <code>window.ethereum</code> object that you could use <code>window.ethereum.isTally</code> and it would return <code>true</code>. If it is not set to default and another wallet was installed, that wallet would now take precedence. This helps provide Tally with ease of integration while leveraging existing infrastructure.</p></li><li><p>Tally Ho also injects the <code>window.Tally</code> object to allow it to act as a stand-alone wallet alongside other injected providers and empowers developers to be able to use say Tally Ho and Metamask and connect separately.</p></li></ul><h2 id="h-commits" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Commits</h2><ol><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/WalletConnect/web3modal/pull/389/commits/79f3395a86fcd6cabf9301ac62024675d296b568">Add Tally as an injected option</a></p></li></ol><p>This adds a couple of items. A image to use when the library recognizes Tally Ho as an injected provider. Also added is the standard <code>IProviderInfo</code> type into the <code>src/providers/injected/index.ts</code> file with the Tally configs set. The <code>/injected/index.ts</code> file houses all of the injected providers and some other logic loops through to see what one is connected. The logic is not necessary to dive into now but post 3(Wallet Integration: Hard) in this wallet integration series explains it more in depth</p><ol><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/WalletConnect/web3modal/pull/389/commits/758bafa081b69788d21056c105d7bb19cc335dbc">Add Tally to documentation</a></p></li></ol><p>This commit simply updates the documentation to allow devs to know that Tally Ho is integrated within Web3Modal.</p><h2 id="h-conclusion" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Conclusion</h2><p>While helping work on Web3 apps may seem daunting at first. This wallet integration helps to break down how easy some of these features can be to add. An integration like this is a great way for a relatively small piece of work to provide an exponential amount of value due to the library already being integrated with numerous DApps. Every time one of the DApps updates to the version this change was introduced Tally Ho is able to connect.</p><div data-type="subscribeButton" class="center-contents"><a class="email-subscribe-button" href="null">Subscribe</a></div><h2 id="h-this-is-one-of-many-articles-based-on-the-concept-of-pull-requests-with-zoz" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">This is one of many articles based on the concept of pull-requests-with-zoz</h2><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://mirror.xyz/zoz.eth/WtdGWxlW1tLfujD4-SdhPwAFkMHcJNdwr-WIOG0xSxw">https://mirror.xyz/zoz.eth/WtdGWxlW1tLfujD4-SdhPwAFkMHcJNdwr-WIOG0xSxw</a></p><h3 id="h-cover-image" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Cover Image------------------------------------------------------------</h3><p>The image above(like my PP) is created with <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://abraham.ai/">abraham.ai</a> - an AI artwork generator <strong>SEED:</strong> zoz.eth integrating a dog wallet with a blockchain network using easy mode</p><h3 id="h-about" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">About-------------------------------------------------------------------</h3><p><em>Twitter:</em> @0xzoz <em>GitHub:</em> @0xzoz <em>Mirror:</em> @0xzoz <em>Discord:</em> @zoz.eth#6952 <strong>---------------------------------------------------------------------------------------</strong></p><p><strong>ENS: zoz.eth</strong></p>]]></content:encoded>
            <author>zoz@newsletter.paragraph.com (0xZOZ)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/f9057b0be99b627c8ac185edb075b759bd7273cbc47e8d2583c258cc2724c668.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[How to Send a Pull Request]]></title>
            <link>https://paragraph.com/@zoz/how-to-send-a-pull-request</link>
            <guid>TJq0i8A6C7mYaUZk4fi2</guid>
            <pubDate>Tue, 20 Sep 2022 17:33:09 GMT</pubDate>
            <description><![CDATA[To Begin With……If you are a seasoned dev you can skip this. Believe it or not, it actually took a long time for me to figure out how to contribute to open-source projects. I wanted to use this as a primer and as a reference to send to people when they inevitably ask ‘What is a PR?’ or ‘How do I create a PR?’IntroductionA pull request is how a developer can add changes to a codebase using a version control framework. In open source communities, a pull request is like a welcome handshake, it wi...]]></description>
            <content:encoded><![CDATA[<h2 id="h-to-begin-with" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">To Begin With……</h2><p>If you are a seasoned dev you can skip this. Believe it or not, it actually took a long time for me to figure out how to contribute to open-source projects. I wanted to use this as a primer and as a reference to send to people when they inevitably ask ‘What is a PR?’ or ‘How do I create a PR?’</p><h2 id="h-introduction" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Introduction</h2><p>A pull request is how a developer can add changes to a codebase using a version control framework. In open source communities, a pull request is like a welcome handshake, it will determine first and foremost if your code will be added to the repository and will leave an impression on the other contributors who will decide if they would like you to contribute to future work. These are some items I wish I knew before diving head first!</p><h2 id="h-terms" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Terms</h2><p><strong>Open Source:</strong> Open source means <strong>anybody is free to use, study, modify, and distribute your project for any purpose</strong>. These permissions are enforced through an open source license.</p><p><strong>Version Control:</strong> Version control is a system that records changes to a file or set of files over time so that you can recall specific versions later.</p><p><strong>Repository:</strong> A Git repository is the <code>.git/</code> folder inside a project. This repository tracks all changes made to files in your project, building history over time. Meaning, if you delete the <code>.git/</code> folder, then you delete your project’s history.</p><p><strong>Branch:</strong> a <code>branch</code> is a new/separate version of the main repository</p><p><strong>Commit:</strong> Adding commits keep track of our progress and changes as we work. Git considers each <code>commit</code> change point or &quot;save point&quot;. It is a point in the project you can go back to if you find a bug, or want to make a change</p><p><strong>Git:</strong> Git is <em>a free and open source distributed version control system</em> designed to handle everything from small to very large projects with speed and efficiency.</p><p><strong>GitHub:</strong> GitHub is a code hosting platform for collaboration and version control. A GitHub <strong>repository</strong> can be used to store a development <strong>project</strong>. You can think of it like a UI for Git.</p><p><strong>Fork:</strong> Forking is creating a clone of the current repository.</p><p>and of course ⬇️</p><h2 id="h-what-is-a-pull-request" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">What is a Pull Request</h2><p>When a group of people are contributing to a development project, to keep the main code that is operational clean and working, there is a standard set of rules that takes place. We will simplify this a lot for brevity and to help give context to our goal - <em>Creating our first PR</em></p><p>When we would like to add a feature or fix a bug in the production code(main branch) these are the steps we follow:</p><ul><li><p>We create another branch</p></li><li><p>Write our changes</p></li><li><p>Test</p></li><li><p>Merge back into the main branch</p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/5d68e7788b9e86e415ad7eabee8996261aaf064a5899109b0e66c2d385d21f14.jpg" alt="From the Main branch on the left. A new developer forks the code, and adds some new code down the bottom in &apos;New Code Contribution&apos;. The repository maintainers discuss what changes need to be made to the contribution. After the developer makes the changes, it is then merged into the main branch." blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">From the Main branch on the left. A new developer forks the code, and adds some new code down the bottom in &apos;New Code Contribution&apos;. The repository maintainers discuss what changes need to be made to the contribution. After the developer makes the changes, it is then merged into the main branch.</figcaption></figure><h2 id="h-creating-your-first-pull-request" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Creating your First Pull Request</h2><p>I learn by doing so I have set up this interactive tutorial to get you creating your first PR. You can find the Repo <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/0xzoz/pull-requests-with-zoz">here</a> and feel free to comment, ask questions and interact as much as you would like.</p><blockquote><p>This tutorial assumes that you have a <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/">Github</a> account, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://code.visualstudio.com/download">VSCode</a> installed and know what the terminal is. If you feel setting up your environment would be a useful article drop me a message.</p></blockquote><ol><li><p>Fork the repo by going to this [link](<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://git">https://git</a> clone <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/0xzoz/pull-requests-with-zoz.git">https://github.com/0xzoz/pull-requests-with-zoz.git</a>) and clicking the <em>fork</em> button at the top right</p></li><li><p>Clone the <em>pull-requests-with-zoz</em> repo<code>git clone https://github.com/&lt;your-username&gt;/pull-requests-with-zoz.git</code></p></li><li><p>Create a new branch to add your changes <code>git checkout -b add-new-name</code></p></li><li><p>Navigate to the root(the <strong>top-level directory</strong> in a folder structure) and there will be a file named <code>Letsgooooo.md</code>. Open it and add your GitHub handle( eg @0xZOZ) and a sentence.</p></li></ol><pre data-type="codeBlock" text="[//]: # (letsgooooo.md) 

Welcome to PR&apos;s with zoz. Hold your breath, you are about to create your first PR. 

@0xzoz - I made it!!!!
@your-username - You made it!!! // this is new code that you will add
"><code>[//]: # (letsgooooo.md) 

Welcome <span class="hljs-keyword">to</span> PR<span class="hljs-comment">'s with zoz. Hold your breath, you are about to create your first PR. </span>

@<span class="hljs-number">0</span>xzoz - I made it!!!!
@your-username - You made it!!! // this <span class="hljs-built_in">is</span> <span class="hljs-built_in">new</span> code that you will add
</code></pre><p>5. Add and Commit the code to the branch</p><p><code>git add .</code> - This is adding all the changes that have been made within the repository</p><p><code>git commit -m ‘Add yourname to file’</code> - This stages all the changes to the current branch with a message about those changes.</p><p>6. Push the changes and branch to Github. <code>git push</code></p><blockquote><p>this will result in an error and will give you a command similar to the following because it is the first time you add the branch to the repo</p></blockquote><p><code>git push --set-upstream origin add-zoz</code></p><p>7. Navigate back to your forked repo. You should now see a little banner at the top of the page like this</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/848c2c022641c7782362c6e3ce566a158246fe2b14df13a46f3795ddb0aad7c7.png" alt="Go on - click it!" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Go on - click it!</figcaption></figure><p>8. There is a template that will be similar to what you see when you are contributing to open-source projects. Take note of the branch you are merging into eg you want to merge the <code>add-zoz</code> branch into the <code>main</code> branch</p><p><strong>Congratulations!!!!</strong> You just submitted your first PR. I hope this helped you get started, you are now ready to start diving into the <code>pull-requests-with-zoz</code> series</p><h2 id="h-what-is-the-pull-requests-with-zoz-series" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">What is the pull-requests-with-zoz series?</h2><p>This series is for the curious potential web3 coders out there. I, like you, started with a vision that blockchain and web3 will change the world yet I didn’t have the skill set to actively help build that world we so long for.</p><p>pull-requests-with-zoz will help anyone of any skill set learn about a product, project or discipline in a new content form I felt would be beneficial for others. It consists of two complementary pieces:</p><ol><li><p>A pull request that was contributed to an open source crypto project</p></li><li><p>An article explaining the what, why and how.....</p></li></ol><p>The series will be in no specific order but as more PRs get completed, the collection will be bundled into focused groups as the content grows.</p><h2 id="h-breakdown" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Breakdown</h2><p>Each article will have the following structure:</p><ul><li><p>Motivation</p></li><li><p>Tech/Product</p></li><li><p>Pull Request Reference</p></li><li><p>Scope</p></li><li><p>Breakdown of commits</p><ul><li><p>What is happening in each one</p></li><li><p>Why design decisions were made</p></li><li><p>Issues</p></li></ul></li><li><p>Conclusion</p></li></ul><h2 id="h-why" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Why</h2><p>I started developing open source software with not much knowledge. It was a huge step to be able to send my first PR(one line of code lol). With each PR, I get a little bit better at understanding these new technologies. While it takes me more time than it should. If I can give back to help others understand concepts faster. It makes me feel like those extra hours were worth it.</p><blockquote><p>These are for me as much as they are for you. I am by no means an expert and writing these down for others helps me grasp the concepts. There will be errors but there will also be valuable gems that will help breed the next cohort of everyday cypherpunks trying to change the world.</p></blockquote><div data-type="subscribeButton" class="center-contents"><a class="email-subscribe-button" href="null">Subscribe</a></div><h3 id="h-learn-how-to-send-your-first-pull-request-and-how-the-pull-requests-with-zoz-series-will-guide-you-through-some-pull-requests-to-open-source-web3-projects" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Learn how to send your first pull request and how the pull-requests-with-zoz series will guide you through some pull requests to open source Web3 projects</h3><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://mirror.xyz/zoz.eth/WtdGWxlW1tLfujD4-SdhPwAFkMHcJNdwr-WIOG0xSxw">https://mirror.xyz/zoz.eth/WtdGWxlW1tLfujD4-SdhPwAFkMHcJNdwr-WIOG0xSxw</a></p><h3 id="h-cover-photo" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Cover Photo-------------------------------------------------------------</h3><p>The image above(like my PP) is created with <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://abraham.ai/">abraham.ai</a> - an AI artwork generator <strong>SEED:</strong> zoz.eth sending a pull request</p><h3 id="h-about" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">About-------------------------------------------------------------------</h3><p><em>Twitter:</em> @0xzoz <em>GitHub:</em> @0xzoz <em>Mirror:</em> @0xzoz <em>Discord:</em> @zoz.eth#6952 <strong>---------------------------------------------------------------------------------------</strong></p><p><strong>ENS: zoz.eth</strong></p>]]></content:encoded>
            <author>zoz@newsletter.paragraph.com (0xZOZ)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/f756bceade00a52197efa83ae7f2059f5a8ac3d0aacfd68b0d5528b4c1bd7101.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Deploy a Data Model to Ceramic]]></title>
            <link>https://paragraph.com/@zoz/deploy-a-data-model-to-ceramic</link>
            <guid>MEuBZfSSfEQcAZbYuI1r</guid>
            <pubDate>Wed, 01 Jun 2022 15:23:32 GMT</pubDate>
            <description><![CDATA[What is Ceramic?The website describes it as: “Ceramic is a decentralized data network that brings unlimited data composability to Web3 applications.” but what does that mean exactly, and why should you care. Ceramic acts as a platform to store your user’s data and create standardized data models that, once adopted and reused by the industry, will allow the next layer of composability within Web3 and Defi. It uniquely allows the user to own their data using their DID(persistent decentralized i...]]></description>
            <content:encoded><![CDATA[<h2 id="h-what-is-ceramic" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">What is Ceramic?</h2><p>The website describes it as: “Ceramic is a decentralized data network that brings unlimited data composability to Web3 applications.” but what does that mean exactly, and why should you care.</p><p>Ceramic acts as a platform to store your user’s data and create standardized data models that, once adopted and reused by the industry, will allow the next layer of composability within Web3 and Defi. It uniquely allows the user to own their data using their DID(persistent decentralized identifier) that can be generated in many ways, but in this case, using the user’s crypto wallet.</p><p>It works by creating streams for data models that are then available for users using their DID. You can think of it as a data table, your DID is the row, and each stream created is a column. An example might look like the one below:</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/2105bb0726c14652ac51cde83814d44c0cce1d59795d320742241e46caeb29b6.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><h2 id="h-motivation-for-this-article" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Motivation for this Article</h2><p>I set out to learn ceramic and how to integrate it into an application after two things happened. Firstly, I heard <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/KyleSamani?s=20&amp;t=Blsme96LZQeTxUQG1MV2vg">Kyle Samani</a>(investor at MultiCoin Capital) mention the platform on <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://epicenter.tv/episodes/441">Epicenter</a> and secondly, I saw there was a bounty to connect a ceramic data model into the Superfluid Console for Eth Shanghai hackathon.</p><p>I started with the best intentions, but apart from the documentation available via the Ceramic website, there were not many tutorials from contributors. I found it hard to navigate the documentation to see what I wanted to do. The team is currently reworking some of the documentation. This is by no means a criticism of the team and the work done; they are big brains and have made fantastic docs to match their state-of-the-art protocol. This tutorial was created for people like myself who are <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://t.co/Qb5Dyjw6xv">1x engineers</a> and the kind that grasps concepts in a few days/weeks, not seconds. If you are a big brain or a 10x engineer, STOP READING, this will be no good for you.</p><h2 id="h-create-and-deploy" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Create and Deploy</h2><p>To use a Ceramic data model within an application, you will need to either use a standardized model from the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/ceramicstudio/datamodels">Data Model Registry</a>(there are currently only a few available) or deploy the data model to one of the networks(testnet or mainnet) and use the JSON file to link the data models in your application.</p><p><strong>Example JSON Aliases</strong></p><pre data-type="codeBlock" text="{
  &quot;definitions&quot;: {
    &quot;myAddressBook&quot;: &quot;kjzl6cwe1jw1487esfmzik6u8hd9swrut7i73a1b7e8m0gqza0xxuhd61l952hs&quot;,
    &quot;DIDToAddressBook&quot;: &quot;kjzl6cwe1jw145wbun7wd2507nf00thucutl5wgrl5gtbq8mh852ux33z5si6j6&quot;
  },
  &quot;schemas&quot;: {
    &quot;AddressBook&quot;: &quot;ceramic://k3y52l7qbv1frxxzi0b8ecysa2rlbtrzwt78blhu9grb9ywdnwda918psqxtc7xts&quot;,
    &quot;DIDToAddressBook&quot;: &quot;ceramic://k3y52l7qbv1frydo84ulca4ps700j88id1roidw6j4vfnpln8mjo63694x0trtji8&quot;
  },
  &quot;tiles&quot;: {}
}   
"><code><span class="hljs-punctuation">{</span>
  <span class="hljs-attr">"definitions"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
    <span class="hljs-attr">"myAddressBook"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"kjzl6cwe1jw1487esfmzik6u8hd9swrut7i73a1b7e8m0gqza0xxuhd61l952hs"</span><span class="hljs-punctuation">,</span>
    <span class="hljs-attr">"DIDToAddressBook"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"kjzl6cwe1jw145wbun7wd2507nf00thucutl5wgrl5gtbq8mh852ux33z5si6j6"</span>
  <span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span>
  <span class="hljs-attr">"schemas"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
    <span class="hljs-attr">"AddressBook"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"ceramic://k3y52l7qbv1frxxzi0b8ecysa2rlbtrzwt78blhu9grb9ywdnwda918psqxtc7xts"</span><span class="hljs-punctuation">,</span>
    <span class="hljs-attr">"DIDToAddressBook"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"ceramic://k3y52l7qbv1frydo84ulca4ps700j88id1roidw6j4vfnpln8mjo63694x0trtji8"</span>
  <span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span>
  <span class="hljs-attr">"tiles"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span><span class="hljs-punctuation">}</span>
<span class="hljs-punctuation">}</span>   
</code></pre><p>Today, we will learn how to deploy and create a pull request to add your brand spankin new data model to the registry and make sure others can use your incredible work.</p><h3 id="h-get-the-glaze-cli" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Get the Glaze CLI</h3><p>The team at Ceramic has built an array of great software to help you interact and develop on the platform. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://developers.ceramic.network/reference/glaze/">Glaze suite</a> is a middleware that will help you interact with data models and nodes.</p><ul><li><p>Install Glaze CLI</p></li></ul><p><code>npm install --global @glazed/cli</code></p><ul><li><p>Create a local DID to work with</p></li></ul><p><code>glaze did:create</code></p><p><em>Make sure you save the output as you will need to use the seed later in the tutorial with the</em> <code>--key</code> <em>flag</em></p><h3 id="h-flags" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Flags</h3><p>You will need two flags to send most of the commands below:</p><ul><li><p><code>--key</code>: Your seed from above</p></li><li><p><code>--ceramic</code>: the URI of the node you want to connect.</p></li></ul><blockquote><p>You can get a node URI from the Ceramic Discord <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://discord.gg/AzUMf94k">#community-nodes</a> channel</p></blockquote><h3 id="h-create-the-data-model" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Create the Data Model</h3><p>We will use the Address Book data model used in the ETH Shanghai Hackathon. But before we do, lets look at some good tools to help you use these data models</p><p><strong>JSON Schema Tools</strong></p><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://json-schema-faker.js.org/">Schema converter</a></p></li></ul><ul><li><p><em>This will make it easier to see the actual structure of a reversed engineer object from your schema</em></p></li></ul><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://codebeautify.org/jsonminifier">JSON beautifier</a></p></li></ul><ul><li><p><em>This will help reduce your schema to a one-liner if you need it</em></p></li></ul><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://tiles.ceramic.community/document/k3y52l7qbv1frxycyoblevfvx12ws5t0iuqmrwiadl36p20ectvw9yuhs4g9uruv4">Tile checker</a></p></li></ul><ul><li><p>*This will allow you to view your deployed schema via the web</p></li></ul><ul><li><br></li></ul><p><strong>Example Schema</strong></p><pre data-type="codeBlock" text="{
  &quot;$schema&quot;: &quot;http://json-schema.org/draft-07/schema#&quot;,
  &quot;type&quot;: &quot;object&quot;,
  &quot;title&quot;: &quot;AddressBook&quot;,
  &quot;required&quot;: [
    &quot;total_cnt&quot;,
    &quot;contacts&quot;
  ],
  &quot;additionalProperties&quot;: false,
  &quot;properties&quot;: {
    &quot;total_cnt&quot;: {
      &quot;type&quot;: &quot;integer&quot;,
      &quot;description&quot;: &quot;The total number of contacts&quot;,
      &quot;default&quot;: 0
    },
    &quot;contacts&quot;: {
      &quot;type&quot;: &quot;array&quot;,
      &quot;default&quot;: [],
      &quot;items&quot;: {
        &quot;type&quot;: &quot;object&quot;,
        &quot;required&quot;: [
          &quot;name&quot;,
          &quot;wallets&quot;
        ],
        &quot;additionalProperties&quot;: false,
        &quot;properties&quot;: {
          &quot;name&quot;: {
            &quot;type&quot;: &quot;string&quot;,
            &quot;description&quot;: &quot;The contacts name&quot;,
            &quot;default&quot;: &quot;&quot;
          },
          &quot;wallets&quot;: {
            &quot;type&quot;: &quot;array&quot;,
            &quot;description&quot;: &quot;Collection of the contacts wallet addresses and respective networks&quot;,
            &quot;default&quot;: [],
            &quot;items&quot;: {
              &quot;type&quot;: &quot;object&quot;,
              &quot;default&quot;: {},
              &quot;required&quot;: [
                &quot;walletAddress&quot;,
                &quot;network&quot;
              ],
              &quot;additionalProperties&quot;: false,
              &quot;properties&quot;: {
                &quot;walletAddress&quot;: {
                  &quot;type&quot;: &quot;string&quot;,
                  &quot;default&quot;: &quot;&quot;
                },
                &quot;network&quot;: {
                  &quot;type&quot;: &quot;string&quot;,
                  &quot;default&quot;: &quot;&quot;
                }
              }
            }
          },
          &quot;avatar&quot;: {
            &quot;type&quot;: &quot;string&quot;,
            &quot;description&quot;: &quot;Optional URI of user avatar&quot;,
            &quot;default&quot;: &quot;&quot;
          },
          &quot;tags&quot;: {
            &quot;type&quot;: &quot;array&quot;,
            &quot;description&quot;: &quot;Optional tags for the contact&quot;,
            &quot;items&quot;: {
              &quot;type&quot;: &quot;string&quot;
            },
            &quot;minItems&quot;: 1,
            &quot;uniqueItems&quot;: true
          },
          &quot;data&quot;: {
            &quot;type&quot;: &quot;object&quot;,
            &quot;description&quot;: &quot;Fields to include optional arbitrary data&quot;,
            &quot;properties&quot;: {}
          }
        }
      }
    }
  }
}
"><code>{
  <span class="hljs-string">"<span class="hljs-variable">$schema</span>"</span>: <span class="hljs-string">"http://json-schema.org/draft-07/schema#"</span>,
  <span class="hljs-string">"type"</span>: <span class="hljs-string">"object"</span>,
  <span class="hljs-string">"title"</span>: <span class="hljs-string">"AddressBook"</span>,
  <span class="hljs-string">"required"</span>: [
    <span class="hljs-string">"total_cnt"</span>,
    <span class="hljs-string">"contacts"</span>
  ],
  <span class="hljs-string">"additionalProperties"</span>: <span class="hljs-literal">false</span>,
  <span class="hljs-string">"properties"</span>: {
    <span class="hljs-string">"total_cnt"</span>: {
      <span class="hljs-string">"type"</span>: <span class="hljs-string">"integer"</span>,
      <span class="hljs-string">"description"</span>: <span class="hljs-string">"The total number of contacts"</span>,
      <span class="hljs-string">"default"</span>: 0
    },
    <span class="hljs-string">"contacts"</span>: {
      <span class="hljs-string">"type"</span>: <span class="hljs-string">"array"</span>,
      <span class="hljs-string">"default"</span>: [],
      <span class="hljs-string">"items"</span>: {
        <span class="hljs-string">"type"</span>: <span class="hljs-string">"object"</span>,
        <span class="hljs-string">"required"</span>: [
          <span class="hljs-string">"name"</span>,
          <span class="hljs-string">"wallets"</span>
        ],
        <span class="hljs-string">"additionalProperties"</span>: <span class="hljs-literal">false</span>,
        <span class="hljs-string">"properties"</span>: {
          <span class="hljs-string">"name"</span>: {
            <span class="hljs-string">"type"</span>: <span class="hljs-string">"string"</span>,
            <span class="hljs-string">"description"</span>: <span class="hljs-string">"The contacts name"</span>,
            <span class="hljs-string">"default"</span>: <span class="hljs-string">""</span>
          },
          <span class="hljs-string">"wallets"</span>: {
            <span class="hljs-string">"type"</span>: <span class="hljs-string">"array"</span>,
            <span class="hljs-string">"description"</span>: <span class="hljs-string">"Collection of the contacts wallet addresses and respective networks"</span>,
            <span class="hljs-string">"default"</span>: [],
            <span class="hljs-string">"items"</span>: {
              <span class="hljs-string">"type"</span>: <span class="hljs-string">"object"</span>,
              <span class="hljs-string">"default"</span>: {},
              <span class="hljs-string">"required"</span>: [
                <span class="hljs-string">"walletAddress"</span>,
                <span class="hljs-string">"network"</span>
              ],
              <span class="hljs-string">"additionalProperties"</span>: <span class="hljs-literal">false</span>,
              <span class="hljs-string">"properties"</span>: {
                <span class="hljs-string">"walletAddress"</span>: {
                  <span class="hljs-string">"type"</span>: <span class="hljs-string">"string"</span>,
                  <span class="hljs-string">"default"</span>: <span class="hljs-string">""</span>
                },
                <span class="hljs-string">"network"</span>: {
                  <span class="hljs-string">"type"</span>: <span class="hljs-string">"string"</span>,
                  <span class="hljs-string">"default"</span>: <span class="hljs-string">""</span>
                }
              }
            }
          },
          <span class="hljs-string">"avatar"</span>: {
            <span class="hljs-string">"type"</span>: <span class="hljs-string">"string"</span>,
            <span class="hljs-string">"description"</span>: <span class="hljs-string">"Optional URI of user avatar"</span>,
            <span class="hljs-string">"default"</span>: <span class="hljs-string">""</span>
          },
          <span class="hljs-string">"tags"</span>: {
            <span class="hljs-string">"type"</span>: <span class="hljs-string">"array"</span>,
            <span class="hljs-string">"description"</span>: <span class="hljs-string">"Optional tags for the contact"</span>,
            <span class="hljs-string">"items"</span>: {
              <span class="hljs-string">"type"</span>: <span class="hljs-string">"string"</span>
            },
            <span class="hljs-string">"minItems"</span>: 1,
            <span class="hljs-string">"uniqueItems"</span>: <span class="hljs-literal">true</span>
          },
          <span class="hljs-string">"data"</span>: {
            <span class="hljs-string">"type"</span>: <span class="hljs-string">"object"</span>,
            <span class="hljs-string">"description"</span>: <span class="hljs-string">"Fields to include optional arbitrary data"</span>,
            <span class="hljs-string">"properties"</span>: {}
          }
        }
      }
    }
  }
}
</code></pre><ul><li><p>Create Data Model</p></li></ul><p><code>glaze model:create address-book --key=&lt;YOUR SEED&gt; -c=&lt;NODE URI&gt;</code></p><ul><li><p>Add Address Book Schema</p></li></ul><p><code>glaze model:add address-book schema AddressBook “{JSON}” --key=&lt;YOUR SEED&gt; -c=&lt;NODE URI&gt;</code></p><blockquote><p>If you have any other schemas. You would insert them now. For the hackathon there was one other Schema that was used - DIDToAddressBook</p></blockquote><p><strong>Definitions</strong></p><p>You also want to add definitions to this model for any schemas you have created. -</p><ul><li><p>Definitions are used in the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://developers.ceramic.network/tools/glaze/glossary/#index">Index</a> of the DID DataStore.</p></li><li><p>An Index is a <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://developers.ceramic.network/docs/advanced/standards/stream-programs/tile-document/#features">TileDocument</a> matching the IdentityIndex spec from <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/ceramicnetwork/CIP/blob/main/CIPs/CIP-11/CIP-11.md">CIP-11</a>, used by the DID DataStore to associate <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://developers.ceramic.network/tools/glaze/glossary/#definition">Definition</a> IDs to <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://developers.ceramic.network/tools/glaze/glossary/#record">Record</a> IDs</p></li></ul><p><strong>Example Definition</strong></p><pre data-type="codeBlock" text="&apos;{
    &quot;name&quot;: &quot;My address book&quot;,
    &quot;description&quot;: &quot;Address book to keep track of a users        different accounts and contacts&quot;,        
    &quot;schema&quot;: &quot;ceramic://k3y52l7qbv1frxxzi0b8ecysa2rlbtrzwt78blhu9grb9ywdnwda918psqxtc7xts&quot;
}&apos; 
"><code><span class="hljs-comment">'{</span>
    <span class="hljs-string">"name"</span>: <span class="hljs-string">"My address book"</span>,
    <span class="hljs-string">"description"</span>: <span class="hljs-string">"Address book to keep track of a users        different accounts and contacts"</span>,        
    <span class="hljs-string">"schema"</span>: <span class="hljs-string">"ceramic://k3y52l7qbv1frxxzi0b8ecysa2rlbtrzwt78blhu9grb9ywdnwda918psqxtc7xts"</span>
}<span class="hljs-comment">' </span>
</code></pre><ul><li><p>Add Definition</p></li></ul><p><code>glaze model:add address-book definition myAddressBook --key=&lt;YOUR SEED&gt; -c=&lt;NODE URI&gt;</code></p><ul><li><p>Publish the Model</p></li></ul><p><code>glaze model:deploy address-book publishedAddressBook.json --key=&lt;YOUR SEED&gt; -c=&lt;NODE URI&gt;</code></p><blockquote><p>Where publishedAddressBook.json is the aliases file you will use in your app.</p></blockquote><p><strong>Example publishedAddressBook.json</strong></p><pre data-type="codeBlock" text="{
  &quot;definitions&quot;: {
    &quot;myAddressBook&quot;: &quot;kjzl6cwe1jw1487esfmzik6u8hd9swrut7i73a1b7e8m0gqza0xxuhd61l952hs&quot;
  },
  &quot;schemas&quot;: {
    &quot;AddressBook&quot;: &quot;ceramic://k3y52l7qbv1frxxzi0b8ecysa2rlbtrzwt78blhu9grb9ywdnwda918psqxtc7xts&quot;
  },
  &quot;tiles&quot;: {}
}
"><code><span class="hljs-punctuation">{</span>
  <span class="hljs-attr">"definitions"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
    <span class="hljs-attr">"myAddressBook"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"kjzl6cwe1jw1487esfmzik6u8hd9swrut7i73a1b7e8m0gqza0xxuhd61l952hs"</span>
  <span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span>
  <span class="hljs-attr">"schemas"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
    <span class="hljs-attr">"AddressBook"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"ceramic://k3y52l7qbv1frxxzi0b8ecysa2rlbtrzwt78blhu9grb9ywdnwda918psqxtc7xts"</span>
  <span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span>
  <span class="hljs-attr">"tiles"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span><span class="hljs-punctuation">}</span>
<span class="hljs-punctuation">}</span>
</code></pre><p><strong>Congratulations!!!</strong> You have now built and deployed at DataModel to Ceramic. It is ready to be integrated into your application. We will go over how to do that in another post but let’s first see how you can create a PR to add this new shiny DataModel to the Ceramic Data Model Registry.</p><h2 id="h-add-the-data-model-to-the-ceramic-data-model-registry" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Add the Data Model to the Ceramic Data Model Registry</h2><blockquote><p>You can find the repository <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/ceramicstudio/datamodels">here</a> and an example PR <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/ceramicstudio/datamodels/pull/40">here</a></p></blockquote><ul><li><p>Fork the Data Model Registry Repo and clone on your local computer <code>git clone &lt;YOUR NEW REPO&gt;</code></p></li><li><p>Create a new branch <code>git checkout -b add-new-data-model</code></p></li><li><p>Create a new folder in the /models directory with the name of your data model eg /address-book</p></li><li><p>Use one of the existing data models as a template, most of the root files will stay the same apart from package.json that will require some minor changes</p></li><li><p>Create a /schema directory and in the directory use the schemas that you just used to create your model and create a file in that directory.</p></li><li><p>Create a /src directory and add an index.js file. To get the details that you need for the EncodedManagedModel you will need the following command. <code>glaze model:export address-book exportedAddressBook.json</code></p><p>**Example exportedAddressBook.json</p></li></ul><p>**</p><pre data-type="codeBlock" text="{
  &quot;schemas&quot;: {
    &quot;kjzl6cwe1jw147layx2v9p53o0i6q4hzjutuvpkkgf39u7xf68m958jdlsdos47&quot;: {
      &quot;alias&quot;: &quot;AddressBook&quot;,
      &quot;commits&quot;: [
        {
          &quot;jws&quot;: {
            &quot;payload&quot;: &quot;AXESIFHH8eYt5V4Sk7gHQnKgYYjKBPZHCCnJR4OuZgoi6jaU&quot;,
            &quot;signatures&quot;: [
              {
                &quot;signature&quot;: &quot;b4EvyuK3NZr97VmT01nsy4QFCMVBw2ck4yhsNBcLLJIf2ssr687seAOT_b0cvYVoSwDaIrdc8NoBul2JHYZuCA&quot;,
                &quot;protected&quot;: &quot;eyJhbGciOiJFZERTQSIsImtpZCI6ImRpZDprZXk6ejZNa2VpOXJyelF2aVlqcGJhVjFNcDFhVFVibmY0aWpidTNvekpVZnB5VTVQWGg3I3o2TWtlaTlycnpRdmlZanBiYVYxTXAxYVRVYm5mNGlqYnUzb3pKVWZweVU1UFhoNyJ9&quot;
              }
            ],
            &quot;link&quot;: &quot;bafyreicry7y6mlpflyjjhoahijzkaymizicpmryifheupa5omyfcf2rwsq&quot;
          },
          &quot;linkedBlock&quot;: &quot;omRkYXRhpmR0eXBlZm9iamVjdGV0aXRsZWtBZGRyZXNzQm9va2ckc2NoZW1heCdodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA3L3NjaGVtYSNocmVxdWlyZWSCaXRvdGFsX2NudGhjb250YWN0c2pwcm9wZXJ0aWVzomhjb250YWN0c6NkdHlwZWVhcnJheWVpdGVtc6RkdHlwZWZvYmplY3RocmVxdWlyZWSCZG5hbWVnd2FsbGV0c2pwcm9wZXJ0aWVzpWRkYXRho2R0eXBlZm9iamVjdGpwcm9wZXJ0aWVzoGtkZXNjcmlwdGlvbngpRmllbGRzIHRvIGluY2x1ZGUgb3B0aW9uYWwgYXJiaXRyYXJ5IGRhdGFkbmFtZaNkdHlwZWZzdHJpbmdnZGVmYXVsdGBrZGVzY3JpcHRpb25xVGhlIGNvbnRhY3RzIG5hbWVkdGFnc6VkdHlwZWVhcnJheWVpdGVtc6FkdHlwZWZzdHJpbmdobWluSXRlbXMBa2Rlc2NyaXB0aW9ueB1PcHRpb25hbCB0YWdzIGZvciB0aGUgY29udGFjdGt1bmlxdWVJdGVtc/VmYXZhdGFyo2R0eXBlZnN0cmluZ2dkZWZhdWx0YGtkZXNjcmlwdGlvbngbT3B0aW9uYWwgVVJJIG9mIHVzZXIgYXZhdGFyZ3dhbGxldHOkZHR5cGVlYXJyYXllaXRlbXOlZHR5cGVmb2JqZWN0Z2RlZmF1bHSgaHJlcXVpcmVkgm13YWxsZXRBZGRyZXNzZ25ldHdvcmtqcHJvcGVydGllc6JnbmV0d29ya6JkdHlwZWZzdHJpbmdnZGVmYXVsdGBtd2FsbGV0QWRkcmVzc6JkdHlwZWZzdHJpbmdnZGVmYXVsdGB0YWRkaXRpb25hbFByb3BlcnRpZXP0Z2RlZmF1bHSAa2Rlc2NyaXB0aW9ueENDb2xsZWN0aW9uIG9mIHRoZSBjb250YWN0cyB3YWxsZXQgYWRkcmVzc2VzIGFuZCByZXNwZWN0aXZlIG5ldHdvcmtzdGFkZGl0aW9uYWxQcm9wZXJ0aWVz9GdkZWZhdWx0gGl0b3RhbF9jbnSjZHR5cGVnaW50ZWdlcmdkZWZhdWx0AGtkZXNjcmlwdGlvbngcVGhlIHRvdGFsIG51bWJlciBvZiBjb250YWN0c3RhZGRpdGlvbmFsUHJvcGVydGllc/RmaGVhZGVyomZ1bmlxdWVwZjloTjNjY0h3U01jeFoyaGtjb250cm9sbGVyc4F4OGRpZDprZXk6ejZNa2VpOXJyelF2aVlqcGJhVjFNcDFhVFVibmY0aWpidTNvekpVZnB5VTVQWGg3&quot;
        }
      ],
      &quot;dependencies&quot;: {},
      &quot;version&quot;: &quot;k3y52l7qbv1frxxzi0b8ecysa2rlbtrzwt78blhu9grb9ywdnwda918psqxtc7xts&quot;
    }
  },
  &quot;definitions&quot;: {
    &quot;kjzl6cwe1jw1487esfmzik6u8hd9swrut7i73a1b7e8m0gqza0xxuhd61l952hs&quot;: {
      &quot;alias&quot;: &quot;myAddressBook&quot;,
      &quot;commits&quot;: [
        {
          &quot;jws&quot;: {
            &quot;payload&quot;: &quot;AXESIFEWkK7SHlFy3aQWYiDEEhXgV561SEgurYkeaqNnGz7n&quot;,
            &quot;signatures&quot;: [
              {
                &quot;signature&quot;: &quot;CYXT973re2KrezmZhr3KLzHdu9ZjBBXFonKwp1C3VhbL7pJz4wWYD64yY1NMLv1nYWJ-Dp3pkvKjxvf__zMXCw&quot;,
                &quot;protected&quot;: &quot;eyJhbGciOiJFZERTQSIsImtpZCI6ImRpZDprZXk6ejZNa2VpOXJyelF2aVlqcGJhVjFNcDFhVFVibmY0aWpidTNvekpVZnB5VTVQWGg3I3o2TWtlaTlycnpRdmlZanBiYVYxTXAxYVRVYm5mNGlqYnUzb3pKVWZweVU1UFhoNyJ9&quot;
              }
            ],
            &quot;link&quot;: &quot;bafyreicrc2ik5uq6kfzn3jawmiqmieqv4blz5nkijaxk3ci6nkrwogz644&quot;
          },
          &quot;linkedBlock&quot;: &quot;omRkYXRho2RuYW1lb015IGFkZHJlc3MgYm9va2ZzY2hlbWF4S2NlcmFtaWM6Ly9rM3k1Mmw3cWJ2MWZyeHh6aTBiOGVjeXNhMnJsYnRyend0NzhibGh1OWdyYjl5d2Rud2RhOTE4cHNxeHRjN3h0c2tkZXNjcmlwdGlvbnhFQWRkcmVzcyBib29rIHRvIGtlZXAgdHJhY2sgb2YgYSB1c2VycyBkaWZmZXJlbnQgYWNjb3VudHMgYW5kIGNvbnRhY3RzZmhlYWRlcqNmc2NoZW1heEtjZXJhbWljOi8vazN5NTJsN3FidjFmcnkxZnA0czBud2RhcmgwdmFodXNhcnBwb3NnZXZ5MHBlbWl5a3ltZDJvcmQ2c3d0aGFyY3dmdW5pcXVlcFFEMTVXWE5PT2ZJMkhlNlRrY29udHJvbGxlcnOBeDhkaWQ6a2V5Ono2TWtlaTlycnpRdmlZanBiYVYxTXAxYVRVYm5mNGlqYnUzb3pKVWZweVU1UFhoNw==&quot;
        }
      ],
      &quot;schema&quot;: &quot;kjzl6cwe1jw147layx2v9p53o0i6q4hzjutuvpkkgf39u7xf68m958jdlsdos47&quot;,
      &quot;version&quot;: &quot;k3y52l7qbv1fry2cp677gjzkn0bidpl233pdefbdbol98jb3uvapcorhmzb501qf4&quot;
    }
  },
  &quot;tiles&quot;: {}
}
"><code><span class="hljs-punctuation">{</span>
  <span class="hljs-attr">"schemas"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
    <span class="hljs-attr">"kjzl6cwe1jw147layx2v9p53o0i6q4hzjutuvpkkgf39u7xf68m958jdlsdos47"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
      <span class="hljs-attr">"alias"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"AddressBook"</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">"commits"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span>
        <span class="hljs-punctuation">{</span>
          <span class="hljs-attr">"jws"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
            <span class="hljs-attr">"payload"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"AXESIFHH8eYt5V4Sk7gHQnKgYYjKBPZHCCnJR4OuZgoi6jaU"</span><span class="hljs-punctuation">,</span>
            <span class="hljs-attr">"signatures"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span>
              <span class="hljs-punctuation">{</span>
                <span class="hljs-attr">"signature"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"b4EvyuK3NZr97VmT01nsy4QFCMVBw2ck4yhsNBcLLJIf2ssr687seAOT_b0cvYVoSwDaIrdc8NoBul2JHYZuCA"</span><span class="hljs-punctuation">,</span>
                <span class="hljs-attr">"protected"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"eyJhbGciOiJFZERTQSIsImtpZCI6ImRpZDprZXk6ejZNa2VpOXJyelF2aVlqcGJhVjFNcDFhVFVibmY0aWpidTNvekpVZnB5VTVQWGg3I3o2TWtlaTlycnpRdmlZanBiYVYxTXAxYVRVYm5mNGlqYnUzb3pKVWZweVU1UFhoNyJ9"</span>
              <span class="hljs-punctuation">}</span>
            <span class="hljs-punctuation">]</span><span class="hljs-punctuation">,</span>
            <span class="hljs-attr">"link"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"bafyreicry7y6mlpflyjjhoahijzkaymizicpmryifheupa5omyfcf2rwsq"</span>
          <span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span>
          <span class="hljs-attr">"linkedBlock"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"omRkYXRhpmR0eXBlZm9iamVjdGV0aXRsZWtBZGRyZXNzQm9va2ckc2NoZW1heCdodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA3L3NjaGVtYSNocmVxdWlyZWSCaXRvdGFsX2NudGhjb250YWN0c2pwcm9wZXJ0aWVzomhjb250YWN0c6NkdHlwZWVhcnJheWVpdGVtc6RkdHlwZWZvYmplY3RocmVxdWlyZWSCZG5hbWVnd2FsbGV0c2pwcm9wZXJ0aWVzpWRkYXRho2R0eXBlZm9iamVjdGpwcm9wZXJ0aWVzoGtkZXNjcmlwdGlvbngpRmllbGRzIHRvIGluY2x1ZGUgb3B0aW9uYWwgYXJiaXRyYXJ5IGRhdGFkbmFtZaNkdHlwZWZzdHJpbmdnZGVmYXVsdGBrZGVzY3JpcHRpb25xVGhlIGNvbnRhY3RzIG5hbWVkdGFnc6VkdHlwZWVhcnJheWVpdGVtc6FkdHlwZWZzdHJpbmdobWluSXRlbXMBa2Rlc2NyaXB0aW9ueB1PcHRpb25hbCB0YWdzIGZvciB0aGUgY29udGFjdGt1bmlxdWVJdGVtc/VmYXZhdGFyo2R0eXBlZnN0cmluZ2dkZWZhdWx0YGtkZXNjcmlwdGlvbngbT3B0aW9uYWwgVVJJIG9mIHVzZXIgYXZhdGFyZ3dhbGxldHOkZHR5cGVlYXJyYXllaXRlbXOlZHR5cGVmb2JqZWN0Z2RlZmF1bHSgaHJlcXVpcmVkgm13YWxsZXRBZGRyZXNzZ25ldHdvcmtqcHJvcGVydGllc6JnbmV0d29ya6JkdHlwZWZzdHJpbmdnZGVmYXVsdGBtd2FsbGV0QWRkcmVzc6JkdHlwZWZzdHJpbmdnZGVmYXVsdGB0YWRkaXRpb25hbFByb3BlcnRpZXP0Z2RlZmF1bHSAa2Rlc2NyaXB0aW9ueENDb2xsZWN0aW9uIG9mIHRoZSBjb250YWN0cyB3YWxsZXQgYWRkcmVzc2VzIGFuZCByZXNwZWN0aXZlIG5ldHdvcmtzdGFkZGl0aW9uYWxQcm9wZXJ0aWVz9GdkZWZhdWx0gGl0b3RhbF9jbnSjZHR5cGVnaW50ZWdlcmdkZWZhdWx0AGtkZXNjcmlwdGlvbngcVGhlIHRvdGFsIG51bWJlciBvZiBjb250YWN0c3RhZGRpdGlvbmFsUHJvcGVydGllc/RmaGVhZGVyomZ1bmlxdWVwZjloTjNjY0h3U01jeFoyaGtjb250cm9sbGVyc4F4OGRpZDprZXk6ejZNa2VpOXJyelF2aVlqcGJhVjFNcDFhVFVibmY0aWpidTNvekpVZnB5VTVQWGg3"</span>
        <span class="hljs-punctuation">}</span>
      <span class="hljs-punctuation">]</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">"dependencies"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span><span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">"version"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"k3y52l7qbv1frxxzi0b8ecysa2rlbtrzwt78blhu9grb9ywdnwda918psqxtc7xts"</span>
    <span class="hljs-punctuation">}</span>
  <span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span>
  <span class="hljs-attr">"definitions"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
    <span class="hljs-attr">"kjzl6cwe1jw1487esfmzik6u8hd9swrut7i73a1b7e8m0gqza0xxuhd61l952hs"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
      <span class="hljs-attr">"alias"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"myAddressBook"</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">"commits"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span>
        <span class="hljs-punctuation">{</span>
          <span class="hljs-attr">"jws"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
            <span class="hljs-attr">"payload"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"AXESIFEWkK7SHlFy3aQWYiDEEhXgV561SEgurYkeaqNnGz7n"</span><span class="hljs-punctuation">,</span>
            <span class="hljs-attr">"signatures"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span>
              <span class="hljs-punctuation">{</span>
                <span class="hljs-attr">"signature"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"CYXT973re2KrezmZhr3KLzHdu9ZjBBXFonKwp1C3VhbL7pJz4wWYD64yY1NMLv1nYWJ-Dp3pkvKjxvf__zMXCw"</span><span class="hljs-punctuation">,</span>
                <span class="hljs-attr">"protected"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"eyJhbGciOiJFZERTQSIsImtpZCI6ImRpZDprZXk6ejZNa2VpOXJyelF2aVlqcGJhVjFNcDFhVFVibmY0aWpidTNvekpVZnB5VTVQWGg3I3o2TWtlaTlycnpRdmlZanBiYVYxTXAxYVRVYm5mNGlqYnUzb3pKVWZweVU1UFhoNyJ9"</span>
              <span class="hljs-punctuation">}</span>
            <span class="hljs-punctuation">]</span><span class="hljs-punctuation">,</span>
            <span class="hljs-attr">"link"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"bafyreicrc2ik5uq6kfzn3jawmiqmieqv4blz5nkijaxk3ci6nkrwogz644"</span>
          <span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span>
          <span class="hljs-attr">"linkedBlock"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"omRkYXRho2RuYW1lb015IGFkZHJlc3MgYm9va2ZzY2hlbWF4S2NlcmFtaWM6Ly9rM3k1Mmw3cWJ2MWZyeHh6aTBiOGVjeXNhMnJsYnRyend0NzhibGh1OWdyYjl5d2Rud2RhOTE4cHNxeHRjN3h0c2tkZXNjcmlwdGlvbnhFQWRkcmVzcyBib29rIHRvIGtlZXAgdHJhY2sgb2YgYSB1c2VycyBkaWZmZXJlbnQgYWNjb3VudHMgYW5kIGNvbnRhY3RzZmhlYWRlcqNmc2NoZW1heEtjZXJhbWljOi8vazN5NTJsN3FidjFmcnkxZnA0czBud2RhcmgwdmFodXNhcnBwb3NnZXZ5MHBlbWl5a3ltZDJvcmQ2c3d0aGFyY3dmdW5pcXVlcFFEMTVXWE5PT2ZJMkhlNlRrY29udHJvbGxlcnOBeDhkaWQ6a2V5Ono2TWtlaTlycnpRdmlZanBiYVYxTXAxYVRVYm5mNGlqYnUzb3pKVWZweVU1UFhoNw=="</span>
        <span class="hljs-punctuation">}</span>
      <span class="hljs-punctuation">]</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">"schema"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"kjzl6cwe1jw147layx2v9p53o0i6q4hzjutuvpkkgf39u7xf68m958jdlsdos47"</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">"version"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"k3y52l7qbv1fry2cp677gjzkn0bidpl233pdefbdbol98jb3uvapcorhmzb501qf4"</span>
    <span class="hljs-punctuation">}</span>
  <span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span>
  <span class="hljs-attr">"tiles"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span><span class="hljs-punctuation">}</span>
<span class="hljs-punctuation">}</span>
</code></pre><ul><li><p>Create Types from your Schema <code>yarn types</code></p></li><li><p>Check that the package builds <code>yarn prepare</code></p></li><li><p>Test that it can be published <code>yarn prepublishOnly</code></p></li><li><p>Commit changes <code>git add .</code> <code>git commit -m ‘Add new data.model’</code></p></li><li><p>Push to the remote repo <code>git push</code></p></li><li><p>When you now go to your repo in Github, you will be able to send a pull request with your changes to the Ceramic DataModel registry repo.</p><p><strong>NICE!!!</strong> You have now contributed to Web3 and the open-source community built around the Ceramic protocol.</p></li></ul><p>If you have any suggestions on making this tutorial better, opinions or want to chat. Feel free to reach out via Twitter or Discord</p>]]></content:encoded>
            <author>zoz@newsletter.paragraph.com (0xZOZ)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/305ef3280bec599f2d4469e67b7e53adf429617dded31b2bf752e1ada3f3caea.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Aptos: Build a Faucet Tutorial]]></title>
            <link>https://paragraph.com/@zoz/aptos-build-a-faucet-tutorial</link>
            <guid>fC1mQrGvimUEiuCmHJM3</guid>
            <pubDate>Fri, 01 Apr 2022 04:49:47 GMT</pubDate>
            <description><![CDATA[Backstory: Meta(formerly Facebook) spent many years trying to build for the web3/Blockchain space. After long regulatory battles Meta ultimately gave up for the time being but what was left was a beautifully designed system known as Diem and a safe, easy-to-use language built specifically for blockchain - Move.Enter AptosMany of the engineers that help build the codebase did not just want to leave the work that was done and after Meta announced it would no longer be going ahead with the proje...]]></description>
            <content:encoded><![CDATA[<p><strong>Backstory:</strong> Meta(formerly Facebook) spent many years trying to build for the web3/Blockchain space. After long regulatory battles Meta ultimately gave up for the time being but what was left was a beautifully designed system known as Diem and a safe, easy-to-use language built specifically for blockchain - Move.</p><h3 id="h-enter-aptos" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Enter Aptos</h3><p>Many of the engineers that help build the codebase did not just want to leave the work that was done and after Meta <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.usnews.com/news/business/articles/2022-02-01/the-end-facebook-backed-digital-currency-diem-sold-to-bank#:~:text=A%20once%2Dambitious%20but%20now,bank%20holding%20company%20Silvergate%20Capital.&amp;text=By%20Associated%20Press-,Feb.,2022%2C%20at%204%3A09%20p.m.">announced</a> it would no longer be going ahead with the project, the builders decided to build their own network. In their words:</p><blockquote><p>A Layer 1 for everyone - Building the safest and most scalable Layer 1 blockchain.</p></blockquote><p>The ecosystem is growing fast with multiple projects building using the Diem/Move codebase. This includes:</p><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://0l.network/">0L(Open Libra)</a> - A unique economic experiment not backed by VC’s and instead built by a community of dedicated individuals.</p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://mystenlabs.com/">Mysten Labs</a> - Other previous Meta employees who have built <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://sui.io/">Sui</a> and are bringing Move, along with Technologies like <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.researchgate.net/publication/351868768_Narwhal_and_Tusk_A_DAG-based_Mempool_and_Efficient_BFT_Consensus">Narwhal and Tusk</a> to projects like <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://celo.org/">Celo</a> and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.sommelier.finance/">Sommelier</a></p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://pontem.network/">Pontem</a> - The Experimentation Platform for Diem Blockchain Technology built around the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://polkadot.network/">Polkadot</a> network</p></li></ul><h2 id="h-introduction" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Introduction</h2><p>This article intends to show how easy it is to build a client-facing React project using the Aptos API. This is by no means an end product and development is happening daily that will likely make this obsolete very quickly. If this helps at least a few people get exposed to this new ecosystem and project it served its purpose. Subsequent articles will follow the journey and dive deeper into writing and using the Move language to build applications.</p><blockquote><p>Repo: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/0xzoz/aptos-faucet">Aptos Faucet</a></p></blockquote><h2 id="h-creating-the-react-app" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Creating the React App</h2><pre data-type="codeBlock" text="npx create-react-app aptos-faucet --template typescript
"><code>npx create<span class="hljs-operator">-</span>react<span class="hljs-operator">-</span>app aptos<span class="hljs-operator">-</span>faucet <span class="hljs-operator">-</span><span class="hljs-operator">-</span>template typescript
</code></pre><h3 id="h-folder-structure" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Folder Structure</h3><pre data-type="codeBlock" text="my-app/
  README.md
  node_modules/
  package.json
  public/
    index.html
    favicon.ico
  src/
    App.css
    App.js
    App.test.js
    index.css
    index.js
    logo.svg
"><code>my<span class="hljs-operator">-</span>app<span class="hljs-operator">/</span>
  README.md
  node_modules<span class="hljs-operator">/</span>
  package.json
  <span class="hljs-keyword">public</span><span class="hljs-operator">/</span>
    index.html
    favicon.ico
  src<span class="hljs-operator">/</span>
    App.css
    App.js
    App.test.js
    index.css
    index.js
    logo.svg
</code></pre><p>This will build a base React App we can work with. There are essentially minimal changes that need to be made so we will break them up into three categories:</p><ul><li><p>UI changes</p></li><li><p>UI logic</p></li><li><p>Connecting to the Aptos API and handling the connections in the client</p></li></ul><h2 id="h-ui-changes" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">UI Changes</h2><p>Most of these changes can be done in the App.tsx file in the projects /src folder</p><p><strong>Before</strong></p><pre data-type="codeBlock" text="import React from &apos;react&apos;;
import logo from &apos;./logo.svg&apos;;
import &apos;./App.css&apos;;

function App() {
  return (
    &lt;div className=&quot;App&quot;&gt;
      &lt;header className=&quot;App-header&quot;&gt;
        &lt;img src={logo} className=&quot;App-logo&quot; alt=&quot;logo&quot; /&gt;
        &lt;p&gt;
          Edit &lt;code&gt;src/App.tsx&lt;/code&gt; and save to reload.
        &lt;/p&gt;
        &lt;a
          className=&quot;App-link&quot;
          href=&quot;https://reactjs.org&quot;
          target=&quot;_blank&quot;
          rel=&quot;noopener noreferrer&quot;
        &gt;
          Learn React
        &lt;/a&gt;
      &lt;/header&gt;
    &lt;/div&gt;
  );
}

export default App;
"><code><span class="hljs-keyword">import</span> <span class="hljs-title">React</span> <span class="hljs-title"><span class="hljs-keyword">from</span></span> <span class="hljs-string">'react'</span>;
<span class="hljs-keyword">import</span> <span class="hljs-title">logo</span> <span class="hljs-title"><span class="hljs-keyword">from</span></span> <span class="hljs-string">'./logo.svg'</span>;
<span class="hljs-keyword">import</span> <span class="hljs-string">'./App.css'</span>;

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">App</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">return</span> (
    <span class="hljs-operator">&#x3C;</span>div className<span class="hljs-operator">=</span><span class="hljs-string">"App"</span><span class="hljs-operator">></span>
      <span class="hljs-operator">&#x3C;</span>header className<span class="hljs-operator">=</span><span class="hljs-string">"App-header"</span><span class="hljs-operator">></span>
        <span class="hljs-operator">&#x3C;</span>img src<span class="hljs-operator">=</span>{logo} className<span class="hljs-operator">=</span><span class="hljs-string">"App-logo"</span> alt<span class="hljs-operator">=</span><span class="hljs-string">"logo"</span> <span class="hljs-operator">/</span><span class="hljs-operator">></span>
        <span class="hljs-operator">&#x3C;</span>p<span class="hljs-operator">></span>
          Edit <span class="hljs-operator">&#x3C;</span>code<span class="hljs-operator">></span>src<span class="hljs-operator">/</span>App.tsx&#x3C;<span class="hljs-operator">/</span>code<span class="hljs-operator">></span> and save to reload.
        &#x3C;<span class="hljs-operator">/</span>p<span class="hljs-operator">></span>
        <span class="hljs-operator">&#x3C;</span>a
          className<span class="hljs-operator">=</span><span class="hljs-string">"App-link"</span>
          href<span class="hljs-operator">=</span><span class="hljs-string">"https://reactjs.org"</span>
          target<span class="hljs-operator">=</span><span class="hljs-string">"_blank"</span>
          rel<span class="hljs-operator">=</span><span class="hljs-string">"noopener noreferrer"</span>
        <span class="hljs-operator">></span>
          Learn React
        <span class="hljs-operator">&#x3C;</span><span class="hljs-operator">/</span>a<span class="hljs-operator">></span>
      <span class="hljs-operator">&#x3C;</span><span class="hljs-operator">/</span>header<span class="hljs-operator">></span>
    <span class="hljs-operator">&#x3C;</span><span class="hljs-operator">/</span>div<span class="hljs-operator">></span>
  );
}

export default App;
</code></pre><ol><li><p>Change the logo to a nice faucet design and remove css</p><ol><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/0xzoz/aptos-faucet/blob/main/src/logo.jpg">Change logo.jpg file in /src</a></p></li><li><p>Remove CSS - <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/0xzoz/aptos-faucet/blob/bc264adeb9183ebae75da132a45a8addbf4ee6b6/src/App.css#L56-L63">here</a> and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/0xzoz/aptos-faucet/blob/bc264adeb9183ebae75da132a45a8addbf4ee6b6/src/App.css#L80">here</a></p></li></ol></li><li><p>Import modules for UI and Aptos logo</p><ol><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/0xzoz/aptos-faucet/blob/bc264adeb9183ebae75da132a45a8addbf4ee6b6/src/App.tsx#L4-L11">Import Modules</a></p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/0xzoz/aptos-faucet/blob/main/src/aptos_logo.png">Add a new aptos_logo.png in /src</a></p></li></ol></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/0xzoz/aptos-faucet/blob/6d0e66dea534219bf9b204625da286559c2e1426/src/App.tsx#L141-L198">Add additional UI code</a></p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/0xzoz/aptos-faucet/blob/bc264adeb9183ebae75da132a45a8addbf4ee6b6/src/App.css#L11-L53">Adjust CSS</a></p></li></ol><h2 id="h-ui-logic" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">UI Logic</h2><p>We then need to make sure the appropriate logic is in place to handle the buttons and modals associated with the UI changes.</p><ol><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/0xzoz/aptos-faucet/blob/6d0e66dea534219bf9b204625da286559c2e1426/src/App.tsx#L36-L42">Add UI state</a></p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/0xzoz/aptos-faucet/blob/6d0e66dea534219bf9b204625da286559c2e1426/src/App.tsx#L54-L68">Add Modal functions</a></p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/0xzoz/aptos-faucet/blob/6d0e66dea534219bf9b204625da286559c2e1426/src/App.tsx#L70-L87">Add Warning functions</a></p></li></ol><h2 id="h-connecting-to-the-aptos-api" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Connecting to the Aptos API</h2><p>The code and examples mostly come from the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://aptos.dev/">Aptos tutorials</a>.</p><ol><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/0xzoz/aptos-faucet/blob/main/src/ts/accounts.ts">Add an accounts.ts file in a new /src/ts folder to use to interact with the Aptos API</a></p></li><li><p>Connect this with the UI</p><ol><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/0xzoz/aptos-faucet/blob/28a8b72f8cfe1ec44db306ecea96f86e4c326dfd/src/App.tsx#L15">Import the accounts.ts functions</a></p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/0xzoz/aptos-faucet/blob/bc264adeb9183ebae75da132a45a8addbf4ee6b6/src/App.tsx#L17-L18">Add the Aptos endpoints</a></p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/0xzoz/aptos-faucet/blob/6d0e66dea534219bf9b204625da286559c2e1426/src/App.tsx#L90-L98">Create Account function</a></p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/0xzoz/aptos-faucet/blob/6d0e66dea534219bf9b204625da286559c2e1426/src/App.tsx#L100-L132">Add Funds function</a></p></li></ol></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/0xzoz/aptos-faucet/blob/6d0e66dea534219bf9b204625da286559c2e1426/src/App.tsx#L43-L52">Add wallet state</a></p></li></ol><h2 id="h-using-your-new-faucet-application" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Using Your New Faucet Application</h2><h3 id="h-create-a-new-account" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Create a New Account</h3><p>You can create a new account by clicking the ‘CREATE ACCOUNT’ button. This will provide you with an address, public key, auth key and private key.</p><blockquote><p>Note: The account will not be stored on the Aptos blockchain untill it recieves funds and interacts with it.</p></blockquote><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/51a86ecc9145906f429e9bf3eb1d99706010c2de13dc724bba53b1c53cd5fa0b.png" alt="New Account - be sure to save this somewhere safe" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">New Account - be sure to save this somewhere safe</figcaption></figure><h3 id="h-fund-your-new-account" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Fund your new Account</h3><p>You can now fund this new Account by clicking ‘FUND ACCOUNT’. The last created account will be used by default but you can change it to your address of choice if needed. Enter the amount and click ‘GET FUNDS’. Voila you now have an account on the Aptos Devnet.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/6d2f43bae010666ad9feceade2b0c8de460c151f8c072cc1688c6bb14beca362.png" alt="Fund your new Account" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Fund your new Account</figcaption></figure><p>Hopefully this gives you the push you need to get involved at dive deeper. You can follow my journey as I post about my journey becoming a psuedononymous developer on <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://mirror.xyz/zoz.eth">Mirror</a> or <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/0xZOZ">Twitter</a>.</p>]]></content:encoded>
            <author>zoz@newsletter.paragraph.com (0xZOZ)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/4c8fd1e5f73ee4b6061192dcfdc8b1f9e1a48d5cdac28594a6b53d05277d9320.png" length="0" type="image/png"/>
        </item>
    </channel>
</rss>